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

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

  •  
  •   git00ll · Apr 2, 2022 · 2538 views
    This topic created in 1497 days ago, the information mentioned may be changed or developed.

    已知条件

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

    需求

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

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

    调研

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

    问题

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

    p1

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

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

    完全符合你的需求,调用 com 接口,支持调用 office excel/ wps excel 。
    虽然 csv 转 xlsx 有许多库可以做到 (比如 pandas),但是如果你要完美符合 office 的表现的话,调用无头的 excel 进行转化是最方便的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4566 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 10:06 · PVG 18:06 · LAX 03:06 · JFK 06:06
    ♥ Do have faith in what you're doing.