Python腳本自動(dòng)生成PowerPoint演示文件圖表
周五下午三點(diǎn),部門群里彈出一條消息:"各位,下周一匯報(bào)的各季度運(yùn)營(yíng)數(shù)據(jù)PPT,今晚12點(diǎn)前發(fā)我合并。"小王盯著屏幕愣了五秒,扭頭看了一眼角落里堆積如山的Excel表格——十二個(gè)季度的銷售數(shù)據(jù)、八個(gè)區(qū)域的業(yè)績(jī)對(duì)比、二十多條產(chǎn)品線的趨勢(shì)分析。
打開PowerPoint,新建幻燈片,插入圖表,編輯數(shù)據(jù),調(diào)整格式。重復(fù),重復(fù),再重復(fù)。三個(gè)小時(shí)后,他才做完三分之一。窗外天黑了下來,屏幕上還躺著十幾個(gè)待生成的圖表。
這種場(chǎng)景,做數(shù)據(jù)分析、運(yùn)營(yíng)、財(cái)務(wù)、咨詢的朋友應(yīng)該都不陌生。每周、每月、每季度,同樣的數(shù)據(jù)源,同樣的圖表類型,同樣的格式調(diào)整,一遍又一遍地手動(dòng)操作。不是工作有多難,而是重復(fù)勞動(dòng)實(shí)在太耗人。
Python能解決這個(gè)問題。借助python-pptx這個(gè)庫(kù),你可以在代碼里定義圖表、填充數(shù)據(jù)、調(diào)整格式,讓計(jì)算機(jī)替你完成那些機(jī)械重復(fù)的操作。下面這份教程,我會(huì)帶著你從零開始,一步步寫出能自動(dòng)生成PPT圖表的Python腳本。
先裝好工具包
開始之前,需要安裝python-pptx庫(kù)。打開命令行,輸入這行命令:
pip install python-pptx
安裝完成后,在Python腳本里導(dǎo)入它:
from pptx import Presentation from pptx.chart.data import CategoryChartData from pptx.enum.chart import XL_CHART_TYPE from pptx.util import Inches from pptx.dml.color import RGBColor
這些模塊各有用處:Presentation負(fù)責(zé)創(chuàng)建和讀取PPT文件,CategoryChartData用來組織圖表數(shù)據(jù),XL_CHART_TYPE定義了圖表類型,Inches用于設(shè)置尺寸,RGBColor則是調(diào)色用的。
新建幻燈片并添加柱狀圖
先從最基礎(chǔ)的操作開始——創(chuàng)建一個(gè)新的PPT文件,添加一張幻燈片,然后在上面畫一個(gè)柱狀圖。
# 創(chuàng)建一個(gè)新的演示文稿
prs = Presentation()
# 添加一張空白幻燈片(版式6通常是空白)
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 準(zhǔn)備圖表數(shù)據(jù)
chart_data = CategoryChartData()
# 設(shè)置橫軸(X軸)的類別
chart_data.categories = ['華東', '華南', '華北', '西南', '東北']
# 添加一個(gè)數(shù)據(jù)系列
chart_data.add_series('2025年銷售額', (42.5, 38.2, 35.7, 28.3, 22.8))
# 設(shè)置圖表位置和大小
x, y, cx, cy = Inches(1), Inches(1.5), Inches(8), Inches(5)
# 添加圖表到幻燈片
chart_frame = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)
# 保存文件
prs.save('sales_chart.pptx')
運(yùn)行這段代碼,打開生成的PPT文件,你會(huì)看到一張包含五個(gè)地區(qū)柱狀圖的幻燈片。數(shù)據(jù)已經(jīng)填好,圖表自動(dòng)生成。
折線圖展示趨勢(shì)變化
如果是展示時(shí)間序列數(shù)據(jù),折線圖更合適。換一種圖表類型就行:
# 準(zhǔn)備折線圖數(shù)據(jù)
chart_data = CategoryChartData()
# X軸是時(shí)間
chart_data.categories = ['Q1', 'Q2', 'Q3', 'Q4']
# 添加三個(gè)系列的數(shù)據(jù)
chart_data.add_series('產(chǎn)品A', (12.3, 15.6, 18.2, 21.7))
chart_data.add_series('產(chǎn)品B', (8.5, 11.2, 14.8, 16.3))
chart_data.add_series('產(chǎn)品C', (5.2, 7.8, 9.5, 12.1))
# 添加折線圖
chart_frame = slide.shapes.add_chart(
XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data
)
chart = chart_frame.chart
# 給第一條線加上平滑效果
chart.series[0].smooth = True
折線圖的代碼結(jié)構(gòu)和柱狀圖幾乎一樣,只是XL_CHART_TYPE換成了LINE。如果想生成帶標(biāo)記點(diǎn)的折線圖,可以用LINE_WITH_MARKERS。
餅圖看占比
遇到占比分析的場(chǎng)景,餅圖是標(biāo)配。餅圖的特殊之處在于只能有一個(gè)數(shù)據(jù)系列,而且沒有坐標(biāo)軸概念:
# 準(zhǔn)備餅圖數(shù)據(jù)
chart_data = CategoryChartData()
chart_data.categories = ['直接銷售', '渠道代理', '電商平臺(tái)', '戰(zhàn)略合作']
chart_data.add_series('2025年收入構(gòu)成', (45.2, 28.7, 18.3, 7.8))
# 添加餅圖
chart_frame = slide.shapes.add_chart(
XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
)
chart = chart_frame.chart
# 顯示圖例
chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
# 顯示數(shù)據(jù)標(biāo)簽,并設(shè)置為百分比格式
chart.plots[0].has_data_labels = True
data_labels = chart.plots[0].data_labels
data_labels.number_format = '0%'
data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
設(shè)置數(shù)據(jù)標(biāo)簽格式時(shí)用到了number_format屬性,'0%'表示顯示為整數(shù)百分比。如果想保留一位小數(shù),可以用'0.0%'。
散點(diǎn)圖與氣泡圖
散點(diǎn)圖和氣泡圖適合處理科學(xué)數(shù)據(jù)或連續(xù)變量的關(guān)系分析。它們的特殊之處在于數(shù)據(jù)點(diǎn)可以有自己的X值,不需要所有系列共享同一套X軸標(biāo)簽。
散點(diǎn)圖代碼示例:
from pptx.chart.data import XyChartData
# 準(zhǔn)備散點(diǎn)圖數(shù)據(jù)
chart_data = XyChartData()
series_1 = chart_data.add_series('模型A')
series_1.add_data_point(1.2, 3.4)
series_1.add_data_point(2.5, 4.1)
series_1.add_data_point(3.8, 2.7)
series_1.add_data_point(4.2, 5.3)
series_2 = chart_data.add_series('模型B')
series_2.add_data_point(1.5, 2.8)
series_2.add_data_point(2.8, 3.9)
series_2.add_data_point(3.2, 4.5)
series_2.add_data_point(4.5, 3.2)
# 添加散點(diǎn)圖
chart_frame = slide.shapes.add_chart(
XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data
)
氣泡圖在此基礎(chǔ)上多了一個(gè)尺寸參數(shù),每個(gè)數(shù)據(jù)點(diǎn)需要提供X值、Y值和氣泡大小三個(gè)數(shù)值。
調(diào)整坐標(biāo)軸讓圖表更專業(yè)
圖表生成后,還可以對(duì)坐標(biāo)軸做精細(xì)化調(diào)整。比如修改刻度范圍、添加網(wǎng)格線、調(diào)整字體等:
from pptx.enum.chart import XL_TICK_MARK from pptx.util import Pt chart = chart_frame.chart # 調(diào)整數(shù)值軸(Y軸) value_axis = chart.value_axis value_axis.maximum_scale = 50.0 # 設(shè)置Y軸最大值 value_axis.minimum_scale = 0.0 # 設(shè)置Y軸最小值 value_axis.has_major_gridlines = True # 顯示主要網(wǎng)格線 # 設(shè)置Y軸標(biāo)簽格式為帶百分號(hào) value_axis.tick_labels.number_format = '0"萬元"' value_axis.tick_labels.font.size = Pt(12) value_axis.tick_labels.font.bold = True # 調(diào)整分類軸(X軸) category_axis = chart.category_axis category_axis.tick_labels.font.italic = True category_axis.tick_labels.font.size = Pt(11)
通過tick_labels可以控制坐標(biāo)軸上數(shù)字的字體、大小、粗體等屬性,number_format則決定了數(shù)字顯示的方式,比如加上單位或者轉(zhuǎn)為百分比。
數(shù)據(jù)標(biāo)簽和圖例
想讓圖表更清晰,數(shù)據(jù)標(biāo)簽和圖例必不可少:
from pptx.enum.chart import XL_LABEL_POSITION, XL_LEGEND_POSITION # 添加數(shù)據(jù)標(biāo)簽 plot = chart.plots[0] plot.has_data_labels = True data_labels = plot.data_labels data_labels.font.size = Pt(10) data_labels.position = XL_LABEL_POSITION.ABOVE # 標(biāo)簽顯示在柱子上方 data_labels.font.color.rgb = RGBColor(0x40, 0x40, 0x40) # 深灰色 # 調(diào)整圖例 chart.has_legend = True chart.legend.position = XL_LEGEND_POSITION.TOP # 圖例顯示在頂部 chart.legend.font.size = Pt(11)
數(shù)據(jù)標(biāo)簽的位置有多種選擇,柱狀圖常用ABOVE或INSIDE_END,餅圖適合OUTSIDE_END。
給圖表?yè)Q個(gè)顏色
默認(rèn)的配色可能不符合公司品牌或者你的審美。可以通過設(shè)置主題色來調(diào)整,或者直接指定顏色:
# 修改第一個(gè)系列的填充顏色 series = chart.series[0] point = series.points[0] # 第一個(gè)數(shù)據(jù)點(diǎn) point.format.fill.solid() point.format.fill.fore_color.rgb = RGBColor(0x42, 0x85, 0xF4) # 藍(lán)色 # 修改繪圖區(qū)背景色 chart.plot_area.format.fill.solid() chart.plot_area.format.fill.fore_color.rgb = RGBColor(0xF5, 0xF5, 0xF5) # 淺灰背景
python-pptx支持對(duì)單個(gè)數(shù)據(jù)點(diǎn)、整個(gè)系列、繪圖區(qū)、圖表區(qū)分別設(shè)置顏色,靈活性很高。
從Excel讀取數(shù)據(jù)自動(dòng)生成
上面的例子都是手動(dòng)輸入數(shù)據(jù)。在實(shí)際工作中,數(shù)據(jù)通常存放在Excel表格里。結(jié)合pandas和openpyxl,可以實(shí)現(xiàn)完全自動(dòng)化的數(shù)據(jù)讀取和圖表生成:
import pandas as pd
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
# 從Excel讀取數(shù)據(jù)
df = pd.read_excel('sales_data.xlsx', sheet_name='季度銷售')
# 準(zhǔn)備數(shù)據(jù)
categories = df['地區(qū)'].tolist()
series_data = {
'Q1': df['Q1'].tolist(),
'Q2': df['Q2'].tolist(),
'Q3': df['Q3'].tolist(),
'Q4': df['Q4'].tolist()
}
# 創(chuàng)建PPT
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 填充圖表數(shù)據(jù)
chart_data = CategoryChartData()
chart_data.categories = categories
for quarter, values in series_data.items():
chart_data.add_series(quarter, values)
# 添加圖表
x, y, cx, cy = Inches(1), Inches(1.5), Inches(10), Inches(6)
slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)
prs.save('auto_generated_report.pptx')
這段代碼讀取Excel文件,取出地區(qū)和各季度銷售額,自動(dòng)生成一張包含四個(gè)系列的簇狀柱狀圖。如果Excel里有多張表、多個(gè)年份的數(shù)據(jù),用循環(huán)可以批量生成幾十張甚至上百?gòu)垐D表。
處理多圖表幻燈片
有時(shí)候一張幻燈片上需要放多個(gè)圖表。python-pptx支持在同一張幻燈片上添加多個(gè)圖表,只要計(jì)算好各自的位置就行:
# 左側(cè)圖表
x1, y1, cx1, cy1 = Inches(0.5), Inches(1.5), Inches(5), Inches(4)
chart1 = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x1, y1, cx1, cy1, chart_data1
).chart
# 右側(cè)圖表
x2, y2, cx2, cy2 = Inches(6), Inches(1.5), Inches(5), Inches(4)
chart2 = slide.shapes.add_chart(
XL_CHART_TYPE.PIE, x2, y2, cx2, cy2, chart_data2
).chart
獲取圖表對(duì)象時(shí)注意,add_chart返回的是包含圖表的圖形框(GraphicFrame),需要用.chart屬性才能拿到真正的圖表對(duì)象進(jìn)行后續(xù)設(shè)置。
常見問題與解決
圖表生成后打不開?檢查下python-pptx版本,建議用最新版。圖表數(shù)據(jù)不顯示?確認(rèn)數(shù)據(jù)格式是否正確,add_series接受列表或元組。中文顯示亂碼?PPT模板的字體問題,可以在母版里設(shè)置支持中文的字體。
顏色和預(yù)期不一樣?默認(rèn)顏色來自PPT模板的主題色,如果對(duì)顏色有嚴(yán)格要求,建議先準(zhǔn)備好一個(gè)帶自定義主題色的模板文件,然后用python-pptx打開這個(gè)模板添加內(nèi)容。
生成幾百頁(yè)的大型PPT時(shí)內(nèi)存占用過高?可以考慮分批次生成,或者每生成一頁(yè)就保存一次,避免把所有內(nèi)容都放在內(nèi)存里。
總結(jié)
Python自動(dòng)生成PPT圖表,不是要取代你做數(shù)據(jù)分析,而是幫你從機(jī)械重復(fù)的操作中解脫出來。把精力放在理解數(shù)據(jù)、發(fā)現(xiàn)規(guī)律、提煉觀點(diǎn)上,讓代碼去處理那些復(fù)制粘貼、拖拽調(diào)整、重復(fù)格式化的瑣事。
掌握這門技術(shù)后,再遇到"今晚12點(diǎn)前交PPT"的場(chǎng)景,你可以淡定地回復(fù):"好的,五分鐘后發(fā)你。"然后把Excel拖進(jìn)腳本,喝杯咖啡,看著電腦自動(dòng)生成幾十頁(yè)圖文并茂的報(bào)告。
說到底,工具的價(jià)值不在于它有多復(fù)雜,而在于它替你省下多少時(shí)間,讓你能做那些真正需要人來做的事情。
?以上就是Python腳本自動(dòng)生成PowerPoint演示文件圖表的詳細(xì)內(nèi)容,更多關(guān)于Python生成PowerPoint圖表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python簡(jiǎn)繁體轉(zhuǎn)換的簡(jiǎn)單實(shí)現(xiàn)步驟
工作中需要將繁體中文轉(zhuǎn)換成簡(jiǎn)體中文上網(wǎng)找了些資料,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)簡(jiǎn)繁體轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
TensorFlow實(shí)現(xiàn)批量歸一化操作的示例
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)批量歸一化操作的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python處理JSON的完全指南:從基礎(chǔ)到實(shí)戰(zhàn),掌握數(shù)據(jù)交換核心技能
本文將從?JSON?與?Python?的類型映射講起,帶你理解序列化與反序列化的底層邏輯,然后通過實(shí)戰(zhàn)案例演示如何解析?API?數(shù)據(jù)、處理自定義對(duì)象,最后總結(jié)出?3?個(gè)避坑技巧2026-06-06
Python中read()、readline()和readlines()方法比較及使用詳解
在Python文件操作中,read()、readline()和readlines()是三個(gè)常用的文件讀取方法,它們各有特點(diǎn),適用于不同的場(chǎng)景,本文將深入探討這三個(gè)方法的區(qū)別、使用場(chǎng)景、性能比較以及最佳實(shí)踐,需要的朋友可以參考下2025-03-03
Python?Flask實(shí)現(xiàn)后臺(tái)任務(wù)輕松構(gòu)建高效API應(yīng)用
本文介紹如何使用Python?Flask框架實(shí)現(xiàn)后臺(tái)任務(wù),以快速構(gòu)建高效的API應(yīng)用。通過實(shí)例演示,讀者將學(xué)會(huì)如何利用Flask框架搭建后臺(tái)任務(wù),實(shí)現(xiàn)異步處理和多線程操作等高級(jí)功能,提升應(yīng)用性能和用戶體驗(yàn)2023-04-04
python selenium自動(dòng)上傳有贊單號(hào)的操作方法
這篇文章主要介紹了python selenium自動(dòng)上傳有贊單號(hào)的操作代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
從原理詳解Python進(jìn)行Base64解碼的實(shí)戰(zhàn)技巧
Base64編碼解碼是處理二進(jìn)制數(shù)據(jù)的常見需求,無論是處理API響應(yīng),還是數(shù)據(jù)存儲(chǔ),今天我們從實(shí)際應(yīng)用角度出發(fā),深入探討B(tài)ase64解碼的技術(shù)細(xì)節(jié),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-08-08
python3獲取控制臺(tái)輸入的數(shù)據(jù)的具體實(shí)例
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python3獲取控制臺(tái)輸入的數(shù)據(jù)的具體實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-08-08

