PHP 处理百万级 execl

305 天前
test123abc  test123abc
目前有个需求是导入两个百万级数据的 excel ,关联处理后导出新的 excel 。
我想先使用 box/spout 先读取,处理后导出,感觉会卡死,请问下大家有更好的办法吗。
2172 次点击
所在节点   程序员  程序员
18 条回复
lait123
lait123
305 天前
你可能需要 xlswriter: https://github.com/viest/php-ext-xlswriter
Mithril
Mithril
305 天前
都搞到 SQLite 里,查出来再写 Excel 或者 CSV 。

如果不算高频操作,你甚至都不用写代码,找个 GUI 的客户端录个自动化脚本都行。
mumbler
mumbler
305 天前
这种级别数据需要异步处理,excel 单表最多 100 万,超过会分到下一个 sheet
abccccabc
abccccabc
305 天前
导出的时候配合 layui-excel 试下,印象中说百万数据没问题,就看客户端的内存了。
sagaxu
sagaxu
305 天前
这种应该用 csv ,excel 不是好的选择
test123abc
test123abc
305 天前
@Mithril 老哥能细说下吗,没了解过这些
test123abc
test123abc
305 天前
@sagaxu 老哥能细说下吗😭
sagaxu
sagaxu
305 天前
@test123abc

excel 不适合的原因:

1. 最大行数 100 万行,百万级的数据量稍微再大点就超了
2. 超过 20 万行后,十分消耗资源,office 打开容易卡容易崩
3. 兼容性,csv 拥有最广泛的兼容性,各大 db 支持导出 csv ,excel 不如
4. 解析不方便,csv 按行处理不用库也很容易解析,excel 要先解压,有些库是一次性全部解压到内存。带公式带宏或者其它特殊信息的 excel 可能解析错误。
codebs
codebs
305 天前
xlswriter 可以满足你的需求,可以分表打包成压缩包下载
Mithril
Mithril
305 天前
@test123abc 简单地说,就是不要用 Excel 去处理包含大量数据的复杂查询。
它就是个电子表格,那就让它做电子表格该做的事。想要把它当数据库用,那就找个数据库软件。

SQLite 就是个数据库,单文件,性能也不差。比起其他数据库,能更简单的运行起来,也有更多的软件支持。所以建议你先把数据搞到数据库里,然后用 SQL 做关联查询,结果再写出来。

Microsoft Access 也行,你自己会用哪个就选哪个。
8355
8355
304 天前
chenshiforever
chenshiforever
304 天前
要我来写,最简单的就是 js 读出来,保存在数组里面,关联处理了,保存成文本文件,完事。
lulu00147
lulu00147
304 天前
大哥你先把 excel 转成 csv 用 rust 写的这个
https://github.com/zitsen/xlsx2csv.rs/releases
然后把 csv 导入 mysql
在查询导出就行了
pota
pota
304 天前
大量数据的输入输出都尽量使用 csv 来进行,一方面是可以按行处理,一方面也不需要导入库。还有超大量的数据处理最好用异步。
test123abc
test123abc
304 天前
@lulu00147
@pota 多 sheet 的 excel ,用的 tp 框架
jackerbauer
jackerbauer
304 天前
你可能需要 xlswriter: https://github.com/viest/php-ext-xlswriter
wxf666
wxf666
304 天前
为嘛不用 DuckDB 呢?它支持直接读取 xlsx 呀。。

速度上,之前的 1BRC (十亿行文本)挑战里,它能做到(普通人 SQL 写法)计算只用 5 秒钟。

或者,23 亿词 13GB 的英文维基文本,计算 TOP 1000 高频词,i5-8250U 轻薄本上,单线程下,只需 3 分钟,500MB 内存。。

如果你用 PHP 不能做到,更快更省资源,用用它也不错呀。。

反正我用 Java 一般写法,都要 6 分钟,2GB 内存。。

用 C++ 来写,也才勉强和它打平。。

test123abc
304 天前
是要在内部的后台给运营人员开一个处理 excel 的地方
现在使用 xlswriter ,将 excel 转为 csv ,然后将 csv 导入数据库,在读取后处理导出,问题是 excel 转为 csv 时,如果是 00123 这种数据,转换后会变成 123 ,而且 csv 字段如果是科学计数法倒入数据库时会乱😭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1035084

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX