ifms_go/test/excel_test.go
2025-06-10 17:50:46 +08:00

283 lines
7.4 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 test
import (
"context"
"fmt"
"github.com/xuri/excelize/v2"
"ifms/pkg/convert"
"ifms/pkg/oss"
"log"
"os"
"reflect"
"testing"
"time"
)
func TestExcel(t *testing.T) {
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// Upload a new sheet.
index, err := f.NewSheet("Sheet2")
if err != nil {
fmt.Println(err)
return
}
// Set value of a cell.
f.SetCellValue("Sheet2", "A2", "Hello world.")
f.SetCellValue("Sheet1", "B2", 100)
// Set active sheet of the workbook.
f.SetActiveSheet(index)
// Save spreadsheet by the given path.
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
func TestExcel2(t *testing.T) {
// 模拟查询出来的列表数据
listData := [][]string{
{"姓名", "年龄", "邮箱"}, // 表头
{"张三", "25", "zhangsan@example.com"},
{"李四", "30", "lisi@example.com"},
{"王五", "28", "wangwu@example.com"},
}
// 创建一个新的 Excel 文件
f := excelize.NewFile()
// 创建一个工作表
sheetName := "Sheet1"
index, _ := f.NewSheet(sheetName)
f.SetActiveSheet(index)
// 将数据写入 Excel
for rowIdx, rowData := range listData {
for colIdx, cellValue := range rowData {
// 将列索引转换为字母,例如 0 -> 'A', 1 -> 'B', ...
colLetter := string(rune('A' + colIdx))
// 设置单元格的值
cellName := fmt.Sprintf("%s%d", colLetter, rowIdx+1)
f.SetCellValue(sheetName, cellName, cellValue)
}
}
// 保存 Excel 文件
if err := f.SaveAs("output.xlsx"); err != nil {
fmt.Println("Error saving Excel file:", err)
}
fmt.Println("Excel file created successfully.")
}
// 定义一个结构体,并在字段中添加 excel 标签
type Person struct {
Name string `excel:"姓名"`
Age int `excel:"年龄"`
Email string `excel:"邮箱"`
}
func TestExcel3(t *testing.T) {
// 创建一个包含数据的结构体切片
people := []Person{
{"张三", 25, "zhangsan@example.com"},
{"李四", 30, "lisi@example.com"},
{"王五", 28, "wangwu@example.com"},
}
// 创建一个新的 Excel 文件
f := excelize.NewFile()
sheetName := "Sheet1"
index, _ := f.NewSheet(sheetName)
f.SetActiveSheet(index)
// 获取结构体的类型
structType := reflect.TypeOf(people[0])
// 写入表头
for colIdx := 0; colIdx < structType.NumField(); colIdx++ {
field := structType.Field(colIdx)
colLetter := string(rune('A' + colIdx))
err := f.SetCellValue(sheetName, fmt.Sprintf("%s1", colLetter), field.Tag.Get("excel"))
if err != nil {
fmt.Println("Error setting Excel header:", err)
return
}
}
// 写入数据行
for rowIdx, person := range people {
rowNum := rowIdx + 2 // 从第二行开始写入数据(第一行是表头)
for colIdx := 0; colIdx < structType.NumField(); colIdx++ {
colLetter := string(rune('A' + colIdx))
fieldValue := reflect.ValueOf(person).Field(colIdx).Interface()
err := f.SetCellValue(sheetName, fmt.Sprintf("%s%d", colLetter, rowNum), fieldValue)
if err != nil {
fmt.Println("Error setting Excel header:", err)
return
}
}
}
// 保存 Excel 文件
if err := f.SaveAs("output_reflect.xlsx"); err != nil {
fmt.Println("Error saving Excel file:", err)
}
fmt.Println("Excel file created successfully.")
ctx := context.Background()
file, err := os.Open("/Users/shaolingjin/source/qk/ifms/test/output_reflect.xlsx")
if err != nil {
fmt.Println("Failed to open file:", err)
return
}
defer file.Close()
//获取文件大小
fileInfo, err := file.Stat()
if err != nil {
fmt.Println("Failed to get file size:", err)
return
}
fileSize := fileInfo.Size()
name := oss.FormatObjectName("test", "output_reflect.xlsx")
result, err := oss.Ins.PutObject(ctx, "qkkj-ifms-test", name, file, fileSize, oss.PutObjectOptions{
ContentType: "text/plain",
})
if err != nil {
fmt.Println("Failed to upload object:", err)
return
}
fmt.Println(result)
}
// 定义一个结构体,并在字段中添加 excel 和 excel_type 标签
type P struct {
Name string `excel:"姓名" excel_type:"string"`
Age int `excel:"年龄" excel_type:"number"`
Email string `excel:"邮箱" excel_type:"string"`
Birth time.Time `excel:"出生日期" excel_type:"date"`
}
func TestExcel4(t *testing.T) {
// 创建一个包含数据的结构体切片
people := []P{
{"张三", 25, "zhangsan@example.com", time.Now()},
{"李四", 30, "lisi@example.com", time.Now()},
{"王五", 28, "wangwu@example.com", time.Now()},
}
// 创建一个新的 Excel 文件
f := excelize.NewFile()
sheetName := "Sheet1"
index, _ := f.NewSheet(sheetName)
f.SetActiveSheet(index)
// 获取结构体的类型
structType := reflect.TypeOf(people[0])
// 写入表头
for colIdx := 0; colIdx < structType.NumField(); colIdx++ {
field := structType.Field(colIdx)
colLetter := string(rune('A' + colIdx))
err := f.SetCellValue(sheetName, fmt.Sprintf("%s1", colLetter), field.Tag.Get("excel"))
if err != nil {
fmt.Println("Error setting Excel header:", err)
return
}
}
// 写入数据行
for rowIdx, person := range people {
rowNum := rowIdx + 2 // 从第二行开始写入数据(第一行是表头)
for colIdx := 0; colIdx < structType.NumField(); colIdx++ {
colLetter := string(rune('A' + colIdx))
fieldValue := reflect.ValueOf(person).Field(colIdx).Interface()
fieldType := structType.Field(colIdx).Tag.Get("excel_type")
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", colLetter, rowNum), fieldValue)
// 根据 excel_type 标签设置单元格格式
switch fieldType {
case "number":
f.SetCellInt(sheetName, fmt.Sprintf("%s%d", colLetter, rowNum), int64(fieldValue.(int)))
case "date":
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", colLetter, rowNum), fieldValue.(string))
}
}
}
// 设置日期格式
style, _ := f.NewStyle(&excelize.Style{
NumFmt: 51,
})
for _, pe := range people {
rowNum := pe.Age + 2
colLetter := string(rune('D' + 0)) // 假设日期列是第四列D
f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", colLetter, rowNum), fmt.Sprintf("%s%d", colLetter, rowNum), style)
}
// 保存 Excel 文件
if err := f.SaveAs("output_123.xlsx"); err != nil {
fmt.Println("Error saving Excel file:", err)
}
fmt.Println("Excel file created successfully.")
}
func TestExcelInput(t *testing.T) {
// 打开 Excel 文件
f, err := excelize.OpenFile("output_123.xlsx")
if err != nil {
log.Fatalf("打开 Excel 文件失败: %v", err)
}
// 获取所有 sheet 名称
sheetNames := f.GetSheetMap()
for _, sheetName := range sheetNames {
// 获取指定 sheet 的行数和列数
rows, err := f.GetRows(sheetName)
if err != nil {
log.Fatalf("获取 sheet 数据失败: %v", err)
}
// 跳过表头行
if len(rows) > 0 {
rows = rows[1:]
}
// 遍历每一行数据
for _, row := range rows {
// 解析每一行数据到 Factory 结构体
if row[0] == "" {
continue
}
var p P
// 这里根据实际 Excel 表格的列顺序和数据类型进行解析
// 假设 Excel 表格的第一列是 ID第二列是 TenantId 等
//if id, err := strconv.ParseInt(row[0], 10, 64); err == nil {
// p.ID = id
//}
p.Name = row[0]
p.Age = convert.ToInt(row[1])
p.Email = row[2]
// 处理时间字段
if dt, err := time.Parse(time.DateOnly, row[3]); err == nil {
p.Birth = dt
} else {
println("时间解析失败", err)
}
// 打印解析后的数据
fmt.Printf("P: %+v\n", p)
}
}
}