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

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

  •  
  •   faketemp · 82 天前 · 835 次点击
    这是一个创建于 82 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    感谢各位的指导!
    第 2 条附言  ·  76 天前
    寻而不得,闭门造车!(●'◡'●)

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

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

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

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

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

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

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