"""
Excel 工作表导出为长图片脚本
功能:将 Excel 文件中的每个工作表导出为 PNG 长图片
"""
import os
import win32com.client as win32
# ============ 配置区域 ============
# 源文件路径
source_file = r"E:\2026\Pro\data\chp9excel\合并工作表.xlsx"
# 输出文件夹(桌面\pic)
desktop = os.path.join(os.environ['USERPROFILE'], 'Desktop')
pic_folder = os.path.join(desktop, 'pic')
# =================================
def export_sheets_to_png(source_file, pic_folder):
"""
将 Excel 每个工作表导出为 PNG 长图片
参数:
source_file: Excel 源文件路径
pic_folder: 输出图片文件夹
"""
# 创建输出文件夹
os.makedirs(pic_folder, exist_ok=True)
print(f"输出文件夹:{pic_folder}")
# 打开 Excel 应用
excel = win32.Dispatch('Excel.Application')
excel.Visible = True # 需要可见才能正确复制图片
excel.DisplayAlerts = False
# 打开工作簿
wb = excel.Workbooks.Open(source_file)
# 遍历每个工作表
for i, ws in enumerate(wb.Worksheets, start=1):
ws_name = ws.Name
# 清理文件名中的非法字符(\/:*?"<>|)
safe_name = "".join([c for c
in ws_name if c not in r'<>:"/\|?*'])
print(f"\n处理工作表 {i}: {ws_name}")
# 激活工作表
ws.Activate()
# 获取已用区域
used_range = ws.UsedRange
last_row = used_range.Rows.Count + used_range.Row - 1
last_col = used_range.Columns.Count + used_range.Column - 1
# 检查是否有数据
if last_row > 1 and last_col > 0:
# 选择已用区域
range_addr = f"A1:{ws.Cells(last_row, last_col).Address}"
range_obj = ws.Range(range_addr)
range_obj.Select()
# 复制为图片(屏幕显示质量,图片格式)
range_obj.CopyPicture(Appearance=1, Format=1)
# 创建临时图表对象来保存图片
ch = ws.ChartObjects().Add(0, 0, range_obj.Width, range_obj.Height)
ch.Chart.Paste()
# 导出为 PNG
png_path = os.path.join(pic_folder, f"{safe_name}.png")
ch.Chart.Export(png_path, 'PNG')
# 删除临时图表
ch.Delete()
print(f" ✓ 已保存:{png_path}")
else:
print(f" ⊘ 跳过空工作表")
# 关闭工作簿和 Excel
wb.Close(False)
excel.Quit()
print(f"\n✅ 所有工作表已导出到:{pic_folder}")
if __name__ == "__main__":
export_sheets_to_png(source_file, pic_folder)
