Как разделить книгу Excel по листу при сохранении группировки - PullRequest
2 голосов
/ 14 июня 2019

Я делаю несколько превосходных отчетов для работы, и мне ежедневно выдают книгу, экспортируемую из SSRS.Книга прекрасно оформлена, к каждому листу применены группировки для эффекта, аналогичного сводным таблицам.

Однако книга состоит из 32 листов, и мне в конечном итоге необходимо отправить каждый лист отдельно в виде отдельного отчета.Прямо сейчас я делю их вручную, но мне интересно, есть ли способ автоматизировать это, сохраняя группировку.

Ранее я пробовал что-то вроде:

import xlrd 
import pandas as pd

targetWorkbook = xlrd.open_workbook(r'report.xlsx', on_demand=True)

xlsxDoc = pd.ExcelFile('report.xlsx') 

for sheet in targetWorkbook.sheet_names():
    reportDF = pd.read_excel(xlsxDoc, sheet)

    reportDF.to_excel("report - {}.xlsx".format(sheet))

Однако, так как яПреобразование каждого листа в датаграммы панды, группировка потеряна.

Существует несколько способов чтения / взаимодействия с документами Excel в Python, но я не могу найти четкий способ выбрать лист исохраните его как собственный документ, не теряя группировку.

1 Ответ

1 голос
/ 17 июня 2019

Это мой полный ответ. Я использовал Worksheets (). Move () метод . Основная идея заключается в использовании библиотеки win32com.client .

Это было протестировано и работает в моей системе Windows 10 с установленным Excel 2013 и Python 3.7. Формат группировки был перенесен на листы. Я все еще работаю над тем, чтобы заставить цикл работать. Я пересмотрю свой ответ снова, когда заставлю цикл работать.

В моем примере 3 листа, каждый из которых имеет разные форматы группировки (промежуточных итогов).

#
# Refined .Move() method, save new file using Active Worksheet property.
#
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb0 = excel.Workbooks.Open(r'C:\python\so\original.xlsx')
excel.Visible = True

# Move sheet1.
wb0.Worksheets(1).Move()
excel.Application.ActiveWorkbook.SaveAs(r'C:\python\so\sheet1.xlsx')

# Move sheet2, which is now the front sheet.
wb0.Worksheets(1).Move()
excel.Application.ActiveWorkbook.SaveAs(r'C:\python\so\sheet2.xlsx')  

# Save single remaining sheet as sheet3.
wb0.SaveAs(r'C:\python\so\sheet3.xlsx')
wb0.Close()
excel.Application.Quit()

Вам также необходимо установить pywin32, который не является стандартным элементом библиотеки. https://github.com/mhammond/pywin32

pip install pywin32
...