V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
faketemp
V2EX  ›  问与答

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

  •  
  •   faketemp · Mar 15, 2023 · 2089 views
    This topic created in 1142 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    感谢各位的指导!
    Supplement 2  ·  Mar 21, 2023
    寻而不得,闭门造车!(●'◡'●)

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

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

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

    第一时间想过 go 但据了解 excelize 完全不支持 xls 格式 其他 xls 库多有格式兼容问题 总之目前相关第三方库确有诸多不便 自己造轮子前的好习惯就是来找神通广大 v 友取取经ヾノ≧∀≦)o
    mxT52CRuqR6o5
        15
    mxT52CRuqR6o5  
       Mar 16, 2023   ❤️ 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  
       Mar 16, 2023   ❤️ 1
    faketemp
        17
    faketemp  
    OP
       Mar 16, 2023
    参考楼上资料 改了一版实测可用
    将 xls 文件自动批量转换为 xlsx 格式的 VBS 脚本(原理上调用本机 Office COM 接口)
    目前各种解决方案暂未找到比这更优雅合适的

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

    感谢各位指导!
    faketemp
        18
    faketemp  
    OP
       Mar 21, 2023
    @vZexc0m 听你的 寻而不得就闭门造车(●'◡'●)

    Golang 改写一款,单程序无依赖体积小多平台,且不依赖本机 Office/WPS ,基本可用了
    https://github.com/playGitboy/xls2xlsx-go
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   876 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 22:12 · PVG 06:12 · LAX 15:12 · JFK 18:12
    ♥ Do have faith in what you're doing.