excelize/v2是当前go生态处理.xlsx最可靠的选择,但高度依赖文件合规性、写入方式与类型处理:不支持非标格式,中文需utf-8,大批量须用setsheetrow或streamwriter,读公式/日期须判类型并手动计算。

直接说结论:用 excelize/v2 是当前 Go 生态中处理 .xlsx 最可靠的选择,但它的行为高度依赖文件格式合规性、写入方式和类型处理逻辑——用错一个函数或参数,轻则中文乱码、公式不生效,重则文件损坏、OOM 崩溃。
打开 .xlsx 报 “unsupported file format” 怎么办
这不是代码问题,是文件本身不标准。Excelize 只认严格符合 OOXML 规范的 .xlsx,不接受 WPS「兼容模式」、手动改后缀的 .xls、带宏的 .xlsm,甚至 LibreOffice 默认保存的某些变体也会被拒。
- 先用
unzip -l your.xlsx检查内部结构:必须含[Content_Types].xml和xl/workbook.xml,缺一不可 - 用
file your.xlsx(Linux/macOS)确认开头是PK\x03\x04,且文件非空 - 若确认是 WPS 或旧版 Excel 导出,务必用 Excel for Mac / Windows 或 LibreOffice「另存为 → Excel 工作簿(*.xlsx)」,别选「Excel 97-2003」或「兼容模式」
- 遇到
.xls、.csv、加密文件,得先转格式;.xlsm即使禁用宏也不支持,别硬试
f.GetCellValue 返回空或错值?先看单元格类型
GetCellValue 只返回“渲染后”的文本,对公式、日期、布尔值做隐式转换,极易误判。比如 Excel 里输入 2024/5/20,实际存的是浮点数 45432,若单元格格式被设为“常规”,它就真返回 "45432"。
- 优先用
f.GetCellType("Sheet1", "A1")判断类型:excelize.CellTypeFormula或excelize.CellTypeDate - 日期值务必用
f.GetCellFloat("Sheet1", "A1")拿原始浮点数,再传给time.DateFromExcel()转时间 - 公式结果为空?检查是否启用了公式计算:
f.Calculation.On = true并调用f.Calculate(),否则默认只读静态值
写入大量数据卡顿、内存暴涨
Excelize 默认把整个工作簿缓存在内存里,每调一次 f.SetCellValue() 都会更新内部结构树。10 万行 × 10 列反复调用,性能会断崖下跌。
- 批量写用
f.SetSheetRow()或f.SetSheetCol(),传入[]interface{}切片比单个单元格快 5–10 倍 - 导出万行报表时,配合
f.WriteTo(io.Writer)直接写入响应流(如http.ResponseWriter),避免全量驻留内存 - 不要在循环里反复调用
f.NewStyle()创建样式,复用 styleID;合并单元格前确认目标区域未被其他合并占用
中文显示 ??? 或方块,SetCellValue 没效果
不是字体问题,大概率是编码或单元格格式没设对。Excel 本身不存“字体”,只存“格式代码”和“字符串原始字节”,Excelize 默认按 UTF-8 解析,但若模板 Excel 是用 Excel 2003 保存的旧格式(或从 Windows 记事本另存为 ANSI),就可能混入 GBK 字节流。
- 确认源数据是合法 UTF-8:
utf8.ValidString(s)返回true再传给SetCellValue - 从 CSV/数据库读取后别盲目
string([]byte{}),尤其注意sql.Scan对 BLOB 字段返回的是[]byte,需显式转string - 写入前显式设置单元格格式:
f.SetCellStyle("Sheet1", "A1", "A1", styleID),其中styleID来自f.NewStyle(&excelize.Style{Font: &excelize.Font{Family: "微软雅黑"}}) - 避免用
f.SetRowHeight粗暴调高行高来“撑开”中文——这会让自动换行失效;应改用f.SetColWidth+f.SetCellStyle中开启WrapText: true
最常被忽略的一点:Excelize 不处理渲染、不执行公式计算、不解析 VBA、不修复非法 XML 结构——它只是忠实生成/读取 OOXML。所有“看起来不对”的表现,几乎都源于上游文件不合规、类型判断缺失或批量操作没用对函数。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











