Py学习  »  Python

OpenClaw写的Execl每个工作表转png图片Python源代码

GISAI • 7 月前 • 282 次点击  
"""
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)



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/194002