使用 Python 将 Excel 文件中的所有 sheet
页拆分成独立的工作簿文件,并保留所有格式和内容(包括公式、样式、图表、数据验证等) ,是一个常见的需求。
然而,标准的 Python 数据处理库如 pandas
和 openpyxl
不支持完整地复制格式和图表等内容 。要实现“原模原样”的复制,我们需要借助更强大的库:
✅ 推荐方案:使用 win32com.client
(仅限 Windows)
📌 原理说明:
win32com.client
是 Python 对 Windows COM 自动化接口的封装。- 它可以调用 Microsoft Excel 应用程序本身的功能,从而实现完全保留原始格式、图表、公式等 的复制。
✅ 步骤如下:
1. 安装依赖
pip install pywin32
⚠️ 注意:此方法只能在 Windows 系统 上运行,且需要安装了 Microsoft Excel 。
2. 示例代码
import os
import win32com.client as win32
def split_excel_sheets_to_workbooks(input_file, output_folder=None):
"""
将一个Excel文件的所有sheet分别保存为独立的工作簿文件。
参数:
input_file (str): 原始Excel文件路径
output_folder (str): 输出目录(默认为原文件所在目录)
"""
# 如果未指定输出目录,则创建与原文件同目录下的 "split_sheets" 文件夹
if not output_folder:
base_dir = os.path.dirname(input_file)
output_folder = os.path.join(base_dir, "split_sheets")
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 启动 Excel 应用程序
excel = win32.Dispatch("Excel.Application")
excel.Visible = False # 不显示 Excel 界面
excel.DisplayAlerts = False # 禁止弹窗
try:
# 打开原始工作簿
workbook = excel.Workbooks.Open(os.path.abspath(input_file))
for sheet in workbook.Sheets:
# 复制当前工作表到新工作簿
sheet.Copy()
new_workbook = excel.ActiveWorkbook
# 构建保存路径
safe_sheet_name = sheet.Name.replace('/', '_').replace('\\', '_') \
.replace('?', '_').replace('*', '_') \
.replace('[', '_').replace(']', '_')
output_path = os.path.join(output_folder, f"{safe_sheet_name}.xlsx")
# 保存并关闭新工作簿
new_workbook.SaveAs(Filename=output_path)
new_workbook.Close(SaveChanges=False)
workbook.Close(SaveChanges=False)
excel.Quit()
print(f"✅ 拆分完成,文件已保存至: {output_folder}")
except Exception as e:
print(f"❌ 发生错误: {e}")
finally:
del excel # 释放资源
# 使用示例
if __name__ == "__main__":
input_excel = r"C:\path\to\your\file.xlsx"
split_excel_sheets_to_workbooks(input_excel)
✅ 输出效果:
- 每个 sheet 都会被保存为一个独立的
.xlsx
文件; - 文件名以 sheet 名命名(自动替换非法字符);
- 保留所有原始格式、图表、公式、批注、数据验证、条件格式等 ;
- 输出目录默认为原文件目录下的
split_sheets
文件夹。
🧪 测试建议:
- 可先用一个小的测试 Excel 文件尝试;
- 确保你的电脑上已安装 Microsoft Excel ;
- 该脚本不会修改原文件,只读取并导出。