ifms_go/pkg/util/export.go

91 lines
2.5 KiB
Go
Raw Normal View History

2025-06-14 09:33:42 +08:00
package util
import (
"context"
"ifms/internal/config"
"ifms/pkg/oss"
"os"
"github.com/xuri/excelize/v2"
)
// ExportDataToOSS 生成带标题的 Excel 文件,上传到 OSS并删除本地文件返回 OSS 文件访问 URL。
// title: Excel 表头(第一行)
// data: Excel 数据内容(每一行是一个[]string
// localFilePath: 本地临时文件路径
// ossObjectName: OSS 对象名(含路径)
// 返回 OSS 文件访问 URL 或错误
func ExportDataToOSS(ctx context.Context, title []string, data [][]string, localFilePath, ossObjectName string) (string, error) {
// 1. 生成Excel带标题
if err := GenerateExcelFile(title, data, localFilePath); err != nil {
return "", err
}
// 2. 上传并删除本地文件
url, err := UploadOss(ctx, localFilePath, ossObjectName, true)
if err != nil {
return "", err
}
return url, nil
}
// GenerateExcelFile 生成带标题的 Excel 文件并保存到本地。
// title: Excel 表头(第一行)
// data: Excel 数据内容(每一行是一个[]string
// filePath: 本地保存路径
// 返回错误信息
func GenerateExcelFile(title []string, data [][]string, filePath string) error {
f := excelize.NewFile()
sheet := "Sheet1"
// 写入标题
for j, cell := range title {
cellName, _ := excelize.CoordinatesToCellName(j+1, 1)
f.SetCellValue(sheet, cellName, cell)
}
// 写入数据
for i, row := range data {
for j, cell := range row {
cellName, _ := excelize.CoordinatesToCellName(j+1, i+2) // 数据从第2行开始
f.SetCellValue(sheet, cellName, cell)
}
}
if err := f.SaveAs(filePath); err != nil {
return err
}
return nil
}
// UploadAndDeleteLocalFile 上传本地文件到 OSS上传成功后删除本地文件。
// filePath: 本地文件路径
// objectName: OSS 对象名(含路径)
// deleteLocalFile: 是否删除本地文件
// 返回 OSS 文件访问 URL 或错误
func UploadOss(ctx context.Context, filePath, objectName string, deleteLocalFile bool) (string, error) {
file, err := os.Open(filePath)
if err != nil {
return "", err
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
return "", err
}
fileSize := fileInfo.Size()
ossResult, err := oss.Ins.PutObject(ctx, config.C.AliyunOSS.Bucket, objectName, file, fileSize, oss.PutObjectOptions{
UserMetadata: map[string]string{"name": fileInfo.Name()},
})
if err != nil {
return "", err
}
// 上传成功后删除本地文件
if deleteLocalFile {
if err := os.Remove(filePath); err != nil {
return "", err
}
}
return ossResult.URL, nil
}