сохранение существующей книги с openpyxl сбрасывает существующие форматы диаграмм - PullRequest
2 голосов
/ 11 марта 2019

Я создал короткий скрипт на python с библиотекой openpyxl, чтобы добавить некоторые данные в существующую книгу и затем сохранить изменения.Существующая рабочая книга имеет несколько диаграмм, некоторые из которых требуют прозрачных фонов области диаграммы, и для всех них границы были отключены по соображениям дизайна.

Когда я открываю отредактированный файл, все стили диаграммы сОтношение к границам и шаблону заполнения области диаграммы сбрасываются на «Автоматически».Есть ли способ предотвратить это?Или, возможно, способ получить доступ к коллекции диаграмм в объекте книги до сохранения и установить эти свойства для каждой диаграммы программно?

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

К сожалению 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 не является 100% -ной реализацией формата xlsx

То есть, вы можете использовать COM-объекты (в случае Windows)

Использовать openpyxl для редактирования файла Excel2007 (.xlsx) без изменения его собственных стилей?

1 голос
/ 07 июля 2019

OpenPyxl не будет работать, так как он удалит форматирование диаграммы перед сохранением файла.Причина, по которой существующее форматирование диаграмм не сохраняется, связана с дизайном OpenPyxl.OpenPyxl похож на дублирующую реализацию Excel для Linux и Mac OS.Это не просто вызов существующих функций COM и Excel-VBA.Поэтому в будущем обновлении будет сложно добавить в эту библиотеку расширенные функции форматирования диаграмм Excel.

Вот некоторые библиотеки Linux , которые могут помочь.

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

pyexcelerator (старая библиотека)
https://sourceforge.net/projects/pyexcelerator/

См. Как программно редактировать листы Excel?

Да, pywin32 требует ОС Windows или эмуляцию Windows.Это лучший способ работы с файлами Excel, поскольку вы получаете полный доступ ко всем COM-объектам Windows и ко всем объектам Excel-VBA Worksheets (иногда с небольшими изменениями).

Возможно, вы можете использовать pywin32 в эмуляции Windows, чтобы отделить объекты Chart Sheet, затем использовать openpyxl для редактирования рабочих таблиц в Linux, и, наконец, собрать сборочную книгу, используя 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()
...