如何在保留分组的同时按工作表拆分 Excel 工作簿

How to split an Excel workbook by worksheet while preserving grouping

我正在做一些 excel 工作报告,并且每天都会收到一本从 SSRS 导出的书。这本书设置得很好,每个 sheet 都应用了分组,以获得类似于数据透视表的效果。

但是这本书有 32 个 sheet,我最终需要将每个 sheet 作为不同的报告单独发送出去。现在我正在手动拆分它们,但我想知道是否有一种方法可以在保留分组的同时自动执行此操作。

我之前尝试过类似的方法:

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))

然而,由于我将每个 sheet 转换为 pandas 数据报,因此分组丢失了。

read/interact 和 python 中的 excel 文档有多种方法,但我找不到明确的方法来挑选 sheet 并保存它作为自己的文档而不丢失分组。

这是我的完整答案。我使用了 Worksheets().Move() 方法。主要思想是使用 win32com.client 库。

这已经过测试,可以在安装了 Excel 2013 和 Python 3.7 的 Windows 10 系统上运行。分组格式与工作表一起完整移动。我仍在努力让循环工作。当循环开始工作时,我会再次修改我的答案。

我的示例有 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