目前有哪些Python库支持修改xlsx文件并保留源格式?
需求
- 简单来说就是,已有一个设置过极其复杂的格式的 excel,需要增减改部分数据。
- 具体是,把数据库数据处理后导入 excel。
然后对 excel 做了一系列调整,以优化阅读。
比如条件格式、超链接、单元格格式、分组、等等,需要修改的同时保留源格式。
遇到的问题
- pandas 等轮子只能写新文件。
- xlsxwriter 这种可以插图的,不支持复杂格式,而且也只支持新建。
- xlutils 只支持 xls,不支持 xlsx。
- 有些轮子也支持自定义个单元格大小颜色啥的,但支持得不全面。
请教
感觉是个挺常用的功能,但实在遍寻不到可用的轮子,有大神能指条明路嘛?
- 修改 xlsx 文件。
- 仅修改单元格内容,保留源格式。
目前有哪些Python库支持修改xlsx文件并保留源格式?
现在暂用的村炮方案是,把表格内容如下复制到剪贴板,然后手动黏贴一次。
a\t123\n
b\t234\n
…\t…\n
对于修改.xlsx文件并保留格式,我主要用openpyxl和xlwings。
1. openpyxl 这是最常用的库,能读写单元格值、公式、图表,还能保留大部分格式(字体、颜色、边框、列宽等)。不过它对Excel高级功能(如数据透视表、宏)支持有限。
from openpyxl import load_workbook
# 加载工作簿,保留所有格式
wb = load_workbook('source.xlsx')
ws = wb.active
# 修改A1单元格的值和格式
ws['A1'].value = "新数据"
ws['A1'].font = Font(name='微软雅黑', size=12, bold=True)
# 保存文件(自动保留未修改的原有格式)
wb.save('modified.xlsx')
2. xlwings 这个库通过COM接口与Excel交互,能100%保留格式和所有Excel功能,但需要安装Excel软件。
import xlwings as xw
app = xw.App(visible=False) # 后台运行
wb = app.books.open('source.xlsx')
ws = wb.sheets[0]
# 修改内容
ws.range('A1').value = "新数据"
ws.range('A1').font.name = '微软雅黑'
ws.range('A1').font.bold = True
wb.save('modified.xlsx')
wb.close()
app.quit()
简单总结: 纯Python环境用openpyxl,需要完整Excel功能就用xlwings。
openpyxl?
试试 xlwings。
如果也满足不了你的需求的话,提供一个思路:在 Excel 里先用 VBA 写你想要的方法,例如在某位置设置某格式,然后用 xlwings 的 macro 方法去调用 VBA 方法,传入数据和参数。
https://docs.xlwings.org/en/stable/api.html#xlwings.Book.macro
我觉得直接写 vba 会更快啊。只是 crud 数据,用 vba 更好。
只要不是用 excel 原生功能的,多少都有问题。如果没有额外需求但是必须要 py 的话,建议直接生成一个新的
造轮子吧,xlsx 格式比 xls 更好理解,zip 解压出来就是 xml,直接操作 xml 再 zip 压缩。
Component Object Model
https://stackoverflow.com/questions/441758/driving-excel-from-python-in-windows
python 操作 office 的所有开源库,看下哪一个合适: https://www.21doc.net/python/awesomepython
Python 这方面没有好用的,都是鸡肋
用 vba
其实直接用 comtypes,或者 pywin 操作原文件还是比较简单的
可以调用 c++的[libxl]( http://www.libxl.com),这个库有多个平台,给钱的话也有源码。
openpyxl https://www.yinkh.top/article/71/
openpyxl
现在怎么都找现有的轮子
当成 xml 自己处理?
如果你在 windows 平台上,可能有办法处理,参考这个看看有没有用: http://pythonexcels.com/python-excel-mini-cookbook/
非 windows 平台我觉得目前的库都不行( openpyxl,pyexcel )
用 .net 做吧
openpyxl 挺好用的,不过也有些坑
java 这边也没啥好用的,都很难受就是了。
vba 比较好,原生的
win32api ?


