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