V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
test123abc
V2EX  ›  程序员

PHP 处理百万级 execl

  •  
  •   test123abc · 212 天前 · 2044 次点击
    这是一个创建于 212 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前有个需求是导入两个百万级数据的 excel ,关联处理后导出新的 excel 。
    我想先使用 box/spout 先读取,处理后导出,感觉会卡死,请问下大家有更好的办法吗。
    18 条回复    2024-04-25 11:29:31 +08:00
    lait123
        1
    lait123  
       212 天前   ❤️ 2
    你可能需要 xlswriter: https://github.com/viest/php-ext-xlswriter
    Mithril
        2
    Mithril  
       212 天前
    都搞到 SQLite 里,查出来再写 Excel 或者 CSV 。

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

    excel 不适合的原因:

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

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

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

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

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

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

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

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

    test123abc
        18
    test123abc  
    OP
       211 天前 via iPhone
    是要在内部的后台给运营人员开一个处理 excel 的地方
    现在使用 xlswriter ,将 excel 转为 csv ,然后将 csv 导入数据库,在读取后处理导出,问题是 excel 转为 csv 时,如果是 00123 这种数据,转换后会变成 123 ,而且 csv 字段如果是科学计数法倒入数据库时会乱😭
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3414 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:42 · PVG 12:42 · LAX 20:42 · JFK 23:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.