Go使用tealeg/xlsx解析字节数组xlsx遇空单元格报数组越界问题
Go解析xlsx空白单元格触发数组越界问题解决方案
问题说明
使用github.com/tealeg/xlsx包调用xlsx.OpenBinary(b []byte)解析[]byte类型xlsx文件时,抛出错误index out of range [134] with length 0:
- 触发条件:文件内存在空白单元格,尤其是
notes列出现未填充的空单元格时必现 - 临时处理方式:手动填充所有空白单元格后可正常解析,但操作成本极高
- 相关异常文件与正常文件示例:


针对tealeg/xlsx的修复方案
你查阅到的v3版本ValueOnly配置方案完全可行,该问题是tealeg/xlsx v1、v2旧版本的已知bug,旧版本无对应配置项可修复,必须先将依赖升级到v3版本:
- 升级依赖
go get github.com/tealeg/xlsx/v3
- 替换原有的
OpenBinary调用为带ValueOnly选项的方法,该选项会自动跳过无实际值的空白单元格,避免数组越界:
xlFile, err := xlsx.OpenBinaryWithOptions(b, xlsx.ValueOnly()) if err != nil { // 自行处理错误 } // 后续按原有逻辑遍历sheet、行、单元格即可
更稳定的替代库推荐
如果不想继续使用tealeg/xlsx,可替换为目前Go生态维护活跃度最高、格式兼容性最好的Excel处理库github.com/xuri/excelize/v2,该库默认对空白单元格、稀疏行的处理逻辑完善,不会触发这类越界panic,同样支持从[]byte解析文件:
- 安装依赖
go get github.com/xuri/excelize/v2
- 解析示例
import ( "bytes" "github.com/xuri/excelize/v2" ) // 从[]byte解析xlsx f, err := excelize.OpenReader(bytes.NewReader(b)) if err != nil { // 错误处理 } defer f.Close() // 读取目标工作表所有行 rows, err := f.GetRows("Sheet1") // 替换为实际的sheet名 if err != nil { // 错误处理 } // 遍历内容,空白单元格会返回空字符串,自行判断跳过即可 for rowIdx, row := range rows { for colIdx, cellVal := range row { if cellVal == "" { continue // 跳过空单元格 } // 处理非空单元格逻辑 } }
excelize对各类非常规xlsx格式的兼容性远优于tealeg/xlsx,除基础读取外还支持写入、样式调整、公式计算等能力,适合长期使用。
内容的提问来源于stack exchange,提问作者Pavan Vasan
相关产品推荐
相关产品推荐

