最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python實(shí)現(xiàn)Excel報表自動化的操作指南

 更新時間:2025年11月14日 10:30:56   作者:愛分享的飄哥  
在職場中,數(shù)據(jù)分析的終極目標(biāo)往往是生成一份清晰、專業(yè)的報表,數(shù)據(jù)分析完成,卻要花費(fèi)大量時間手工制圖,制作出的報表枯燥無味,只有密密麻麻的數(shù)字,缺乏可視化圖表的直觀沖擊力,今天,我將帶你進(jìn)入Python報表自動化的終極世界,如何利用Python實(shí)現(xiàn)Excel報表自動化

手工制圖耗時,報表枯燥無味,PDF轉(zhuǎn)換麻煩!

在職場中,數(shù)據(jù)分析的終極目標(biāo)往往是生成一份清晰、專業(yè)的報表。

數(shù)據(jù)分析完成,卻要花費(fèi)大量時間手工制圖:打開Excel,選中數(shù)據(jù),插入圖表,一個個調(diào)整標(biāo)題、坐標(biāo)軸、顏色,繁瑣且容易審美疲勞。

制作出的報表枯燥無味,只有密密麻麻的數(shù)字,缺乏可視化圖表的直觀沖擊力。

報表完成后,老板要求導(dǎo)出為專業(yè)PDF報告,但Excel轉(zhuǎn)PDF格式混亂,排版變形,需要反復(fù)調(diào)整。

這些重復(fù)、低效的報表生成任務(wù),不僅消耗你的精力,更影響你的專業(yè)形象和職場決策效率

今天,我將帶你進(jìn)入Python報表自動化的終極世界!我們將手把手教你如何利用Python數(shù)據(jù)可視化庫Matplotlib/Seaborn,結(jié)合openpyxl和PyMuPDF,輕松實(shí)現(xiàn):

Excel圖表自動化嵌入: 讓你的數(shù)據(jù)報表“會說話”。

專業(yè)PDF報告生成: 自動排版,告別格式煩惱。

一鍵式報表輸出: 全面加速你的數(shù)據(jù)呈現(xiàn)和分發(fā)!

最終,你將擁有一個強(qiáng)大的**“智能報表生成系統(tǒng)”,成為職場中不可或缺的數(shù)據(jù)分析高手!

1. python繪制常見圖表:Matplotlib與Seaborn速成

數(shù)據(jù)可視化是核心。Matplotlib和Seaborn是Python中最流行、功能最強(qiáng)大的兩個數(shù)據(jù)可視化庫。

作用:
Matplotlib: Python繪圖的基礎(chǔ)庫,提供高度靈活的繪圖控制。
Seaborn: 基于Matplotlib,提供更高級、更美觀的統(tǒng)計圖表繪制接口,讓圖表更具專業(yè)感。

安裝:

`pip install matplotlib seaborn openpyxl` 

1.1 數(shù)據(jù)可視化基礎(chǔ):柱狀圖、折線圖、餅圖、散點(diǎn)圖

這些是報表中最常見、最能直觀呈現(xiàn)數(shù)據(jù)趨勢和分布的圖表類型。

場景: 你需要根據(jù)銷售數(shù)據(jù)繪制柱狀圖展示產(chǎn)品銷量對比,折線圖展示銷售趨勢,餅圖展示市場份額。

方案: Matplotlib和Seaborn提供簡潔的API,幾行代碼就能繪制出專業(yè)圖表。

代碼:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import os

# 設(shè)置matplotlib支持中文顯示,防止亂碼(僅Windows/Linux可能需要)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認(rèn)字體為黑體
plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號'-'顯示為方塊的問題

def create_common_charts(data_df, output_folder="generated_charts"):
    """
    繪制常見的柱狀圖、折線圖、餅圖、散點(diǎn)圖。
    這是Python數(shù)據(jù)可視化和Excel圖表自動化的基礎(chǔ)。
    :param data_df: 包含數(shù)據(jù)的Pandas DataFrame
    :param output_folder: 圖表保存的文件夾
    """
    os.makedirs(output_folder, exist_ok=True) # 確保輸出文件夾存在

    print("?? 正在繪制常見圖表...")

    # 1. 柱狀圖 (Bar Chart):適合比較分類數(shù)據(jù)
    plt.figure(figsize=(8, 5)) # 設(shè)置圖表尺寸
    sns.barplot(x='產(chǎn)品', y='銷量', data=data_df) # Seaborn更簡潔地繪制柱狀圖
    plt.title('各產(chǎn)品銷量對比') # 圖表標(biāo)題
    plt.xlabel('產(chǎn)品名稱'); plt.ylabel('銷量') # 坐標(biāo)軸標(biāo)簽
    plt.savefig(os.path.join(output_folder, '產(chǎn)品銷量柱狀圖.png'))
    plt.close() # 關(guān)閉當(dāng)前圖表,釋放內(nèi)存
    print("   ? 產(chǎn)品銷量柱狀圖已生成。")

    # 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) # 顯示網(wǎng)格
    plt.savefig(os.path.join(output_folder, '月度銷售額折線圖.png'))
    plt.close()
    print("   ? 月度銷售額折線圖已生成。")

    # 3. 餅圖 (Pie Chart):適合展示占比
    plt.figure(figsize=(7, 7))
    # 計算產(chǎn)品銷量占比
    product_sales_sum = data_df.groupby('產(chǎn)品')['銷量'].sum()
    plt.pie(product_sales_sum, labels=product_sales_sum.index, autopct='%1.1f%%', startangle=90)
    plt.title('產(chǎn)品銷量占比')
    plt.axis('equal') # 確保餅圖是圓形
    plt.savefig(os.path.join(output_folder, '產(chǎn)品銷量餅圖.png'))
    plt.close()
    print("   ? 產(chǎn)品銷量餅圖已生成。")

    # 4. 散點(diǎn)圖 (Scatter Plot):適合展示兩個變量的關(guān)系
    plt.figure(figsize=(8, 5))
    sns.scatterplot(x='銷售額', y='廣告投入', data=data_df)
    plt.title('銷售額與廣告投入關(guān)系')
    plt.xlabel('銷售額'); plt.ylabel('廣告投入')
    plt.savefig(os.path.join(output_folder, '銷售額與廣告投入散點(diǎn)圖.png'))
    plt.close()
    print("   ? 銷售額與廣告投入散點(diǎn)圖已生成。")

    print("? 常見圖表繪制完成!")

if __name__ == "__main__":
    # 準(zhǔn)備測試數(shù)據(jù) (DataFrame)
    data = {
        '產(chǎn)品': ['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,實(shí)際可以從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。

修改代碼路徑: 復(fù)制上方代碼到VS Code,保存為create_charts.py。修改 output_charts_dir。

準(zhǔn)備數(shù)據(jù): 代碼中提供了示例DataFrame,你也可以從Excel讀取數(shù)據(jù)來創(chuàng)建DataFrame。

運(yùn)行: 在VS Code終端運(yùn)行 python create_charts.py。

效果展示:

1.2 圖表美化技巧:讓你的數(shù)據(jù)更能吸引人

僅僅繪制出圖表還不夠,專業(yè)的數(shù)據(jù)可視化需要精心的美化。Python的Matplotlib和Seaborn提供了豐富的接口,讓你自定義圖表的每一個細(xì)節(jié),讓你的數(shù)據(jù)呈現(xiàn)更具說服力。

標(biāo)題與坐標(biāo)軸標(biāo)簽: 清晰明確,直接點(diǎn)明數(shù)據(jù)含義。

圖例: 解釋圖表中不同元素的含義。

顏色與風(fēng)格: 選擇合適的配色方案,提升視覺吸引力。

網(wǎng)格與刻度: 輔助閱讀,但不喧賓奪主。

2. 將圖表嵌入Excel:打造動態(tài)交互式自動化報表

繪制好圖表后,我們最終還是要把它們放到Excel報表中。openpyxl庫雖然不能像Excel本身那樣直接操作嵌入式圖表對象,但我們可以將生成的圖片(圖表)嵌入到Excel指定位置,打造一個圖文并茂的自動化報表!

作用: 將Python生成的圖表保存為圖片文件,然后用openpyxl將這些圖片插入到Excel工作表中。

2.1 openpyxl與圖表結(jié)合:Python將圖片嵌入Excel指定位置

場景: 你已經(jīng)用Python生成了多個精美圖表,但如何將它們自動放到Excel報表對應(yīng)的位置,而不是手動截圖粘貼?

方案: openpyxl的drawing.image模塊能實(shí)現(xiàn)圖片插入,精確控制圖片在Excel中的位置和大小。
代碼:

from openpyxl import Workbook
from openpyxl.drawing.image import Image as ExcelImage # 導(dǎo)入openpyxl的圖片類
import os
import matplotlib.pyplot as plt # 用于生成示例圖表
import pandas as pd

# 假設(shè) generate_common_charts 函數(shù)已在前面定義 (用于生成圖表圖片)
# 這里僅提供簡化版,實(shí)際應(yīng)調(diào)用你完整的圖表生成邏輯

def _create_sample_chart_image(output_path):
    """生成一個簡單的柱狀圖作為圖片,用于嵌入Excel"""
    data = {'產(chǎn)品': ['A', 'B', 'C'], '銷量': [100, 150, 80]}
    df = pd.DataFrame(data)
    plt.figure(figsize=(6, 4))
    plt.bar(df['產(chǎn)品'], df['銷量'])
    plt.title('產(chǎn)品銷量示意圖')
    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圖表自動化和自動化報表的關(guān)鍵。
    :param excel_file_path: 目標(biāo)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文件不存在,則創(chuàng)建新的;如果存在,則加載
        if os.path.exists(excel_file_path):
            workbook = Workbook() # load_workbook(excel_file_path) # 如果需要修改現(xiàn)有文件
            sheet = workbook.active
        else:
            workbook = Workbook()
            sheet = workbook.active
        sheet.title = "報表與圖表"

        # 添加一些示例數(shù)據(jù) (可選)
        sheet['A1'] = "數(shù)據(jù)總覽"
        sheet['A2'] = "區(qū)域"
        sheet['B2'] = "銷售額"
        sheet['A3'] = "華東"
        sheet['B3'] = 10000

        # **核心操作:創(chuàng)建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")

操作步驟:

準(zhǔn)備環(huán)境: pip install openpyxl matplotlib pandas。

修改代碼路徑: 修改 output_excel_path 和 chart_image_path。

運(yùn)行: 運(yùn)行 python embed_chart_excel.py。

效果展示:

2.2 更新數(shù)據(jù)后自動刷新圖表:動態(tài)報表的魅力

openpyxl直接嵌入的是圖片,它本身不是Excel“活”的圖表對象,不能直接隨數(shù)據(jù)更新而刷新。但是,我們可以通過自動化流程實(shí)現(xiàn)“邏輯上的自動刷新”:每次數(shù)據(jù)更新后,重新運(yùn)行Python腳本:
讀取最新數(shù)據(jù)。

重新生成圖表圖片。
重新嵌入Excel。
雖然不是Excel內(nèi)部的“活”鏈接,但對于自動化報表生成而言,這種“重新生成”的方式同樣高效,并且能保證圖表始終是最新數(shù)據(jù)的反映。
[表格:Python嵌入圖表與Excel原生圖表對比]

特性Python openpyxl嵌入圖片圖表Excel原生圖表
生成方式Python繪制后保存為圖片,再插入Excel內(nèi)建功能創(chuàng)建
數(shù)據(jù)聯(lián)動不直接聯(lián)動,需重新運(yùn)行腳本更新自動聯(lián)動數(shù)據(jù)源,數(shù)據(jù)變化圖表刷新
定制自由度極高(Matplotlib/Seaborn所有功能)相對受限于Excel功能
自動化程度易于完全自動化(生成+嵌入)宏錄制/VBA可自動化,但學(xué)習(xí)成本高
文件大小通常會略大(嵌入圖片)相對小
圖注:Python嵌入圖表與Excel原生圖表對比,選擇最適合你的報表自動化方案。

3. 專業(yè)PDF報告生成:Python一鍵將Excel報表轉(zhuǎn)換為精美PDF!

Excel報表是數(shù)據(jù)呈現(xiàn)的第一步,但最終分發(fā)給老板、客戶時,通常需要專業(yè)PDF報告。手動從Excel導(dǎo)出PDF,往往排版混亂,圖片位置不對。Python能幫你一鍵將包含數(shù)據(jù)和圖表的Excel報表,轉(zhuǎn)換成精美且排版專業(yè)的PDF文件!

作用:

PyMuPDF (fitz): 一個高性能的PDF處理庫,能將Excel工作表渲染成PDF頁面。

reportlab (可選): 如果需要更復(fù)雜的自定義排版,可以利用它直接從數(shù)據(jù)生成PDF。這里我們主要聚焦于Excel到PDF的轉(zhuǎn)換。

安裝PyMuPDF:

pip install PyMuPDF

3.1 PyMuPDF:高效導(dǎo)出Excel工作表為PDF

場景: 制作完Excel報表(含數(shù)據(jù)和圖表),需要導(dǎo)出為PDF文件進(jìn)行分發(fā),但Excel自帶的導(dǎo)出功能效果不佳。

方案: PyMuPDF可以精確地將Excel的每個工作表轉(zhuǎn)換為PDF頁面,并保持較好的排版。

代碼:

import fitz # PyMuPDF庫
import pandas as pd
import os
from PIL import Image, ImageDraw, ImageFont # 用于文字渲染到圖片,或處理圖表圖片
import io # 用于內(nèi)存中的文件操作
import matplotlib.pyplot as plt # 假設(shè)圖表已生成為圖片

# 設(shè)置字體以支持中文,防止PDF中出現(xiàn)亂碼
try:
    # 嘗試加載常見的中文字體,如SimHei (黑體)
    # 注意:確保你的系統(tǒng)中有這些字體文件,或提供它們的完整路徑
    potential_font_paths = [
    "C:/Windows/Fonts/simhei.ttf",  # 黑體
    "C:/Windows/Fonts/msyh.ttc",    # 微軟雅黑
    "C:/Windows/Fonts/arial.ttf"    # 常用英文字體,如果只需要數(shù)字和英文頁碼
]
    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 作為英文默認(rèn)字體
    ImageFont.truetype(pdf_font_path, 1) # 嘗試加載,如果失敗會拋異常
except IOError:
    pdf_font_path = None # 如果找不到自定義字體,則使用fitz的默認(rèn)字體

def excel_to_pdf_conversion(excel_path, pdf_path, chart_image_paths=[]):
    """
    將Excel文件內(nèi)容(數(shù)據(jù)+圖表圖片)轉(zhuǎn)換為PDF文件。
    這是一個結(jié)合了數(shù)據(jù)讀取、圖表圖片嵌入的Python導(dǎo)出PDF報告的核心功能。
    :param excel_path: 源Excel數(shù)據(jù)文件路徑
    :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)}' 內(nèi)容轉(zhuǎn)換為PDF...")
    doc = fitz.open() # 創(chuàng)建一個新PDF文檔

    try:
        # 1. 從Excel讀取數(shù)據(jù) (只讀取數(shù)據(jù),不關(guān)心格式)
        df = pd.read_excel(excel_path)
        
        # 2. 將DataFrame數(shù)據(jù)轉(zhuǎn)換為文本或簡單表格圖片,并添加到PDF
        # 這是為了將Excel的“數(shù)據(jù)”部分轉(zhuǎn)換為PDF可顯示的內(nèi)容
        # 最簡單粗暴的方法是:將DataFrame轉(zhuǎn)為字符串,然后渲染到圖片,再插入
        # 更高級可以轉(zhuǎn)為HTML,然后用支持HTML的庫轉(zhuǎn)PDF
        
        # 創(chuàng)建一個臨時圖片來渲染DataFrame的文本內(nèi)容
        text_img_width = 800 # 渲染文本到圖片的寬度
        text_img_height_per_line = 20 # 每行高度
        
        # 簡化:只把DataFrame的前15行轉(zhuǎn)成字符串添加到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為邊距

        # 創(chuàng)建空白圖片,用于繪制文本
        text_img_pil = Image.new('RGB', (text_img_width, text_img_height), color = 'white')
        draw = ImageDraw.Draw(text_img_pil)
        
        # 設(shè)置字體
        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
        
        # 將文本圖片保存到內(nèi)存
        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 寬度和高度創(chuàng)建新頁面
        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

        # 檢查圖片是否超出頁面,如果超出則調(diào)整大小
        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
                
                # 為每個圖表創(chuàng)建新頁面
                #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 寬度和高度創(chuàng)建新頁面
                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])
                
                # 插入圖表圖片,自適應(yīng)頁面大小
                # 獲取圖片原始尺寸
                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

                # 計算圖片在頁面上的放置位置和大小,使其適應(yīng)頁面
                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}" # 頁碼文本

            # 插入文本到頁面
            # 使用默認(rèn)字體 (None) 或明確指定一個PyMuPDF內(nèi)置的通用字體,如 "helv" (Helvetica)
            # 對于頁碼這種簡單文本,通常內(nèi)置字體就足夠了
            page.insert_text(
                (page.rect.width - 100, page.rect.height - 30), # 坐標(biāo) (x, y)
                page_text,
                # fontname="helv", # 明確使用Helvetica,通常是安全的內(nèi)置字體
                # fontname=None,   # 或者讓PyMuPDF自動選擇默認(rèn)字體
                fontsize=9,      # 字體大小可以稍小
                color=(0, 0, 0)  # 黑色
            )
            # 如果需要顯示中文頁碼(如“第1頁”),且必須使用外部字體:
            # 這部分會更復(fù)雜,需要確保fontfile能被fitz正確加載,并注冊
            # 通常需要一個更通用的字體注冊函數(shù),例如:
            # 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報表已成功轉(zhuǎn)換為PDF:'{pdf_path}'")
        return True
    except Exception as e:
        print(f"? 轉(zhuǎn)換為PDF失?。簕e}")
        return False
    finally:
        doc.close()
if __name__ == "__main__":
    # --- 準(zhǔn)備測試數(shù)據(jù) ---
    # 1. 準(zhǔn)備Excel文件
    report_excel_path = os.path.expanduser("~/Desktop/my_report_data.xlsx") 
    # 簡單創(chuàng)建模擬的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)}' 已創(chuàng)建。")
    
    # 2. 準(zhǔn)備圖表圖片 (假設(shè)你用matplotlib/seaborn生成過)
    chart1_path = os.path.expanduser("~/Desktop/chart_sales_bar.png")
    chart2_path = os.path.expanduser("~/Desktop/chart_monthly_trend.png")
    
    # 簡單創(chuàng)建模擬圖表圖片 (實(shí)際需要你運(yùn)行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)}' 已創(chuàng)建。")
    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)}' 已創(chuàng)建。")

    output_pdf_path = os.path.expanduser("D://360MoveData//Users//Administrator//Desktop//excel//professional_report.pdf")
    
    # --- 運(yùn)行轉(zhuǎn)換 ---
    excel_to_pdf_conversion(report_excel_path, output_pdf_path, 
                            chart_image_paths=[chart1_path, chart2_path])

操作步驟:

修改代碼路徑: 修改 report_excel_path 和 output_pdf_path。

運(yùn)行: 運(yùn)行 python excel_to_pdf.py。

效果展示:

3.2 定制PDF報告:添加頁眉頁腳、頁碼、封面

除了簡單轉(zhuǎn)換,你還可以通過Python更精細(xì)地定制PDF報告,例如添加頁眉頁腳、頁碼、封面,甚至合并多個PDF文件,打造 truly 專業(yè)PDF報告。

作用: PyMuPDF(或ReportLab等)提供了創(chuàng)建和編輯PDF的強(qiáng)大能力,你可以將文本、圖片、甚至矢量圖形添加到PDF的任何位置。

例如,可以實(shí)現(xiàn):
統(tǒng)一頁眉頁腳: 自動為每一頁添加公司Logo、報告名稱、頁碼。
動態(tài)頁碼: 根據(jù)總頁數(shù)自動生成頁碼,如“第X頁/共Y頁”。
定制封面: 為你的PDF報告生成一個美觀的定制封面頁。

這些高級定制能力,將讓你的自動化報表生成達(dá)到新的高度,讓你的數(shù)據(jù)呈現(xiàn)更具說服力!

4. 階段性成果:你的“智能報表生成系統(tǒng)”!

我們深入學(xué)習(xí)了Pandas、Matplotlib/Seaborn、Openpyxl和PyMuPDF等庫,實(shí)現(xiàn)了:
Python生成Excel報表: 從數(shù)據(jù)讀取、處理,到圖表繪制與嵌入,再到專業(yè)PDF導(dǎo)出,實(shí)現(xiàn)報表自動化。

Excel圖表自動化: 告別手動制圖,讓你的數(shù)據(jù)通過柱狀圖、折線圖等可視化Excel圖表“會說話”。

Python導(dǎo)出PDF報告: 輕松將復(fù)雜的Excel報表轉(zhuǎn)換為精美PDF,告別PDF轉(zhuǎn)換麻煩。

數(shù)據(jù)呈現(xiàn)自動化: 整個流程一站式搞定,全面提升你的數(shù)據(jù)呈現(xiàn)效率。

現(xiàn)在,你不再需要為手工制圖耗時、報表枯燥無味而煩惱。你的自動化報表生成腳本將幫你:

5. 尾聲:報表自動化,開啟職場新高度!

通過本篇文章,你已經(jīng)掌握了自動化報表生成的強(qiáng)大能力,為你的辦公自動化之旅又增添了一個重量級技能!你學(xué)會了如何利用Python的數(shù)據(jù)可視化和PDF處理能力,高效地生成和分發(fā)專業(yè)報表。

除了今天學(xué)到的報表生成功能,你還希望Python能幫你實(shí)現(xiàn)哪些更復(fù)雜的自動化報表需求?比如:根據(jù)數(shù)據(jù)智能生成報告文字摘要?自動識別報表中的異常點(diǎn)并預(yù)警?

以上就是利用Python實(shí)現(xiàn)Excel報表自動化的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Python Excel報表自動化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 學(xué)會python自動收發(fā)郵件 代替你問候女友

    學(xué)會python自動收發(fā)郵件 代替你問候女友

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動收發(fā)郵件,代替你問候女友,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Python聚類算法之凝聚層次聚類實(shí)例分析

    Python聚類算法之凝聚層次聚類實(shí)例分析

    這篇文章主要介紹了Python聚類算法之凝聚層次聚類的原理與具體使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Python實(shí)現(xiàn)列表拼接和去重的三種方式

    Python實(shí)現(xiàn)列表拼接和去重的三種方式

    本文主要介紹了Python實(shí)現(xiàn)列表拼接和去重,詳細(xì)的介紹了列表拼接和列表去重三種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python的schedule定時任務(wù)模塊二次封裝方法

    python的schedule定時任務(wù)模塊二次封裝方法

    今天小編就為大家分享一篇python的schedule定時任務(wù)模塊二次封裝方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • PyCharm 專業(yè)版安裝圖文教程

    PyCharm 專業(yè)版安裝圖文教程

    這篇文章主要介紹了PyCharm 專業(yè)版安裝圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python簡單實(shí)現(xiàn)插入排序?qū)嵗a

    python簡單實(shí)現(xiàn)插入排序?qū)嵗a

    在本篇文章里小編給大家整理了一篇關(guān)于python簡單實(shí)現(xiàn)插入排序?qū)嵗a,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • Python光學(xué)仿真學(xué)習(xí)衍射算法初步理解

    Python光學(xué)仿真學(xué)習(xí)衍射算法初步理解

    這篇文章主要為大家介紹了Python光學(xué)仿真學(xué)習(xí)中對衍射算法的初步理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Python中l(wèi)ist列表添加元素的3種方法總結(jié)

    Python中l(wèi)ist列表添加元素的3種方法總結(jié)

    這篇文章主要介紹了Python中l(wèi)ist列表添加元素的3種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • python批量生成身份證號到Excel的兩種方法實(shí)例

    python批量生成身份證號到Excel的兩種方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于python批量生成身份證號到Excel的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • python使用隱式循環(huán)快速求和的實(shí)現(xiàn)示例

    python使用隱式循環(huán)快速求和的實(shí)現(xiàn)示例

    這篇文章主要介紹了python使用隱式循環(huán)快速求和的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評論

临桂县| 双流县| 滦平县| 崇州市| 东至县| 武乡县| 乡城县| 利津县| 张掖市| 巴彦县| 七台河市| 嘉善县| 平原县| 建湖县| 曲松县| 上饶市| 洞口县| 深圳市| 邢台县| 芷江| 满洲里市| 淮安市| 红安县| 沙洋县| 蒲江县| 卢氏县| 漳平市| 临清市| 浦城县| 公主岭市| 昭通市| 阆中市| 林西县| 保山市| 从江县| 山东省| 霍城县| 邓州市| 阿克陶县| 新余市| 华池县|