使用openpyxl保存现有工作簿会重置现有图表格式。

5
我用openpyxl库创建了一个简短的Python脚本,用于向现有工作簿中添加一些数据并保存更改。现有工作簿有许多图表,其中一些需要透明的图表区域背景,并且出于设计原因关闭了所有边框。
当我打开编辑后的文件时,所有关于边框和填充图案的图表样式都被重置为“自动”。是否有方法可以防止这种情况发生?或者,在保存之前访问工作簿对象中的图表集合,并为每个图表编程设置这些属性的方法?

1
你为什么要使用openpyxl?你是这个库的开发者吗?如果你已经在使用Python,首选的库是pywin32。除非你从Python脚本中明确更改它们,否则它不会触及工作表或图表对象。我不确定我理解你的问题。如果需要,也可以从pywin32编辑图表属性。 - Jennifer Yoon
我需要一个可以在Linux环境中使用的库。Windows服务器或虚拟机不是一个选项,就我所知,pywin32需要Windows环境。 - ghyde
2个回答

3

OpenPyxl无法工作,因为它会在保存文件之前删除图表格式。现有图表格式不被保留的原因与OpenPyxl的设计有关。OpenPyxl类似于针对Linux和Mac OSes的Excel的重复实现。它不仅调用现有的COM和Excel-VBA功能。因此,在未来的更新中向此库添加Excel的广泛图表格式功能将是困难的。

这里有一些可能有用的Linux库。

xlutils.copyhttps://xlutils.readthedocs.io/en/latest/copy.html

pyexcelerator(旧版库)
https://sourceforge.net/projects/pyexcelerator/

请参见如何以编程方式编辑Excel工作表?

是的,pywin32需要Windows操作系统或Windows仿真。它是与Excel文件一起工作的最佳方法,因为您可以完全访问所有Windows COM对象和所有Excel-VBA工作表对象(有时需要进行轻微修改)。也许您可以在Windows仿真中使用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()

2
很遗憾,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.xmlstyle1.xml 没有被持久化。这是因为openpyxl不是对xlsx格式的完全实现。
因此,你有两个选择可以使用COM对象(在Windows的情况下): 使用openpyxl编辑Excel2007文件(.xlsx)而不更改其自身样式?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接