| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- package core
- import (
- "fmt"
- "github.com/xuri/excelize/v2"
- "os"
- "path/filepath"
- "reflect"
- "time"
- )
- // 获取文件名
- func GetCsvFileName(dir string) string {
- filename := fmt.Sprintf("%s_%d.xlsx", dir, time.Now().Unix())
- return filename
- }
- // 获取csv文件的路径
- func GetCsvPath(filename string, dir string) string {
- execPath, err := os.Executable()
- if err != nil {
- return ""
- }
- // 获取可执行文件目录并构造目标路径
- baseDir := filepath.Dir(execPath)
- excelPath := filepath.Join(baseDir, "uploads", dir, filename)
- // 创建目录(如果不存在)
- if err := os.MkdirAll(filepath.Dir(excelPath), os.ModePerm); err != nil {
- return ""
- }
- return excelPath
- }
- // 导出表格
- func ExportExcel[T any](headers []string, data []T, savePath string) (string, error) {
- if savePath == "" {
- return "", fmt.Errorf("获取文件路径失败")
- }
- f := excelize.NewFile()
- var err error
- sheetName := "Sheet1"
- err = f.SetSheetName("Sheet1", sheetName)
- if err != nil {
- return "", err
- }
- // 写入表头
- for i, header := range headers {
- cell, _ := excelize.CoordinatesToCellName(i+1, 1)
- err = f.SetCellValue(sheetName, cell, header)
- if err != nil {
- return "", err
- }
- }
- // 使用反射获取结构体字段值
- for rowIndex, row := range data {
- rowValue := reflect.ValueOf(row)
- for colIndex := 0; colIndex < rowValue.NumField(); colIndex++ {
- cell, _ := excelize.CoordinatesToCellName(colIndex+1, rowIndex+2)
- field := rowValue.Field(colIndex)
- if field.CanInterface() {
- err = f.SetCellValue(sheetName, cell, field.Interface())
- if err != nil {
- return "", err
- }
- }
- }
- }
- // 保存 Excel 文件
- if err := f.SaveAs(savePath); err != nil {
- return "", fmt.Errorf("保存文件失败: %v", err)
- }
- return savePath, nil
- }
|