Python 自動生成格式化 Excel 報表提示詞(openpyxl:多工作表、表頭樣式、數字格式、條件格式、公式與圖表、凍結窗格)

每週都要手工把數據整理成一份帶格式的 Excel 報表(表頭加粗加底色、金額千分位、異常標紅、彙總行、圖表)發給業務方時用:描述報表樣式,AI 寫出用 pandas 加 openpyxl 一鍵生成報表的腳本,樣式與公式可複用,生成後直接可用、不用再手動調整。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名擅長辦公自動化的 Python 工程師。請幫我寫一個自動生成 Excel 報表的腳本。

- 數據來源:[數據來源](例:數據庫查詢結果,或一個 CSV 文件)
- 報表結構:[報表結構](例:第一個工作表是彙總,後面每個區域一個明細工作表)
- 每個工作表的列與格式要求:
  [列與格式要求]
- 樣式要求:[樣式要求](例:表頭深藍底白字、金額千分位兩位小數、完成率低於 80% 標紅)
- 需要的公式或圖表:[公式與圖表](例:每個明細表底部有合計行,彙總表有柱形圖)
- 運行方式:[運行方式](例:每週一早上定時生成並儲存到共享目錄)

要求:
1. 用 pandas 處理數據,用 openpyxl 處理格式;說明為什麼不直接用 pandas 導出了事(無法精細控制樣式),以及兩者如何配合(先寫入數據,再打開工作簿設定格式)。
2. 樣式集中定義成可複用的函數或常量:表頭樣式、數字格式、邊框、列寬(根據內容自動估算列寬,中文按兩個字符寬度計算)。
3. 常用功能:凍結表頭行、開啟篩選、條件格式(用 Excel 的條件格式規則,而不是 Python 中直接塗色,這樣用戶修改數據後仍然生效)、合計行使用 Excel 公式(便於用戶核對)。
4. 圖表:在指定位置插入柱形圖或折線圖,設定標題和座標軸。
5. 多工作表:工作表名稱的長度與非法字符處理;工作表順序。
6. 輸出:文件名帶日期;如果文件已經打開導致無法寫入,給出清晰的錯誤提示。
7. 注意事項:openpyxl 寫入的公式不會被計算,打開文件時由 Excel 計算,因此如果腳本中需要讀取計算結果,應在 Python 中計算;大數據量時寫入速度的優化方法。

輸出完整可運行的腳本(中文註釋)和依賴安裝命令。
命名約定:工作簿文件名形如 週報_年月日.xlsx;工作表名不超過 31 個字符,不能含冒號、斜槓、問號、星號和方括號。
需要密碼保護或只讀分發時,說明 openpyxl 的工作表保護只防誤改、不是真正的加密。

高亮處換成你自己的內容:[數據來源]、[報表結構]、[列與格式要求]、[樣式要求]、[公式與圖表]、[運行方式]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[列與格式要求] 逐列寫清楚:列名、數據類型、顯示格式(例如「完成率:百分比,保留一位小數」)。[樣式要求] 可以直接描述你現在手工調整的樣子,AI 會把這些操作變成代碼。

常見坑:

  • 在 Python 里根據數值判斷後直接給單元格塗紅,用戶在 Excel 裏改了數字,顏色不會跟着變。用條件格式規則更合適。
  • 合計行在 Python 中算好寫成數字,用戶無法核對計算過程;寫成 Excel 公式更透明。但要注意 openpyxl 不會計算公式,腳本中讀取不到結果。
  • 列寬沒有設定,打開後一堆「####」或者文字被截斷。

追問技巧:追問「生成報表後自動發送電郵給指定的人,附上報表並在正文中寫三句關鍵結論」,或「把這個腳本改成讀取一個配置文件,不同報表只需修改配置」。

示例輸出

示例,僅供參考(節選)
python
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.formatting.rule import CellIsRule

HEADER = dict(font=Font(bold=True, color="FFFFFF"), fill=PatternFill("solid", fgColor="1F4E78"),
              alignment=Alignment(horizontal="center", vertical="center"))

def style_sheet(ws, money_cols, pct_col):
    for cell in ws[1]:                                         # 表頭樣式
        cell.font, cell.fill, cell.alignment = HEADER["font"], HEADER["fill"], HEADER["alignment"]
    ws.freeze_panes = "A2"                                     # 凍結表頭
    ws.auto_filter.ref = ws.dimensions                         # 開啟篩選
    last = ws.max_row
    for col in money_cols:
        for c in ws[f"{col}2:{col}{last}"]:
            c[0].number_format = "#,##0.00"
    ws.conditional_formatting.add(                             # 完成率低於 80% 標紅(條件格式)
        f"{pct_col}2:{pct_col}{last}",
        CellIsRule(operator="lessThan", formula=["0.8"], font=Font(color="C00000")))
    ws[f"A{last + 1}"] = "合計"                                # 合計行使用 Excel 公式
    for col in money_cols:
        ws[f"{col}{last + 1}"] = f"=SUM({col}2:{col}{last})"

with pd.ExcelWriter("週報_2026-10-07.xlsx", engine="openpyxl") as writer:
    summary.to_excel(writer, sheet_name="彙總", index=False)
wb = load_workbook("週報_2026-10-07.xlsx")
style_sheet(wb["彙總"], money_cols=["C", "D"], pct_col="E")
wb.save("週報_2026-10-07.xlsx")

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~