ifms_go/pkg/util/export.go

91 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}