我已经使用openpyxl库创建了一个简短的python脚本,用于向现有工作簿中添加一些数据,然后保存更改。现有工作簿有许多图表,其中一些图表需要透明的图表区域背景,并且由于设计原因,所有图表的边框都已关闭。
当我打开编辑过的文件时,所有与图表区域的边框和填充样式相关的图表样式都被重置为'Automatic‘。有没有办法防止这种情况发生?或者在保存之前访问工作簿对象中的图表集合,并以编程方式为每个图表设置这些属性?
发布于 2019-07-02 15:40:09
不幸的是,openpyxl不会编辑文件,它会再次读取并重新创建整个xlsx文件。如果你比较这两个文件,你会看到很大的不同。
具有图表和无填充样式的原始文件
$ tree
.
├── [Content_Types].xml
├── _rels
├── docProps
│ ├── app.xml
│ └── core.xml
└── xl
├── _rels
│ └── workbook.xml.rels
├── charts
│ ├── _rels
│ │ └── chart1.xml.rels
│ ├── chart1.xml
│ ├── colors1.xml
│ └── style1.xml
├── drawings
│ ├── _rels
│ │ └── drawing1.xml.rels
│ └── drawing1.xml
├── sharedStrings.xml
├── styles.xml
├── theme
│ └── theme1.xml
├── workbook.xml
└── worksheets
├── _rels
│ └── sheet1.xml.rels
└── sheet1.xml
11 directories, 16 files在被openpyxl重写后,没有任何更改
$ tree
.
├── [Content_Types].xml
├── _rels
├── docProps
│ ├── app.xml
│ └── core.xml
└── xl
├── _rels
│ └── workbook.xml.rels
├── charts
│ └── chart1.xml
├── drawings
│ ├── _rels
│ │ └── drawing1.xml.rels
│ └── drawing1.xml
├── styles.xml
├── theme
│ └── theme1.xml
├── workbook.xml
└── worksheets
├── _rels
│ └── sheet1.xml.rels
└── sheet1.xml
10 directories, 12 files如您所见,colors1.xml和style1.xml不会持久化。这是因为openpyxl不是xlsx格式的100%实现
因此,您的选择是使用COM对象(在Windows中)
Use openpyxl to edit a Excel2007 file (.xlsx) without changing its own styles?
发布于 2019-07-07 07:43:37
OpenPyxl将不起作用,因为它将在保存文件之前删除图表格式。不保留现有图表格式的原因与OpenPyxl的设计有关。OpenPyxl类似于在Linux和Mac OSes上重复实现Excel。它不仅仅是调用现有的COM和Excel-VBA功能。因此,在将来的更新中很难将Excel的大量图表格式设置功能添加到此库中。
这里有一些可能会有帮助的Linux库。
xlutils.copy https://xlutils.readthedocs.io/en/latest/copy.html
pyexcelerator (旧库)
https://sourceforge.net/projects/pyexcelerator/
请参阅How to programmatically edit Excel sheets?
是的,pywin32需要视窗操作系统或视窗仿真。这是处理Excel文件的最佳方法,因为您可以完全访问所有Windows COM对象和所有Excel-VBA工作表对象(有时稍作修改)。
也许您可以在Windows Emulation中使用pywin32分离Chart Sheet对象,然后在Linux中使用openpyxl编辑工作表,最后使用pywin32重新组装工作簿?请参阅下面的示例pywin32代码。
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb0 = excel.Workbooks.Open(r'C:\path\source.xlsx')
excel.Visible = True
# Move Chart 1 to a new Workbook, which becomes the ActiveWorkbook.
wb0.Charts('Chart1').Move()
excel.ActiveWorkbook.SaveAs(r'C:\path\chart1.xlsx')
excel.ActiveWorkbook.Close()
wb0.SaveAs(r'C:\path\no_charts.xlsx')
wb0.Close()
excel.Application.Quit()https://stackoverflow.com/questions/55095589
复制相似问题