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

将 csv 转成 xlsx,如何调用系统 excel 实现

  •  
  •   git00ll · 2022-04-02 19:23:39 +08:00 · 1608 次点击
    这是一个创建于 747 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知条件

    excel 打开 csv 文件,另存为 xlsx 即可将 csv 转成 excel

    需求

    鉴于此我想实现代码控制 window 上安装的 excel 进行转换,即所谓的无头模式。

    实现效果是:写一段程序,运行程序后将参数指定的 csv 使用 excel 转成 xlsx 。

    调研

    网上搜索相关资料似乎可以加载 excel 下的相关 dll 实现,没有找到具体实现

    问题

    想请假大家,能使用哪种语言方便实现呢?批处理可否实现?应该去哪里查询 excel 的相关资料,相关 api ?

    p1

    网上有很多文档转换网站,如 pdf 转 word ,excel 转 jpg ,等等,我猜测他们也是控制 excel 实现的,所以想学习下相关技术,后期实现各种 excel 支持的格式互转。

    13 条回复    2022-04-02 21:29:23 +08:00
    nodejx
        1
    nodejx  
       2022-04-02 19:27:11 +08:00 via Android   ❤️ 1
    MS 自家的 Power Automate Desktop.
    loading
        2
    loading  
       2022-04-02 19:30:37 +08:00
    python pywin32
    march1993
        3
    march1993  
       2022-04-02 19:31:32 +08:00
    搜索 office 自动阅卷看看。。。应该是类似的基数
    wangkun025
        5
    wangkun025  
       2022-04-02 19:57:08 +08:00
    python 或者 ruby 的话,都是一句代码读取,一句代码写入啊。
    hannibalm
        6
    hannibalm  
       2022-04-02 19:58:37 +08:00 via Android
    python 的 xlwings 库
    Tink
        7
    Tink  
       2022-04-02 20:14:03 +08:00 via Android
    Python 有库
    wangkun025
        8
    wangkun025  
       2022-04-02 20:18:17 +08:00
    # run `gem install caxlsx` before run the script

    # read csv file
    require 'csv'
    arr_of_rows = CSV.read("input.csv")

    # write to excel
    require 'caxlsx'
    Axlsx::Package.new do |p|
    p.workbook.add_worksheet(:name => "Sheet1") do |sheet|
    arr_of_rows.each {|row| sheet.add_row row}
    end
    p.serialize('output.xlsx')
    end

    # 写了个 ruby 版本的,但确实超过两行了。
    kokutou
        9
    kokutou  
       2022-04-02 20:21:15 +08:00
    libreoffice
    csv 本身就没格式, 所以用 libreoffice 也不怕格式出问题

    start /wait soffice --headless --convert-to xlsx:"Calc MS Excel 2007 XML" file_to_convert.csv


    office 之前找过的例子, 是用的 vba, 写起来特恶心...

    Set wBook = Workbooks.Open(CSVfolder & fname, Format:=6, Delimiter:=",")
    wBook.SaveAs XlsFolder & Replace(fname, ".csv", ""), xlOpenXMLWorkbook
    wBook.Close False
    miyuki
        10
    miyuki  
       2022-04-02 20:30:00 +08:00
    我当时也有类似需求,要填很多模板表( xls ),而且很多 cell 有保护,而且要保留格式,最后无奈用了 vba
    ysc3839
        11
    ysc3839  
       2022-04-02 20:32:51 +08:00 via Android
    可以用 Excel 提供的 COM 接口来实现,只要是能调用 COM (准确说是 IDispatch) 的语言都可以使用。cmd 脚本不行。
    @kokutou 直接用 VBA 确实恶心,但是也可以用别的语言调用 COM 接口,函数、参数什么的都和 VBA 的是一样的。
    renmu123
        12
    renmu123  
       2022-04-02 21:04:20 +08:00 via Android
    csv 转 xlsx 应该没什么难度,基本上每个语言都有操作的库
    nightwitch
        13
    nightwitch  
       2022-04-02 21:29:23 +08:00   ❤️ 2
    代码: https://gist.github.com/BlurryLight/e677730a9dfa4fef9c029b655a26d617

    完全符合你的需求,调用 com 接口,支持调用 office excel/ wps excel 。
    虽然 csv 转 xlsx 有许多库可以做到 (比如 pandas),但是如果你要完美符合 office 的表现的话,调用无头的 excel 进行转化是最方便的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3417 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:06 · PVG 08:06 · LAX 17:06 · JFK 20:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.