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

推荐一个新的 excel 处理库, @zurmokeeper/exceljs,支持 xlsx 文件的解密功能和导出时多表头功能

  •  1
     
  •   zurmokeeper ·
    zurmokeeper · 2023-06-13 22:48:54 +08:00 · 1647 次点击
    这是一个创建于 532 天前的主题,其中的信息可能已经有所发展或是发生改变。

    推荐一个新的excel处理库, @zurmokeeper/exceljs, 关键功能,支持 xlsx 文件的解密功能和导出时多表头功能(见 github readme ),文档地址项目地址, 完全兼容 exceljs

    使用方法:

    完全兼容 exceljs 所以原来对 exceljs 
    
    const ExcelJS = require('exceljs');
    可以直接换成
    const ExcelJS = require('@zurmokeeper/exceljs');
    其它 API 的使用保持不变
    -------------------------------------------------
    
    const ExcelJS = require('@zurmokeeper/exceljs');
    
    // 从文件读取
    const workbook = new Excel.Workbook();
    await workbook.xlsx.readFile(filename);
    
    // 从文件读取, 解密使用密码加密的 excel 文件
    const workbook = new Excel.Workbook();
    await workbook.xlsx.readFile(filename, {password:'123456'});
    // ... 使用 workbook
    
    
    // 从流读取
    const workbook = new Excel.Workbook();
    await workbook.xlsx.read(stream);
    
    // 从流读取, 解密使用密码加密的 excel 文件
    const workbook = new Excel.Workbook();
    await workbook.xlsx.read(stream, {password:'123456'});
    // ... 使用 workbook
    
    
    // 从 buffer 加载
    const workbook = new Excel.Workbook();
    await workbook.xlsx.load(data);
    
    // 从 buffer 加载, 解密使用密码加密的 excel 文件
    const workbook = new Excel.Workbook();
    await workbook.xlsx.load(data, {password:'123456'});
    // ... 使用 workbook
    

    起因:

    需要完成一个读取 WPS 带密码保密的 excel 功能,找遍了社区所有的库,都没有找到,一开始发现 xlsx-populate 支持解密,后面发现只支持 ecma376 agile encrytion 。是现在 office xlsx 格式的加密方式,不是 WPS 的加密方法,所以无法解密.

    后面发现 WPS 对 xlsx 文件的加解密用的是 ecma376 standard encrytion. 然后参考官方文档和其他语言的库对照着来实现,比如 python 写的msoffcrypto-tool 和 go 的 excelize. 由于不是很懂加解密知识,实现的过程也是一波三折。具体的可以看 SF ,这里有几个链接,问题 1, 问题 2, 问题 3

    本来是想给exceljsPR的,但是发现exceljs快 2 年没人维护了,后面 23/4 月底的时候有几个维护者开始合并代码,但是进度很慢,而且中间还停滞了很久,而且这些维护者还不是作者本人,有没发布的权限也不了解,所以想用上这个解密功能不知道还要多久。

    xlsx-populate 也是很久没有人维护了,而且xlsx-populate对于 ecma376 agile encrytion 的处理代码不是单独一个库来处理的,而我是把这些加解密的实现单独出来了一个包,officecrypto-tool,实现加解密的话,直接使用这个包就好了,也就不需要 xlsx-populate 原来关于加解密的那部分代码了,不知道人家会不会接受,所以也没有给 xlsx-populatePR了。

    还有一个库,叫xlsx,是sheetjs出的,这个功能最广,支持读取 xls 格式。但是这个库其实是个社区版,阉割了加解密功能,看源码可以看到,写到加解密那部分的时候,然后代码就没有了,付费版才支持。所以估计是不会接受 PR 的。毕竟加了谁还买他们的付费版。

    node.js 处理excel用的最多的 3 个库:

    exceljs

    API 最友好,文档最丰富,功能也强大,不支持加解密,不支持 xls, 快处于无人维护状态

    xlsx-populate

    API 一般,文档一般,但是支持 ecma376 agile encrytion 加解密,不支持 xls, 快处于无人维护状态

    xlsx 社区版

    API 一般,文档一般,不支持加解密,但是支持的文件格式最广,比如支持 xls 。由于是社区版,估计也不会加什么新功能了

    所以在exceljs v4.3.0的基础写了这个 @zurmokeeper/exceljs

    是基于 2023/5/5 exceljs 的最新提交代码上的,对比 v4.3.0 版本,解决了一些 bug 外(感谢其他开发者)。最重要的更新就是支持对 xlsx 文件的解密功能。加密功能TODO中。

    现在的想法是想继续维护这个项目,其实本人是一直关注 exceljs 的,提过 PR,也回答了一些 issue ,但是苦于没有更多的权限,也不能够关闭 issue ,看着 issue 越来越多,其实很多是已经处理的,或者是重复的。也有很多不错的 PR 在那里放着。

    如果 exceljs 继续更新代码, @zurmokeeper/exceljs 会尽量保持跟上,同时自己也会尽量去处理现在 exceljs 的 issue 和 pr ,然后更新在 @zurmokeeper/exceljs,也欢迎更多的开发者加入,issue 或者 pr 也好。不敢保证能做的多好,只能说尽力。项目地址

    10 条回复    2023-06-14 11:28:00 +08:00
    lisongeee
        1
    lisongeee  
       2023-06-13 22:58:30 +08:00
    为什么构建产物不是 esm 格式 ?
    zurmokeeper
        2
    zurmokeeper  
    OP
       2023-06-13 23:02:25 +08:00
    @lisongeee 还没考虑到 esm ,就现在而言还是前后端都能用的
    rabbbit
        3
    rabbbit  
       2023-06-13 23:04:30 +08:00
    搭车问个问题,楼主知道 xlsx 的 width 转 px 用的是哪个公式吗?找了好几个都对不上。
    最近正好在写 xlsx 文件显示,搞得脑袋都大了。
    lisongeee
        4
    lisongeee  
       2023-06-13 23:09:21 +08:00   ❤️ 1
    浏览器 和 Nodejs 很早就支持 esm 了

    可以像 element-plus 一样同时提供 esm 和 umd

    https://cdn.jsdelivr.net/npm/[email protected]/package.json
    zurmokeeper
        5
    zurmokeeper  
    OP
       2023-06-13 23:09:49 +08:00
    @rabbbit 你是说在 excel 里面操作的公式吗?比如在 WPS 或者 Office 操作的公式?还是说使用 xlsx 这个库要怎么操作?
    zurmokeeper
        6
    zurmokeeper  
    OP
       2023-06-13 23:11:24 +08:00
    @lisongeee 这个我得看研究一下先,因为才开始做这个项目,还是看社区的呼声,欢迎提意见和建议
    rabbbit
        7
    rabbbit  
       2023-06-13 23:15:09 +08:00
    @zurmokeeper
    exceljs 的 column.width 这个转成 px 是咋计算的?
    我抄的这里,不过感觉这个也有问题。https://github.com/gitbrent/xlsx-js-style/blob/48ad46f7d349fed24ba4313ff1d9e53db52875bc/src/xlsx.js#L10023
    zurmokeeper
        8
    zurmokeeper  
    OP
       2023-06-13 23:34:39 +08:00
    @rabbbit 这个我没研究过,不过你可以给我提一个 issue ,我有空可以看下
    Aloento
        9
    Aloento  
       2023-06-14 00:27:08 +08:00
    @lisongeee #4 附议
    zurmokeeper
        10
    zurmokeeper  
    OP
       2023-06-14 11:28:00 +08:00
    @rabbbit 可以说你具体的需求,想达成的效果是什么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:58 · PVG 20:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.