91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
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
|
||
}
|