首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用openpyxl保存现有工作簿将重置现有图表格式

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

Stack Overflow用户
提问于 2019-03-11 13:17:53
回答 2查看 2K关注 0票数 3

我已经使用openpyxl库创建了一个简短的python脚本,用于向现有工作簿中添加一些数据,然后保存更改。现有工作簿有许多图表,其中一些图表需要透明的图表区域背景,并且由于设计原因,所有图表的边框都已关闭。

当我打开编辑过的文件时,所有与图表区域的边框和填充样式相关的图表样式都被重置为'Automatic‘。有没有办法防止这种情况发生?或者在保存之前访问工作簿对象中的图表集合,并以编程方式为每个图表设置这些属性?

EN

回答 2

Stack Overflow用户

发布于 2019-07-02 15:40:09

不幸的是,openpyxl不会编辑文件,它会再次读取并重新创建整个xlsx文件。如果你比较这两个文件,你会看到很大的不同。

具有图表和无填充样式的原始文件

代码语言:javascript
复制
$ 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重写后,没有任何更改

代码语言:javascript
复制
$ 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格式的100%实现

因此,您的选择是使用COM对象(在Windows中)

Use openpyxl to edit a Excel2007 file (.xlsx) without changing its own styles?

票数 2
EN

Stack Overflow用户

发布于 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代码。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55095589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档