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 · 7607 次点击
    这是一个创建于 2212 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

    • 简单来说就是,已有一个设置过极其复杂的格式的 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   ·   实用小工具   ·   908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 20:13 · PVG 04:13 · LAX 12:13 · JFK 15:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.