V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
git00ll
V2EX  ›  问与答

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

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

    已知条件

    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  
       179 天前 via Android   ❤️ 1
    MS 自家的 Power Automate Desktop.
    loading
        2
    loading  
       179 天前
    python pywin32
    march1993
        3
    march1993  
       179 天前
    搜索 office 自动阅卷看看。。。应该是类似的基数
    wangkun025
        5
    wangkun025  
       179 天前
    python 或者 ruby 的话,都是一句代码读取,一句代码写入啊。
    hannibalm
        6
    hannibalm  
       179 天前 via Android
    python 的 xlwings 库
    Tink
        7
    Tink  
       179 天前 via Android
    Python 有库
    wangkun025
        8
    wangkun025  
       179 天前
    # 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  
       179 天前
    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  
       179 天前
    我当时也有类似需求,要填很多模板表( xls ),而且很多 cell 有保护,而且要保留格式,最后无奈用了 vba
    ysc3839
        11
    ysc3839  
       179 天前 via Android
    可以用 Excel 提供的 COM 接口来实现,只要是能调用 COM (准确说是 IDispatch) 的语言都可以使用。cmd 脚本不行。
    @kokutou 直接用 VBA 确实恶心,但是也可以用别的语言调用 COM 接口,函数、参数什么的都和 VBA 的是一样的。
    renmu123
        12
    renmu123  
       179 天前 via Android
    csv 转 xlsx 应该没什么难度,基本上每个语言都有操作的库
    nightwitch
        13
    nightwitch  
       179 天前   ❤️ 2
    代码:

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