将 csv 转成 xlsx,如何调用系统 excel 实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git00ll
V2EX    问与答

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

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

    已知条件

    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  
    PRO
       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     Solana     1612 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 16:15 PVG 00:15 LAX 08:15 JFK 11:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86