excelize是go生态读写.xlsx的实际首选,唯一成熟支持万行报表、中文不乱码、样式不丢、内存稳定的方案;tealeg/xlsx已停更,存在日期误判、合并单元格panic、大文件oom等架构缺陷。

excelize 是当前 Go 生态中读取 Excel 的实际首选,不是“之一”,而是生产环境里能扛住万行报表、中文不乱码、样式不丢、不崩内存的唯一成熟选项。别被旧教程带偏——tealeg/xlsx 已停更多年,读日期返回 "45432"、合并单元格直接 panic、写入 5 万行就 OOM,这些不是配置问题,是架构缺陷。
GetCellValue 返回空字符串?先看 CellType 和原始值类型
很多人一看到 f.GetCellValue("Sheet1", "A1") 返回空,就以为数据丢了,其实 Excel 单元格存的从来不是“字符串”,而是带类型的原始值:CellTypeFormula、CellTypeDate、CellTypeBool 或浮点数。它只在“渲染时”才转成文本。
- 用
f.GetCellType("Sheet1", "A1")先判断类型;如果是excelize.CellTypeDate,必须用f.GetCellFloat("Sheet1", "A1")拿到原始浮点数,再传给time.DateFromExcel() - 公式单元格(
CellTypeFormula)默认不计算,GetCellValue就是空——得手动启用:f.Calculation.On = true,且调用f.CalculateAll() - 布尔值单元格返回
"TRUE"/"FALSE"字符串,但若格式设为“数值”,就可能返回"1"或"0",不能靠字符串比较
中文显示方块或首列怪字符?检查 BOM 和字体样式
不是字体没设对,而是字节流本身有问题。excelize 默认按 UTF-8 解析,但如果你的源数据来自 Windows 记事本另存的 ANSI CSV,或模板 Excel 是老版本保存的,里面混了 GBK 字节或 UTF-8 BOM,就会出问题。
- 读取前做清洗:
bytes.TrimPrefix(data, []byte("\xef\xbb\xbf"))去掉 UTF-8 BOM - 写入中文前,用
utf8.ValidString(s)校验,非 true 就跳过或报错,别硬塞 - 设样式必须显式:
styleID, _ := f.NewStyle(&excelize.Style{Font: &excelize.Font{Family: "微软雅黑"}}),再调f.SetCellStyle("Sheet1", "A1", "A1", styleID) - 别用
f.SetRowHeight“撑高”行来显示中文——这会关掉自动换行;正确做法是f.SetColWidth配合样式里的WrapText: true
读大文件卡顿或 OOM?别用 GetRows,改用流式遍历
f.GetRows("Sheet1") 会把整张表所有单元格一次性加载进内存,10 万行 × 50 列 ≈ 500 万个字符串,Go runtime 很容易触发 GC 频繁或直接爆内存。这不是 bug,是设计使然。
- 换成逐行迭代:
rows, err := f.Rows("Sheet1")(注意:这是*Rows迭代器,不是[][]string) - 然后用
rows.Next()+rows.Columns()边读边处理,内存占用稳定在 KB 级 - 如果最终要导 HTTP 下载,直接
f.WriteTo(w http.ResponseWriter),全程零拷贝、不落地、不驻留内存 -
tealeg/xlsx没这个能力,它的sheet.Rows是个全量 slice,开箱即 OOM
为什么 NewFile 后 SetCellValue 没生效?Sheet 索引和激活状态要配对
新建文件后,f.NewSheet("Sheet1") 只是创建并返回一个索引(比如 2),但默认激活的是 Sheet1(索引 1)。你往 "Sheet1" 写数据,其实写进了系统自建的默认 Sheet,而你新建的那个 Sheet 反而空着。
- 务必调
f.SetActiveSheet(index)激活你新建的 Sheet - 或者写的时候明确指定 sheet 名:
f.SetCellValue("MyData", "A1", "hello"),前提是这个名字已存在(f.NewSheet("MyData")) - 读文件时也一样:
f.GetSheetName(0)才是第一个 Sheet 的真实名字,别硬写"Sheet1"——用户可能改过名 - 用
f.GetSheetMap()拿全量映射,比猜名字靠谱
excelize 的坑不在 API 多难记,而在 Excel 本身的数据模型和 Office Open XML 规范太隐蔽。很多“读不出来”“写不进去”“样式消失”,本质是没意识到 Excel 单元格=类型+原始值+格式代码+可选公式,四者缺一不可。跳过类型校验、绕过样式设置、硬编码 Sheet 名,短期能跑,上线后准炸。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











