目前有哪个 Python 的轮子 支持 xlsx 的修改(保留源格式) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
JCZ2MkKb5S8ZX9pq
V2EX    Python

目前有哪个 Python 的轮子 支持 xlsx 的修改(保留源格式)

  •  
  •   JCZ2MkKb5S8ZX9pq 2018-11-05 00:39:28 +08:00 8138 次点击
    这是一个创建于 2532 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

    • 简单来说就是,已有一个设置过极其复杂的格式的 excel,需要增减改部分数据。
    • 具体是,把数据库数据处理后导入 excel。
      然后对 excel 做了一系列调整,以优化阅读。
      比如条件格式、超链接、单元格格式、分组、等等,需要修改的同时保留源格式。

    遇到的问题

    • pandas 等轮子只能写新文件。
    • xlsxwriter 这种可以插图的,不支持复杂格式,而且也只支持新建。
    • xlutils 只支持 xls,不支持 xlsx。
    • 有些轮子也支持自定义个单元格大小颜色啥的,但支持得不全面。

    请教

    感觉是个挺常用的功能,但实在遍寻不到可用的轮子,有大神能指条明路嘛?

    • 修改 xlsx 文件。
    • 仅修改单元格内容,保留源格式。
    第 1 条附言    2018-11-05 20:37:32 +08:00

    感谢各位的建议,目前进展如下:

    使用了 openpyxl ,功能比较强大,可以修改内容。
    但是仍旧有两个问题:

    • 格式支持仍旧不完整,会丢失一些部分。
      我丢失的是 条件格式 / 数据条 / 颜色。
    • 如果文件包含“表”,就是“Ctrl+T”处理过的区域。
      打开 openpyxl 生成的文件,excel 会提示修复。另存重开,问题依旧。

    PS:很多人用excel并不会使用“表”,但其实转化过后的区域会有一些不错的特性。

    • 比如公式引用直接是列名称,而不再是$A2这样不易读的格式。
    • 还有列公式统一变化,写一格自动填充到整列。

    操作方法是选中数据区域,按“Ctrl+T”,或者点“插入”选项卡,第三个“表格”。

    26 条回复    2018-11-15 16:19:08 +08:00
    JCZ2MkKb5S8ZX9pq
        1
    JCZ2MkKb5S8ZX9pq  
    OP
       2018-11-05 00:54:13 +08:00
    现在暂用的村炮方案是,把表格内容如下复制到剪贴板,然后手动黏贴一次。
    a\t123\n
    b\t234\n
    ...\t...\n
    FullBridgeRect
        2
    FullBridgeRect  
       2018-11-05 00:59:37 +08:00 via Android
    openpyxl?
    Sylv
        3
    Sylv  
       2018-11-05 01:25:52 +08:00 via iPhone
    试试 xlwings。
    如果也满足不了你的需求的话,提供一个思路:在 Excel 里先用 VBA 写你想要的方法,例如在某位置设置某格式,然后用 xlwings 的 macro 方法去调用 VBA 方法,传入数据和参数。
    https://docs.xlwings.org/en/stable/api.html#xlwings.Book.macro
    jimmyye
        4
    jimmyye  
       2018-11-05 02:21:46 +08:00
    PythonAnswer
        5
    PythonAnswer  
       2018-11-05 06:26:47 +08:00
    我觉得直接写 vba 会更快啊。只是 crud 数据,用 vba 更好。
    janxin
        6
    janxin  
       2018-11-05 06:56:08 +08:00 via iPad
    只要不是用 excel 原生功能的,多少都有问题。如果没有额外需求但是必须要 py 的话,建议直接生成一个新的
    hanxiV2EX
        7
    hanxiV2EX  
       2018-11-05 07:50:47 +08:00 via Android
    造轮子吧,xlsx 格式比 xls 更好理解,zip 解压出来就是 xml,直接操作 xml 再 zip 压缩。
    geelaw
        8
    geelaw  
       2018-11-05 07:53:25 +08:00
    weyou
        9
    weyou  
       2018-11-05 07:54:26 +08:00 via Android
    openpyxl 支持有简单格式的 excel 文件的修改,但复杂格式会丢失
    myhot21
        10
    myhot21  
       2018-11-05 07:57:57 +08:00 via Android
    python 操作 office 的所有开源库,看下哪一个合适: https://www.21doc.net/python/awesomepython
    nicevar
        11
    nicevar  
       2018-11-05 08:07:24 +08:00 via Android
    Python 这方面没有好用的,都是鸡肋
    canfoderiskii
        12
    canfoderiskii  
       2018-11-05 08:32:04 +08:00 via Android
    用 vba
    clker
        13
    clker  
       2018-11-05 08:32:37 +08:00 via Android
    其实直接用 comtypes,或者 pywin 操作原文件还是比较简单的
    sanjusss
        14
    sanjusss  
       2018-11-05 08:48:48 +08:00
    可以调用 c++的[libxl]( http://www.libxl.com),这个库有多个平台,给钱的话也有源码。
    614457662
        15
    614457662  
       2018-11-05 08:49:36 +08:00
    mec
        16
    mec  
       2018-11-05 09:26:06 +08:00
    openpyxl
    337136897
        17
    337136897  
       2018-11-05 09:32:57 +08:00
    现在怎么都找现有的轮子
    Rheinmetal
        18
    Rheinmetal  
       2018-11-05 10:15:50 +08:00
    当成 xml 自己处理?
    dawncold
        19
    dawncold  
       2018-11-05 10:27:52 +08:00
    如果你在 windows 平台上,可能有办法处理,参考这个看看有没有用: http://pythonexcels.com/python-excel-mini-cookbook/

    非 windows 平台我觉得目前的库都不行( openpyxl,pyexcel )
    omph
        20
    omph  
       2018-11-05 10:59:41 +08:00
    用 .net 做吧
    xin053
        21
    xin053  
       2018-11-05 11:09:32 +08:00
    openpyxl 挺好用的,不过也有些坑
    zhaogaz
        22
    zhaogaz  
       2018-11-05 11:11:30 +08:00
    java 这边也没啥好用的,都很难受就是了。
    lolizeppelin
        23
    lolizeppelin  
       2018-11-05 13:17:04 +08:00 via Android
    python 没有库可以 应该也没有微软以外的库可以
    你当 office 是啥

    所以想要完整的应该只有 win 下 c#的才行
    myyou
        24
    myyou  
       2018-11-05 14:55:17 +08:00
    目前 golang 的有一个库,360 写的不错: https://github.com/360EntSecGroup-Skylar/excelize
    https://xuri.me/excelize/zh-hans/
    你可以打包成".so"文件然后用 python ctype 去调用
    largecat
        25
    largecat  
       2018-11-06 08:23:55 +08:00 via Android
    vba 比较好,原生的
    himan85
        26
    himan85  
       2018-11-15 16:19:08 +08:00 via iPhone
    win32api ?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5980 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 06:13 PVG 14:13 LAX 23:13 JFK 02:13
    Do have faith in what you're doing.
    ubao 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