V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Nov 5, 2018 · 8515 views
    This topic created in 2730 days ago, the information mentioned may be changed or developed.

    需求

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

    遇到的问题

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

    请教

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

    • 修改 xlsx 文件。
    • 仅修改单元格内容,保留源格式。
    Supplement 1  ·  Nov 5, 2018

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

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

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

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

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

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

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

    非 windows 平台我觉得目前的库都不行( openpyxl,pyexcel )
    omph
        20
    omph  
       Nov 5, 2018
    用 .net 做吧
    xin053
        21
    xin053  
       Nov 5, 2018
    openpyxl 挺好用的,不过也有些坑
    zhaogaz
        22
    zhaogaz  
       Nov 5, 2018
    java 这边也没啥好用的,都很难受就是了。
    lolizeppelin
        23
    lolizeppelin  
       Nov 5, 2018 via Android
    python 没有库可以 应该也没有微软以外的库可以
    你当 office 是啥

    所以想要完整的应该只有 win 下 c#的才行
    myyou
        24
    myyou  
       Nov 5, 2018
    目前 golang 的有一个库,360 写的不错: https://github.com/360EntSecGroup-Skylar/excelize
    https://xuri.me/excelize/zh-hans/
    你可以打包成".so"文件然后用 python ctype 去调用
    largecat
        25
    largecat  
       Nov 6, 2018 via Android
    vba 比较好,原生的
    himan85
        26
    himan85  
       Nov 15, 2018 via iPhone
    win32api ?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5612 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 117ms · UTC 03:42 · PVG 11:42 · LAX 20:42 · JFK 23:42
    ♥ Do have faith in what you're doing.