利用Python实现Excel报表自动化的操作指南

作者:

文章目录
  • 在职场中,数据分析的终极目标往往是生成一份清晰、专业的报表。 数据分析完成,却要花费大量时间手工制图:打开Excel,选中数据,插入图表,一个个调整标题、坐标轴、颜色,繁琐且容易审美疲劳。 制作出的报表枯燥无味,只有密密麻麻的数字,缺乏可视化图表的直观冲击力。 报表完成后,老板要求导出为专业PDF报告,但Excel转PDF格式混乱,排版变形,需要反复调整。 这些重复、低效的报表生成任务,不仅消耗你的精力,更影响你的专业形象和职场决策效率 今天,我将带你进入Python报表自动化的终极世界!我们将手把手教你如何利用Python数据可视化库Matplotlib/Seaborn,结合openpyxl和PyMuPDF,轻松实现: Excel图表自动化嵌入: 让你的数据报表“会说话”。 专业PDF报告生成: 自动排版,告别格式烦恼。 一键式报表输出: 全面加速你的数据呈现和分发! 最终,你将拥有一个强大的**“智能报表生成系统”,成为职场中不可或缺的数据分析高手!
  • 数据可视化是核心。Matplotlib和Seaborn是Python中最流行、功能最强大的两个数据可视化库。 作用:Matplotlib: Python绘图的基础库,提供高度灵活的绘图控制。Seaborn: 基于Matplotlib,提供更高级、更美观的统计图表绘制接口,让图表更具专业感。 安装: `pip install matplotlib seaborn openpyxl`
  • 绘制好图表后,我们最终还是要把它们放到Excel报表中。openpyxl库虽然不能像Excel本身那样直接操作嵌入式图表对象,但我们可以将生成的图片(图表)嵌入到Excel指定位置,打造一个图文并茂的自动化报表! 作用: 将Python生成的图表保存为图片文件,然后用openpyxl将这些图片插入到Excel工作表中。
  • Excel报表是数据呈现的第一步,但最终分发给老板、客户时,通常需要专业PDF报告。手动从Excel导出PDF,往往排版混乱,图片位置不对。Python能帮你一键将包含数据和图表的Excel报表,转换成精美且排版专业的PDF文件! 作用: PyMuPDF (fitz): 一个高性能的PDF处理库,能将Excel工作表渲染成PDF页面。 reportlab (可选): 如果需要更复杂的自定义排版,可以利用它直接从数据生成PDF。这里我们主要聚焦于Excel到PDF的转换。 安装PyMuPDF: pip install PyMuPDF
  • 我们深入学习了Pandas、Matplotlib/Seaborn、Openpyxl和PyMuPDF等库,实现了:Python生成Excel报表: 从数据读取、处理,到图表绘制与嵌入,再到专业PDF导出,实现报表自动化。 Excel图表自动化: 告别手动制图,让你的数据通过柱状图、折线图等可视化Excel图表“会说话”。 Python导出PDF报告: 轻松将复杂的Excel报表转换为精美PDF,告别PDF转换麻烦。 数据呈现自动化: 整个流程一站式搞定,全面提升你的数据呈现效率。 现在,你不再需要为手工制图耗时、报表枯燥无味而烦恼。你的自动化报表生成脚本将帮你:
  • 通过本篇文章,你已经掌握了自动化报表生成的强大能力,为你的办公自动化之旅又增添了一个重量级技能!你学会了如何利用Python的数据可视化和PDF处理能力,高效地生成和分发专业报表。 除了今天学到的报表生成功能,你还希望Python能帮你实现哪些更复杂的自动化报表需求?比如:根据数据智能生成报告文字摘要?自动识别报表中的异常点并预警? 以上就是利用Python实现Excel报表自动化的操作指南的详细内容,更多关于Python Excel报表自动化的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python数据处理之Excel报表自动化生成与分析 Python 实现自动化Excel报表的步骤 python实现自动化报表功能(Oracle/plsql/Excel/多线程)
  • 目录
    • 手工制图耗时,报表枯燥无味,PDF转换麻烦!
    • 1. python绘制常见图表:Matplotlib与Seaborn速成
      • 1.1 数据可视化基础:柱状图、折线图、饼图、散点图
      • 1.2 图表美化技巧:让你的数据更能吸引人
    • 2. 将图表嵌入Excel:打造动态交互式自动化报表
      • 2.1 openpyxl与图表结合:Python将图片嵌入Excel指定位置
      • 2.2 更新数据后自动刷新图表:动态报表的魅力
    • 3. 专业PDF报告生成:Python一键将Excel报表转换为精美PDF!
      • 3.1 PyMuPDF:高效导出Excel工作表为PDF
      • 3.2 定制PDF报告:添加页眉页脚、页码、封面
    • 4. 阶段性成果:你的“智能报表生成系统”!
      • 5. 尾声:报表自动化,开启职场新高度!

        在职场中,数据分析的终极目标往往是生成一份清晰、专业的报表。

        数据分析完成,却要花费大量时间手工制图:打开Excel,选中数据,插入图表,一个个调整标题、坐标轴、颜色,繁琐且容易审美疲劳。

        制作出的报表枯燥无味,只有密密麻麻的数字,缺乏可视化图表的直观冲击力。

        报表完成后,老板要求导出为专业PDF报告,但Excel转PDF格式混乱,排版变形,需要反复调整。

        这些重复、低效的报表生成任务,不仅消耗你的精力,更影响你的专业形象和职场决策效率

        今天,我将带你进入Python报表自动化的终极世界!我们将手把手教你如何利用Python数据可视化库Matplotlib/Seaborn,结合openpyxl和PyMuPDF,轻松实现:

        Excel图表自动化嵌入: 让你的数据报表“会说话”。

        专业PDF报告生成: 自动排版,告别格式烦恼。

        一键式报表输出: 全面加速你的数据呈现和分发!

        最终,你将拥有一个强大的**“智能报表生成系统”,成为职场中不可或缺的数据分析高手!

        数据可视化是核心。Matplotlib和Seaborn是Python中最流行、功能最强大的两个数据可视化库。

        作用:
        Matplotlib: Python绘图的基础库,提供高度灵活的绘图控制。
        Seaborn: 基于Matplotlib,提供更高级、更美观的统计图表绘制接口,让图表更具专业感。

        安装:

        `pip install matplotlib seaborn openpyxl` 
        

        这些是报表中最常见、最能直观呈现数据趋势和分布的图表类型。

        场景: 你需要根据销售数据绘制柱状图展示产品销量对比,折线图展示销售趋势,饼图展示市场份额。

        方案: Matplotlib和Seaborn提供简洁的API,几行代码就能绘制出专业图表。

        代码:

        import matplotlib.pyplot as plt
        import seaborn as sns
        import pandas as pd
        import os
        
        # 设置matplotlib支持中文显示,防止乱码(仅Windows/Linux可能需要)
        plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体
        plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
        
        def create_common_charts(data_df, output_folder="generated_charts"):
            """
            绘制常见的柱状图、折线图、饼图、散点图。
            这是Python数据可视化和Excel图表自动化的基础。
            :param data_df: 包含数据的Pandas DataFrame
            :param output_folder: 图表保存的文件夹
            """
            os.makedirs(output_folder, exist_ok=True) # 确保输出文件夹存在
        
            print("🚀 正在绘制常见图表...")
        
            # 1. 柱状图 (Bar Chart):适合比较分类数据
            plt.figure(figsize=(8, 5)) # 设置图表尺寸
            sns.barplot(x='产品', y='销量', data=data_df) # Seaborn更简洁地绘制柱状图
            plt.title('各产品销量对比') # 图表标题
            plt.xlabel('产品名称'); plt.ylabel('销量') # 坐标轴标签
            plt.savefig(os.path.join(output_folder, '产品销量柱状图.png'))
            plt.close() # 关闭当前图表,释放内存
            print("   ✅ 产品销量柱状图已生成。")
        
            # 2. 折线图 (Line Chart):适合展示趋势
            plt.figure(figsize=(10, 6))
            sns.lineplot(x='月份', y='销售额', data=data_df, marker='o')
            plt.title('月度销售额趋势')
            plt.xlabel('月份'); plt.ylabel('销售额')
            plt.grid(True) # 显示网格
            plt.savefig(os.path.join(output_folder, '月度销售额折线图.png'))
            plt.close()
            print("   ✅ 月度销售额折线图已生成。")
        
            # 3. 饼图 (Pie Chart):适合展示占比
            plt.figure(figsize=(7, 7))
            # 计算产品销量占比
            product_sales_sum = data_df.groupby('产品')['销量'].sum()
            plt.pie(product_sales_sum, labels=product_sales_sum.index, autopct='%1.1f%%', startangle=90)
            plt.title('产品销量占比')
            plt.axis('equal') # 确保饼图是圆形
            plt.savefig(os.path.join(output_folder, '产品销量饼图.png'))
            plt.close()
            print("   ✅ 产品销量饼图已生成。")
        
            # 4. 散点图 (Scatter Plot):适合展示两个变量的关系
            plt.figure(figsize=(8, 5))
            sns.scatterplot(x='销售额', y='广告投入', data=data_df)
            plt.title('销售额与广告投入关系')
            plt.xlabel('销售额'); plt.ylabel('广告投入')
            plt.savefig(os.path.join(output_folder, '销售额与广告投入散点图.png'))
            plt.close()
            print("   ✅ 销售额与广告投入散点图已生成。")
        
            print("✨ 常见图表绘制完成!")
        
        if __name__ == "__main__":
            # 准备测试数据 (DataFrame)
            data = {
                '产品': ['A', 'B', 'C', 'D','E', 'F'],
                '销量': [150, 200, 120, 180, 220, 170],
                '月份': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
                '销售额': [1000, 1200, 900, 1500, 1300, 1600],
                '广告投入': [200, 250, 180, 300, 260, 320]
            }
            df_charts = pd.DataFrame(data) # 简化DataFrame,实际可以从Excel读取
        
            output_charts_dir = os.path.expanduser("D://360MoveData//Users//Administrator//Desktop")
            os.makedirs(output_charts_dir, exist_ok=True)
            
            create_common_charts(df_charts, output_charts_dir)
        

        操作步骤:

        安装库: pip install matplotlib seaborn pandas。

        修改代码路径: 复制上方代码到VS Code,保存为create_charts.py。修改 output_charts_dir。

        准备数据: 代码中提供了示例DataFrame,你也可以从Excel读取数据来创建DataFrame。

        运行: 在VS Code终端运行 python create_charts.py。

        效果展示:

        仅仅绘制出图表还不够,专业的数据可视化需要精心的美化。Python的Matplotlib和Seaborn提供了丰富的接口,让你自定义图表的每一个细节,让你的数据呈现更具说服力。

        标题与坐标轴标签: 清晰明确,直接点明数据含义。

        图例: 解释图表中不同元素的含义。

        颜色与风格: 选择合适的配色方案,提升视觉吸引力。

        网格与刻度: 辅助阅读,但不喧宾夺主。

        绘制好图表后,我们最终还是要把它们放到Excel报表中。openpyxl库虽然不能像Excel本身那样直接操作嵌入式图表对象,但我们可以将生成的图片(图表)嵌入到Excel指定位置,打造一个图文并茂的自动化报表!

        作用: 将Python生成的图表保存为图片文件,然后用openpyxl将这些图片插入到Excel工作表中。

        场景: 你已经用Python生成了多个精美图表,但如何将它们自动放到Excel报表对应的位置,而不是手动截图粘贴?

        方案: openpyxl的drawing.image模块能实现图片插入,精确控制图片在Excel中的位置和大小。
        代码:

        from openpyxl import Workbook
        from openpyxl.drawing.image import Image as ExcelImage # 导入openpyxl的图片类
        import os
        import matplotlib.pyplot as plt # 用于生成示例图表
        import pandas as pd
        
        # 假设 generate_common_charts 函数已在前面定义 (用于生成图表图片)
        # 这里仅提供简化版,实际应调用你完整的图表生成逻辑
        
        def _create_sample_chart_image(output_path):
            """生成一个简单的柱状图作为图片,用于嵌入Excel"""
            data = {'产品': ['A', 'B', 'C'], '销量': [100, 150, 80]}
            df = pd.DataFrame(data)
            plt.figure(figsize=(6, 4))
            plt.bar(df['产品'], df['销量'])
            plt.title('产品销量示意图')
            plt.savefig(output_path)
            plt.close()
            return output_path
        
        def embed_image_in_excel(excel_file_path, image_file_path, cell_anchor="A1"):
            """
            将图片文件嵌入Excel工作表。
            这是Excel图表自动化和自动化报表的关键。
            :param excel_file_path: 目标Excel文件路径
            :param image_file_path: 要嵌入的图片文件路径
            :param cell_anchor: 图片左上角锚定的单元格位置 (如 "A1", "C5")
            """
            if not os.path.exists(image_file_path): return print(f"❌ 图片文件不存在:{image_file_path}")
            os.makedirs(os.path.dirname(excel_file_path), exist_ok=True)
        
            try:
                # 如果Excel文件不存在,则创建新的;如果存在,则加载
                if os.path.exists(excel_file_path):
                    workbook = Workbook() # load_workbook(excel_file_path) # 如果需要修改现有文件
                    sheet = workbook.active
                else:
                    workbook = Workbook()
                    sheet = workbook.active
                sheet.title = "报表与图表"
        
                # 添加一些示例数据 (可选)
                sheet['A1'] = "数据总览"
                sheet['A2'] = "区域"
                sheet['B2'] = "销售额"
                sheet['A3'] = "华东"
                sheet['B3'] = 10000
        
                # **核心操作:创建Image对象并添加到工作表**
                img = ExcelImage(image_file_path)
                # 将图片添加到工作表,并锚定到指定单元格
                sheet.add_image(img, cell_anchor) 
        
                workbook.save(excel_file_path)
                print(f"✅ 图片 '{os.path.basename(image_file_path)}' 已成功嵌入Excel:'{excel_file_path}'")
                workbook.close()
            except Exception as e:
                print(f"❌ 嵌入图片到Excel失败:{e}")
        
        if __name__ == "__main__":
            output_excel_path = os.path.expanduser("~/Desktop/report_with_chart.xlsx")
            chart_image_path = os.path.expanduser("~/Desktop/temp_chart.png")
        
            # 1. 先生成一张图表图片
            _create_sample_chart_image(chart_image_path)
        
            # 2. 将图表图片嵌入Excel
            embed_image_in_excel(output_excel_path, chart_image_path, cell_anchor="C5")
        

        操作步骤:

        准备环境: pip install openpyxl matplotlib pandas。

        修改代码路径: 修改 output_excel_path 和 chart_image_path。

        运行: 运行 python embed_chart_excel.py。

        效果展示:

        openpyxl直接嵌入的是图片,它本身不是Excel“活”的图表对象,不能直接随数据更新而刷新。但是,我们可以通过自动化流程实现“逻辑上的自动刷新”:每次数据更新后,重新运行Python脚本:
        读取最新数据。

        重新生成图表图片。
        重新嵌入Excel。
        虽然不是Excel内部的“活”链接,但对于自动化报表生成而言,这种“重新生成”的方式同样高效,并且能保证图表始终是最新数据的反映。
        [表格:Python嵌入图表与Excel原生图表对比]

        特性 Python openpyxl嵌入图片图表 Excel原生图表
        生成方式 Python绘制后保存为图片,再插入 Excel内建功能创建
        数据联动 不直接联动,需重新运行脚本更新 自动联动数据源,数据变化图表刷新
        定制自由度 极高(Matplotlib/Seaborn所有功能) 相对受限于Excel功能
        自动化程度 易于完全自动化(生成+嵌入) 宏录制/VBA可自动化,但学习成本高
        文件大小 通常会略大(嵌入图片) 相对小
        图注:Python嵌入图表与Excel原生图表对比,选择最适合你的报表自动化方案。

        Excel报表是数据呈现的第一步,但最终分发给老板、客户时,通常需要专业PDF报告。手动从Excel导出PDF,往往排版混乱,图片位置不对。Python能帮你一键将包含数据和图表的Excel报表,转换成精美且排版专业的PDF文件!

        作用:

        PyMuPDF (fitz): 一个高性能的PDF处理库,能将Excel工作表渲染成PDF页面。

        reportlab (可选): 如果需要更复杂的自定义排版,可以利用它直接从数据生成PDF。这里我们主要聚焦于Excel到PDF的转换。

        安装PyMuPDF:

        pip install PyMuPDF
        

        场景: 制作完Excel报表(含数据和图表),需要导出为PDF文件进行分发,但Excel自带的导出功能效果不佳。

        方案: PyMuPDF可以精确地将Excel的每个工作表转换为PDF页面,并保持较好的排版。

        代码:

        import fitz # PyMuPDF库
        import pandas as pd
        import os
        from PIL import Image, ImageDraw, ImageFont # 用于文字渲染到图片,或处理图表图片
        import io # 用于内存中的文件操作
        import matplotlib.pyplot as plt # 假设图表已生成为图片
        
        # 设置字体以支持中文,防止PDF中出现乱码
        try:
            # 尝试加载常见的中文字体,如SimHei (黑体)
            # 注意:确保你的系统中有这些字体文件,或提供它们的完整路径
            potential_font_paths = [
            "C:/Windows/Fonts/simhei.ttf",  # 黑体
            "C:/Windows/Fonts/msyh.ttc",    # 微软雅黑
            "C:/Windows/Fonts/arial.ttf"    # 常用英文字体,如果只需要数字和英文页码
        ]
            for pfp in potential_font_paths:
             if os.path.exists(pfp):
                pdf_font_path = pfp
                print(f"ℹ️ 已找到并使用字体:{pdf_font_path}")
                break
            # 或者对于Linux: "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc"
            # 或者尝试 Arial 作为英文默认字体
            ImageFont.truetype(pdf_font_path, 1) # 尝试加载,如果失败会抛异常
        except IOError:
            pdf_font_path = None # 如果找不到自定义字体,则使用fitz的默认字体
        
        def excel_to_pdf_conversion(excel_path, pdf_path, chart_image_paths=[]):
            """
            将Excel文件内容(数据+图表图片)转换为PDF文件。
            这是一个结合了数据读取、图表图片嵌入的Python导出PDF报告的核心功能。
            :param excel_path: 源Excel数据文件路径
            :param pdf_path: 输出PDF文件路径
            :param chart_image_paths: 可选,要嵌入PDF的图表图片文件路径列表
            """
            if not os.path.exists(excel_path):
                print(f"❌ Excel文件不存在:{excel_path}")
                return False
            
            os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
        
            print(f"🚀 正在将Excel文件 '{os.path.basename(excel_path)}' 内容转换为PDF...")
            doc = fitz.open() # 创建一个新PDF文档
        
            try:
                # 1. 从Excel读取数据 (只读取数据,不关心格式)
                df = pd.read_excel(excel_path)
                
                # 2. 将DataFrame数据转换为文本或简单表格图片,并添加到PDF
                # 这是为了将Excel的“数据”部分转换为PDF可显示的内容
                # 最简单粗暴的方法是:将DataFrame转为字符串,然后渲染到图片,再插入
                # 更高级可以转为HTML,然后用支持HTML的库转PDF
                
                # 创建一个临时图片来渲染DataFrame的文本内容
                text_img_width = 800 # 渲染文本到图片的宽度
                text_img_height_per_line = 20 # 每行高度
                
                # 简化:只把DataFrame的前15行转成字符串添加到PDF
                df_str = df.to_string(index=False, header=True, max_rows=15, max_cols=50)
                
                # 计算文本图片高度
                text_lines = df_str.split('n')
                text_img_height = len(text_lines) * text_img_height_per_line + 50 # 50为边距
        
                # 创建空白图片,用于绘制文本
                text_img_pil = Image.new('RGB', (text_img_width, text_img_height), color = 'white')
                draw = ImageDraw.Draw(text_img_pil)
                
                # 设置字体
                try:
                    # 尝试加载PDF中文字体,用于图片渲染
                    font_for_text_img = ImageFont.truetype(pdf_font_path or "arial.ttf", 14) 
                except Exception:
                    font_for_text_img = ImageFont.load_default()
        
                # 绘制文本
                y_offset = 20
                for line in text_lines:
                    draw.text((20, y_offset), line, font=font_for_text_img, fill=(0, 0, 0))
                    y_offset += text_img_height_per_line
                
                # 将文本图片保存到内存
                img_byte_arr = io.BytesIO()
                text_img_pil.save(img_byte_arr, format='PNG')
                img_byte_arr = img_byte_arr.getvalue()
        
                # 添加新页面并插入文本图片
                #a4_page_rect = fitz.PAPERSIZE.A4 
              # 从矩形对象中获取宽度和高度
                # a4_width = a4_page_rect.width
                # a4_height = a4_page_rect.height
                a4_width_points = 595.276
                a4_height_points = 841.890
              # 使用获取到的 A4 宽度和高度创建新页面
                page = doc.new_page(width=a4_width_points, height=a4_height_points) # A4尺寸
               # page = doc.new_page(width=fitz.A4[0], height=fitz.A4[1]) # A4尺寸
                # 计算图片在页面上的位置,居中放置
                page_width = page.rect.width
                page_height = page.rect.height
                img_rect = fitz.Rect(50, 50, 50 + text_img_width, 50 + text_img_height) # 放置在页面左上角偏移50
        
                # 检查图片是否超出页面,如果超出则调整大小
                if img_rect.width > page_width - 100 or img_rect.height > page_height - 100:
                    scale_w = (page_width - 100) / text_img_width
                    scale_h = (page_height - 100) / text_img_height
                    scale = min(scale_w, scale_h)
                    img_rect = fitz.Rect(50, 50, 50 + text_img_width * scale, 50 + text_img_height * scale)
        
                page.insert_image(img_rect, stream=img_byte_arr)
                
                # 3. 嵌入图表图片 (如果有的话,每个图表一张新页面)
                if chart_image_paths:
                    for i, chart_path in enumerate(chart_image_paths):
                        if not os.path.exists(chart_path):
                            print(f"⚠️ 图表图片文件不存在,跳过:{chart_path}")
                            continue
                        
                        # 为每个图表创建新页面
                        #a4_page_rect = fitz.PAPERSIZE.A4 
              # 从矩形对象中获取宽度和高度
                        # a4_width = a4_page_rect.width
                        # a4_height = a4_page_rect.height
                        a4_width_points = 595.276
                        a4_height_points = 841.890
              # 使用获取到的 A4 宽度和高度创建新页面
                        chart_page = doc.new_page(width=a4_width_points, height=a4_height_points) # A4尺寸
                       # chart_page = doc.new_page(width=fitz.A4[0], height=fitz.A4[1])
                        
                        # 插入图表图片,自适应页面大小
                        # 获取图片原始尺寸
                        try:
                            with Image.open(chart_path) as chart_img_pil:
                                chart_w, chart_h = chart_img_pil.size
                        except Exception:
                            print(f"❌ 无法读取图表图片尺寸:{chart_path}")
                            continue
        
                        # 计算图片在页面上的放置位置和大小,使其适应页面
                        page_rect = chart_page.rect
                        padding = 50 # 边距
                        available_w = page_rect.width - 2 * padding
                        available_h = page_rect.height - 2 * padding
                        
                        scale = min(available_w / chart_w, available_h / chart_h)
                        
                        final_w = chart_w * scale
                        final_h = chart_h * scale
                        
                        insert_rect = fitz.Rect(
                            (page_rect.width - final_w) / 2, # 居中
                            (page_rect.height - final_h) / 2, # 居中
                            (page_rect.width + final_w) / 2,
                            (page_rect.height + final_h) / 2
                        )
                        
                        chart_page.insert_image(insert_rect, filename=chart_path)
                        print(f"   ✅ 嵌入图表:{os.path.basename(chart_path)}")
        
                # 4. 定制PDF:添加页码 (可选,作为定制PDF的示例)
                for page_num in range(doc.page_count):
                    page = doc.load_page(page_num)
                    page_text = f"Page {page_num + 1} / {doc.page_count}" # 页码文本
        
                    # 插入文本到页面
                    # 使用默认字体 (None) 或明确指定一个PyMuPDF内置的通用字体,如 "helv" (Helvetica)
                    # 对于页码这种简单文本,通常内置字体就足够了
                    page.insert_text(
                        (page.rect.width - 100, page.rect.height - 30), # 坐标 (x, y)
                        page_text,
                        # fontname="helv", # 明确使用Helvetica,通常是安全的内置字体
                        # fontname=None,   # 或者让PyMuPDF自动选择默认字体
                        fontsize=9,      # 字体大小可以稍小
                        color=(0, 0, 0)  # 黑色
                    )
                    # 如果需要显示中文页码(如“第1页”),且必须使用外部字体:
                    # 这部分会更复杂,需要确保fontfile能被fitz正确加载,并注册
                    # 通常需要一个更通用的字体注册函数,例如:
                    # if chinese_font_path and os.path.exists(chinese_font_path):
                    #     # doc.register_font(fontfile=chinese_font_path, fontname="my_chinese_font")
                    #     page.insert_text((x,y), chinese_text, fontname="my_chinese_font", fontsize=10)
                    # 否则,中文可能会显示为方块或乱码。
        
                doc.save(pdf_path)
                print(f"✅ Excel报表已成功转换为PDF:'{pdf_path}'")
                return True
            except Exception as e:
                print(f"❌ 转换为PDF失败:{e}")
                return False
            finally:
                doc.close()
        if __name__ == "__main__":
            # --- 准备测试数据 ---
            # 1. 准备Excel文件
            report_excel_path = os.path.expanduser("~/Desktop/my_report_data.xlsx") 
            # 简单创建模拟的Excel文件以避免找不到文件
            if not os.path.exists(report_excel_path):
                pd.DataFrame({'Item': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O'], 
                              'Value': [10, 20, 15, 25, 30, 12, 18, 22, 28, 11, 19, 23, 27, 31, 14]}).to_excel(report_excel_path, index=False)
                print(f"临时Excel文件 '{os.path.basename(report_excel_path)}' 已创建。")
            
            # 2. 准备图表图片 (假设你用matplotlib/seaborn生成过)
            chart1_path = os.path.expanduser("~/Desktop/chart_sales_bar.png")
            chart2_path = os.path.expanduser("~/Desktop/chart_monthly_trend.png")
            
            # 简单创建模拟图表图片 (实际需要你运行matplotlib/seaborn生成)
            if not os.path.exists(chart1_path):
                plt.figure(figsize=(6, 4)); plt.bar(['A','B'],[10,20]); plt.title('Sales A vs B'); plt.savefig(chart1_path); plt.close()
                print(f"临时图表文件 '{os.path.basename(chart1_path)}' 已创建。")
            if not os.path.exists(chart2_path):
                plt.figure(figsize=(6, 4)); plt.plot([1,2,3],[10,20,15]); plt.title('Trend'); plt.savefig(chart2_path); plt.close()
                print(f"临时图表文件 '{os.path.basename(chart2_path)}' 已创建。")
        
            output_pdf_path = os.path.expanduser("D://360MoveData//Users//Administrator//Desktop//excel//professional_report.pdf")
            
            # --- 运行转换 ---
            excel_to_pdf_conversion(report_excel_path, output_pdf_path, 
                                    chart_image_paths=[chart1_path, chart2_path])
        

        操作步骤:

        修改代码路径: 修改 report_excel_path 和 output_pdf_path。

        运行: 运行 python excel_to_pdf.py。

        效果展示:

        除了简单转换,你还可以通过Python更精细地定制PDF报告,例如添加页眉页脚、页码、封面,甚至合并多个PDF文件,打造 truly 专业PDF报告。

        作用: PyMuPDF(或ReportLab等)提供了创建和编辑PDF的强大能力,你可以将文本、图片、甚至矢量图形添加到PDF的任何位置。

        例如,可以实现:
        统一页眉页脚: 自动为每一页添加公司Logo、报告名称、页码。
        动态页码: 根据总页数自动生成页码,如“第X页/共Y页”。
        定制封面: 为你的PDF报告生成一个美观的定制封面页。

        这些高级定制能力,将让你的自动化报表生成达到新的高度,让你的数据呈现更具说服力!

        我们深入学习了Pandas、Matplotlib/Seaborn、Openpyxl和PyMuPDF等库,实现了:
        Python生成Excel报表: 从数据读取、处理,到图表绘制与嵌入,再到专业PDF导出,实现报表自动化。

        Excel图表自动化: 告别手动制图,让你的数据通过柱状图、折线图等可视化Excel图表“会说话”。

        Python导出PDF报告: 轻松将复杂的Excel报表转换为精美PDF,告别PDF转换麻烦。

        数据呈现自动化: 整个流程一站式搞定,全面提升你的数据呈现效率。

        现在,你不再需要为手工制图耗时、报表枯燥无味而烦恼。你的自动化报表生成脚本将帮你:

        通过本篇文章,你已经掌握了自动化报表生成的强大能力,为你的办公自动化之旅又增添了一个重量级技能!你学会了如何利用Python的数据可视化和PDF处理能力,高效地生成和分发专业报表。

        除了今天学到的报表生成功能,你还希望Python能帮你实现哪些更复杂的自动化报表需求?比如:根据数据智能生成报告文字摘要?自动识别报表中的异常点并预警?

        以上就是利用Python实现Excel报表自动化的操作指南的详细内容,更多关于Python Excel报表自动化的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • Python数据处理之Excel报表自动化生成与分析
        • Python 实现自动化Excel报表的步骤
        • python实现自动化报表功能(Oracle/plsql/Excel/多线程)

        站内搜索