83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package simcardquery
|
|
|
|
import (
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/xuri/excelize/v2"
|
|
)
|
|
|
|
// buildRows 造 n 行「卡基础信息」级别的数据:22 列、字段长短接近真实。
|
|
func buildRows(n int) [][]interface{} {
|
|
rows := make([][]interface{}, n)
|
|
for i := 0; i < n; i++ {
|
|
id := strconv.Itoa(8986000000000000000 + i)
|
|
rows[i] = []interface{}{
|
|
id,
|
|
"186" + strconv.Itoa(10000000+i),
|
|
"46000" + strconv.Itoa(100000000+i),
|
|
"86000000000000" + strconv.Itoa(i%100),
|
|
float64(i % 5000),
|
|
float64(5000 - i%5000),
|
|
10240.0,
|
|
2,
|
|
4,
|
|
"中国移动",
|
|
"2026-01-01 00:00:00",
|
|
"2025-12-01 00:00:00",
|
|
"2027-12-31 23:59:59",
|
|
"OUT20260101",
|
|
"IN20251201",
|
|
"标准套餐A",
|
|
"示例企业",
|
|
"备注内容示例",
|
|
"",
|
|
"成功",
|
|
"",
|
|
"",
|
|
}
|
|
}
|
|
return rows
|
|
}
|
|
|
|
// TestExportWriteCost 量不同行数下「写 Excel + 生成文件」的真实耗时与体积。
|
|
// 用来判断 20000 这个上限是否偏离实际能力,而不是拍脑袋。
|
|
func TestExportWriteCost(t *testing.T) {
|
|
for _, n := range []int{20000, 50000, 100000} {
|
|
rows := buildRows(n)
|
|
start := time.Now()
|
|
|
|
f := excelize.NewFile()
|
|
sheet := f.GetSheetName(0)
|
|
stream, err := f.NewStreamWriter(sheet)
|
|
if err != nil {
|
|
t.Fatalf("new stream writer: %v", err)
|
|
}
|
|
header := make([]interface{}, 22)
|
|
for i := range header {
|
|
header[i] = "列" + strconv.Itoa(i)
|
|
}
|
|
if err = stream.SetRow("A1", header); err != nil {
|
|
t.Fatalf("write header: %v", err)
|
|
}
|
|
for i, row := range rows {
|
|
cell, _ := excelize.CoordinatesToCellName(1, i+2)
|
|
if err = stream.SetRow(cell, row); err != nil {
|
|
t.Fatalf("write row %d: %v", i, err)
|
|
}
|
|
}
|
|
if err = stream.Flush(); err != nil {
|
|
t.Fatalf("flush: %v", err)
|
|
}
|
|
buf, err := f.WriteToBuffer()
|
|
if err != nil {
|
|
t.Fatalf("write to buffer: %v", err)
|
|
}
|
|
_ = f.Close()
|
|
|
|
elapsed := time.Since(start)
|
|
t.Logf("rows=%6d write=%8.2fs size=%6.1fMB", n, elapsed.Seconds(), float64(buf.Len())/(1<<20))
|
|
}
|
|
}
|