V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
faketemp
V2EX  ›  问与答

有没有高效 xls 转 xlsx 格式的 cli 工具

  •  
  •   faketemp · 2023-03-15 21:49:54 +08:00 · 1445 次点击
    这是一个创建于 610 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教各位收藏的有没有 windows 平台 xls 转 xlsx 的命令行程序,理想的需求是:

    • 支持命令行调用,单 exe 无依赖或少依赖项
    • 付费 /免费不限
    • 体积越小越好(考虑过用 python 随便搞一个再 pyinstaller 打包,十几兆的体积劝退)

    G 了好久,只找到一款相对最贴合需求的b2xtranslator
    但实测转出来的 xlsx 用 Excel 闪退压根无法打开

    反复翻找多天无果 来这里求助大佬

    第 1 条附言  ·  2023-03-16 14:07:26 +08:00
    参考楼上资料 改了一版实测可用
    将 xls 文件自动批量转换为 xlsx 格式的 VBS 脚本(原理上调用本机 Office COM 接口)
    目前各种解决方案暂未找到比这更优雅合适的

    支持单 xls 文件拖放、多 xls 文件拖放、目录拖放、混合拖放等,源码参考可见
    https://github.com/playGitboy/xls2xlsx

    感谢各位的指导!
    第 2 条附言  ·  2023-03-21 11:41:27 +08:00
    寻而不得,闭门造车!(●'◡'●)

    Golang 改写一款,单程序无依赖体积小多平台,且不依赖本机 Office/WPS
    https://github.com/playGitboy/xls2xlsx-go
    18 条回复    2023-03-21 11:42:44 +08:00
    rsy
        1
    rsy  
       2023-03-15 22:06:54 +08:00 via Android   ❤️ 1
    通过命令行打开 xlsm 文件,xlsm 里面写入相关 VBA 代码,打开 xls 文件然后另存为 xlsx 文件,然后在 VBA 中增加 workbook 的 open 事件,此事件会在文件打开时触发

    反正这个需求用 VBA 实现很简单,只要电脑上有 Office 就行
    nightwitch
        2
    nightwitch  
       2023-03-15 22:43:09 +08:00   ❤️ 1
    https://paste.ubuntu.com/p/GQV7HXRVMk/

    最简单的就是利用 wps 或者 microsoft office 的 com 接口,前提是执行转换的电脑上得有这两个软件之一。
    代码我测试过了没问题
    paulluis2dev
        3
    paulluis2dev  
       2023-03-15 22:52:58 +08:00   ❤️ 1
    可以试试 LibreOffice ,支持命令行调用,免费,缺点:体积大
    wxg4net
        4
    wxg4net  
       2023-03-15 22:54:14 +08:00 via Android   ❤️ 1
    libreoffice 中 soffice 支持命令行文件格式转换,写个批处理就能遍历转换了
    tool2d
        5
    tool2d  
       2023-03-15 23:00:06 +08:00   ❤️ 1
    微软有个 Office 2007 -> 2003 文件格式转换工具,有个叫 moc.exe 的 cli 工具可以。
    tomczhen
        6
    tomczhen  
       2023-03-15 23:33:16 +08:00 via Android
    如果只是要数据,可以用 ODBC 来读 xls 。
    mxT52CRuqR6o5
        7
    mxT52CRuqR6o5  
       2023-03-16 00:11:19 +08:00 via Android   ❤️ 1
    找个 office 批量转 pdf 的 vbs ,改改就行
    fzinfz
        8
    fzinfz  
       2023-03-16 01:17:07 +08:00
    xxx027
        9
    xxx027  
       2023-03-16 05:38:14 +08:00 via Android
    关键字 xls to xlsx online api 没有找到合适的吗?
    faketemp
        10
    faketemp  
    OP
       2023-03-16 06:44:54 +08:00 via iPhone
    @fzinfz 好是好 只是自己用可以 分发不便
    @xxx027 内网使用场景 且数据可能涉密 无法使用 online 服务
    faketemp
        11
    faketemp  
    OP
       2023-03-16 07:05:46 +08:00 via iPhone
    mingoing428
        12
    mingoing428  
       2023-03-16 09:29:32 +08:00
    我以为把扩展名改一下就好了
    vZexc0m
        13
    vZexc0m  
       2023-03-16 10:30:18 +08:00
    这年头十几兆的体积也算大吗?想要无依赖可以用 go 写一个
    faketemp
        14
    faketemp  
    OP
       2023-03-16 11:23:02 +08:00 via iPhone
    @vZexc0m 这就要从业务场景出发了 十几兆大不大关键得看里面实现了多少功能不是 写个计算器都十几兆个人觉得不太合适
    而且自己用十几兆确实不算大 考虑到分发就诸多不便

    第一时间想过 go 但据了解 excelize 完全不支持 xls 格式 其他 xls 库多有格式兼容问题 总之目前相关第三方库确有诸多不便 自己造轮子前的好习惯就是来找神通广大 v 友取取经ヾノ≧∀≦)o
    mxT52CRuqR6o5
        15
    mxT52CRuqR6o5  
       2023-03-16 11:54:40 +08:00   ❤️ 1
    用 chatgpt 写了一份,简单 review 了一下似乎是没有大问题
    关键的那一行 objWorkbook.SaveAs strNewFile, 51 我不太确定 51 是否对应 xlsx 格式
    还有就是把 objExcel 提到循环外面来运行效率会更高一些,不然每一次循环都会打开 excel 关闭 excel
    还还有就是生成新文件名变量 strNewFile 时,没有利用到 objFSO 简化代码,而是用了 Left&Len 搁那儿截来截去,可读性不是很好

    Please write a vbs script that can batch covert xls to xlsx.

    ```
    Option Explicit

    Dim objFSO, objFolder, objFiles, objExcel, objWorkbook
    Dim strFolderPath, strExtension, strNewExtension, strFile, strNewFile

    ' set the folder path containing the XLS files
    strFolderPath = "C:\Users\Username\Desktop\XLS_Files"

    ' set the file extension to look for
    strExtension = ".xls"

    ' set the new file extension
    strNewExtension = ".xlsx"

    ' create file system object
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    ' get the folder object
    Set objFolder = objFSO.GetFolder(strFolderPath)

    ' loop through all files in the folder
    For Each objFiles In objFolder.Files

    ' check if file extension matches
    If Right(objFiles.Name, Len(strExtension)) = strExtension Then

    ' create new file name with new extension
    strFile = objFiles.Path
    strNewFile = Left(strFile, Len(strFile) - Len(strExtension)) & strNewExtension

    ' create Excel object
    Set objExcel = CreateObject("Excel.Application")

    ' open workbook
    Set objWorkbook = objExcel.Workbooks.Open(strFile)

    ' save as XLSX file
    objWorkbook.SaveAs strNewFile, 51

    ' close workbook and Excel object
    objWorkbook.Close False
    objExcel.Quit

    ' release Excel objects
    Set objWorkbook = Nothing
    Set objExcel = Nothing

    End If

    Next

    ' release file system objects
    Set objFiles = Nothing
    Set objFolder = Nothing
    Set objFSO = Nothing

    WScript.Echo "All XLS files converted to XLSX."

    ```
    mxT52CRuqR6o5
        16
    mxT52CRuqR6o5  
       2023-03-16 12:03:38 +08:00   ❤️ 1
    faketemp
        17
    faketemp  
    OP
       2023-03-16 14:06:08 +08:00
    参考楼上资料 改了一版实测可用
    将 xls 文件自动批量转换为 xlsx 格式的 VBS 脚本(原理上调用本机 Office COM 接口)
    目前各种解决方案暂未找到比这更优雅合适的

    支持单 xls 文件拖放、多 xls 文件拖放、目录拖放、混合拖放等,源码可见
    https://github.com/playGitboy/xls2xlsx

    感谢各位指导!
    faketemp
        18
    faketemp  
    OP
       2023-03-21 11:42:44 +08:00
    @vZexc0m 听你的 寻而不得就闭门造车(●'◡'●)

    Golang 改写一款,单程序无依赖体积小多平台,且不依赖本机 Office/WPS ,基本可用了
    https://github.com/playGitboy/xls2xlsx-go
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3643 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.