python - 如何在保留分组的同时按工作表拆分 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 文档进行交互,但我找不到一种明确的方法来挑选一张工作表并将其保存为自己的文档而不会丢失分组。
解决方案
这是我的完整答案。我使用了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
推荐阅读
- youtube-api - Youtube API v3 - 管理其他人拥有的频道
- html - 根据Angular中的id获取多个Toggle Button值?
- linux - 无法在 ec2(主机)到 Mac(目标机)中运行 ansible playbook
- typescript - 函数重载与实现不兼容
- php - 使用 GMB API 将媒体添加到 GMB 位置会出现错误
- javascript - 道具不断返回未定义
- c++ - 指向成员函数的模板指针 - getter
- javascript - 通过jquery获取一些元素
- angularjs - 如何在 Angular 中保存表格的每个已编辑的行数据(版本 2 及以上)
- python - 如何从 ip2.txt 为我的 Cisco Backup 脚本获取密码、ip、启用密码和端口 ssh