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
|
|||
|
}
|