首页 > 解决方案 > 如何在保留分组的同时按工作表拆分 Excel 工作簿

问题描述

我正在为工作做一些 excel 报告,并且每天都会收到一本从 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))

但是,由于我将每张工作表转换为熊猫数据报,因此分组丢失了。

有多种方法可以在 python 中读取/与 excel 文档进行交互,但我找不到一种明确的方法来挑选一张工作表并将其保存为自己的文档而不会丢失分组。

标签: pythonexcelpandasxlrd

解决方案


这是我的完整答案。我使用了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

推荐阅读