Golang - 解决 excelize 流式读调用 io.ReadAll 的问题
2025-02-22 16:12:44
最近在给业务侧做二开包,功能:Excel 的读和写,要求,内存占用极低。经过调研发现 excelize star 最多,且仍在维护,所以底座选用这个库,但在压测时发现该库并不能真正的流式读,因为里面用到了 io.ReadAll ,进一步阅读源码发现,其实没必要 io.ReadAll,于是有了此文。
excelize 存在的问题
excelize 读取 Excel 的代码大致如下:
|
|
其中 excelize.OpenFile 的代码如下:
|
|
这串代码并无问题,但 OpenReader 就有问题了:
|
|
这里 b, err := io.ReadAll(r)
会导致将所有数据都加载到内存,从而使流式读取失去意义。且 b 仅用于以下代码:
这串代码完全可以使用下面代码替代:
zr, err := zip.OpenReader(name)
然后调整代码:
file, sheetCount, err := f.ReadZipReader(zr)
调整为下面代码即可:
file, sheetCount, err := f.ReadZipReader(&zr.Reader)
至于解密的代码:
经确认,应该是解密加密的 Excel 2003,oleIdentifier 用于判断文件是否为 cfb 格式,这里 cfb 格式指的是 Excel 2003;
该问题已提交给官方:https://github.com/qax-os/excelize/issues/2086
我的解决办法
我们公司内部有维护 goproxy,和 sumdb,改了代码并提交到公司 gitlab 即可解决问题,我新增了如下方法:
|
|
最后更新于