使用Python實(shí)現(xiàn)批量生成文本框并自動(dòng)排版
?小張是個(gè)運(yùn)營,每周五都要做數(shù)據(jù)周報(bào)。
每次打開PPT,新建一頁,拖一個(gè)文本框進(jìn)來,調(diào)字號(hào)、改字體、居中、加粗、換顏色……十幾頁P(yáng)PT做下來,大半個(gè)下午就沒了。
最煩的是,下周還要再來一遍。
她問我:“這些重復(fù)操作,能不能讓代碼幫我做?”
能。Python里有個(gè)庫叫python-pptx,專門干這事兒。
你可能會(huì)想:“我連PPT都沒玩明白,還讓我寫代碼?”
別急。做PPT的重復(fù)操作,本質(zhì)上就是三件事:在哪放文本框、寫什么字、字長(zhǎng)什么樣。用代碼寫一遍,以后每次運(yùn)行就行,連格式刷都省了。
先搭個(gè)最簡(jiǎn)單的框
你只需要四行代碼,就能生成一個(gè)文本框。
from pptx import Presentation
from pptx.util import Inches
# 新建PPT(或者打開現(xiàn)有的)
prs = Presentation()
# 加一頁空白幻燈片
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 畫個(gè)文本框:離左邊1英寸,離上邊1英寸,寬5英寸,高2英寸
textbox = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(5), Inches(2))
# 寫點(diǎn)字進(jìn)去
textbox.text_frame.text = "我是自動(dòng)生成的"
# 保存
prs.save("我的第一個(gè)文本框.pptx")
跑一下這段代碼,打開生成的PPT,你會(huì)在空白頁的左上角看到一個(gè)文本框。
這里有個(gè)概念叫“坐標(biāo)系統(tǒng)”。PPT里所有東西的位置,都是用英寸(Inches)或者厘米(Cm)來定的。add_textbox的四個(gè)參數(shù)分別是:
- left:離頁面左邊的距離
- top:離頁面上邊的距離
- width:文本框的寬度
- height:文本框的高度
你可以把這些數(shù)字隨便改,比如Inches(2)就是兩英寸。改完再跑一遍,框的位置和大小就變了。
別把字都擠在一起:理解三層結(jié)構(gòu)
你可能會(huì)遇到一個(gè)情況:在一個(gè)文本框里寫了好幾行字,想單獨(dú)調(diào)整其中一行的樣式,發(fā)現(xiàn)調(diào)不了。
這就涉及到python-pptx里文本的核心結(jié)構(gòu)了。它有三層:
TextFrame(文本框容器) :最外層,管整個(gè)框的行為,比如邊距、垂直對(duì)齊、是否自動(dòng)換行。
Paragraph(段落) :中間層,管一段話的行為,比如對(duì)齊方式、行間距、項(xiàng)目符號(hào)層級(jí)。
Run(文字塊) :最內(nèi)層,真正管文字長(zhǎng)什么樣,比如字體、字號(hào)、顏色、粗體斜體。
簡(jiǎn)單說:一個(gè)文本框里可以有多個(gè)段落,一個(gè)段落里可以有多個(gè)Run。
為什么要有Run?因?yàn)橐欢卧捓锟赡芗扔衅胀ㄎ淖钟钟屑哟旨t色文字。Run就是用來實(shí)現(xiàn)這種“混搭”的。
下面這段代碼展示了這三層怎么配合:
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 新建文本框
textbox = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(8), Inches(3))
frame = textbox.text_frame
# 第一段:普通段落
frame.text = "這是第一段"
frame.paragraphs[0].alignment = PP_ALIGN.CENTER # 居中對(duì)齊
# 第二段:手動(dòng)添加
p2 = frame.add_paragraph()
p2.text = "這是第二段,有特殊格式:"
# 在第二段里加一個(gè)Run,只讓"重點(diǎn)"兩個(gè)字變色
run = p2.add_run()
run.text = "重點(diǎn)"
run.font.bold = True
run.font.color.rgb = RGBColor(255, 0, 0) # 紅色
run.font.size = Pt(18)
# 繼續(xù)加普通文字
run2 = p2.add_run()
run2.text = " 后面的普通文字"
prs.save("三層結(jié)構(gòu)演示.pptx")
跑完這段,你會(huì)看到:第一段居中,第二段里“重點(diǎn)”兩個(gè)字又大又紅又粗,后面的文字保持原樣。
這就是Run的威力——精細(xì)控制。
讓文字更好看:字體、字號(hào)、顏色、對(duì)齊
做PPT的人都知道,好看的排版離不開這些細(xì)節(jié)。python-pptx基本都支持。
字體和字號(hào):
run = frame.paragraphs[0].add_run() run.text = "Hello" run.font.name = "微軟雅黑" # 字體名 run.font.size = Pt(24) # 字號(hào),單位是磅
粗體、斜體、下劃線:
run.font.bold = True # 加粗 run.font.italic = True # 斜體 run.font.underline = True # 下劃線
顏色:
from pptx.dml.color import RGBColor # RGB顏色,三個(gè)數(shù)字分別代表紅綠藍(lán),范圍0-255 run.font.color.rgb = RGBColor(255, 0, 0) # 紅色 run.font.color.rgb = RGBColor(0, 112, 192) # 一種藍(lán)色
段落對(duì)齊:
from pptx.enum.text import PP_ALIGN paragraph.alignment = PP_ALIGN.CENTER # 居中 paragraph.alignment = PP_ALIGN.LEFT # 左對(duì)齊 paragraph.alignment = PP_ALIGN.RIGHT # 右對(duì)齊
文本框級(jí)別的設(shè)置(整個(gè)框的垂直對(duì)齊、邊距、自動(dòng)換行):
from pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZE frame.vertical_anchor = MSO_ANCHOR.MIDDLE # 文字在框里垂直居中 frame.margin_left = Inches(0.2) # 左邊距 frame.margin_top = Inches(0.1) # 上邊距 frame.word_wrap = True # 自動(dòng)換行 frame.auto_size = MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT # 根據(jù)文字自動(dòng)調(diào)整框大小
這些設(shè)置混在一起用,基本能實(shí)現(xiàn)PPT里95%的排版需求。
做出有層次感的文本:項(xiàng)目符號(hào)和多級(jí)列表
做PPT少不了要點(diǎn)列表。python-pptx支持自動(dòng)生成項(xiàng)目符號(hào),還能縮進(jìn)。
from pptx import Presentation
from pptx.util import Inches
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
textbox = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(6), Inches(3))
frame = textbox.text_frame
# 清空默認(rèn)段落,自己從頭加
frame.clear()
# 加三個(gè)要點(diǎn),層級(jí)不同
items = [
("核心結(jié)論", 0),
(" 營收增長(zhǎng)25%", 1),
(" 主要來自華東區(qū)", 2),
(" 成本下降10%", 1),
]
for text, level in items:
p = frame.add_paragraph()
p.text = text
p.level = level # 0是最外層,數(shù)字越大縮進(jìn)越多
# 默認(rèn)就有項(xiàng)目符號(hào),如果想關(guān)掉:
# p.bullet = False
prs.save("項(xiàng)目符號(hào)演示.pptx")
跑完這段,你會(huì)看到一個(gè)有層級(jí)縮進(jìn)的列表,就像Word里的多級(jí)列表一樣。
一個(gè)完整例子:批量生成周報(bào)
現(xiàn)在把小張的需求串起來。假設(shè)她要生成一份周報(bào),包含三部分:標(biāo)題、核心數(shù)據(jù)(加粗紅色)、分析結(jié)論(項(xiàng)目符號(hào))。
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
def create_report(report_title, key_number, conclusions):
prs = Presentation()
# 封面頁
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 標(biāo)題框
title_box = slide.shapes.add_textbox(Inches(1), Inches(2), Inches(8), Inches(1))
title_frame = title_box.text_frame
title_frame.text = report_title
title_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
title_frame.paragraphs[0].runs[0].font.size = Pt(32)
title_frame.paragraphs[0].runs[0].font.bold = True
# 核心數(shù)據(jù)框
data_box = slide.shapes.add_textbox(Inches(1), Inches(3.5), Inches(8), Inches(0.8))
data_frame = data_box.text_frame
data_frame.text = f"核心數(shù)據(jù):"
run = data_frame.paragraphs[0].add_run()
run.text = f" {key_number}"
run.font.bold = True
run.font.color.rgb = RGBColor(255, 0, 0)
run.font.size = Pt(20)
data_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
# 分析結(jié)論頁
slide2 = prs.slides.add_slide(prs.slide_layouts[6])
box = slide2.shapes.add_textbox(Inches(1), Inches(1.5), Inches(8), Inches(4))
frame = box.text_frame
frame.text = "分析結(jié)論:"
frame.paragraphs[0].font.size = Pt(24)
frame.paragraphs[0].font.bold = True
for conclusion in conclusions:
p = frame.add_paragraph()
p.text = conclusion
p.level = 0
p.font.size = Pt(16)
prs.save("周報(bào).pptx")
print("周報(bào)生成成功!")
# 調(diào)用函數(shù)
create_report(
"第45周運(yùn)營周報(bào)",
"GMV突破500萬",
["用戶活躍度提升12%", "新客轉(zhuǎn)化率創(chuàng)歷史新高", "下周重點(diǎn)關(guān)注留存率"]
)
小張以后每周只需要改三個(gè)參數(shù):標(biāo)題、核心數(shù)字、結(jié)論列表。運(yùn)行一下,幾秒鐘就能拿到一份格式統(tǒng)一的周報(bào)。
遇到模板怎么辦?替換占位符
很多公司有自己的PPT模板,標(biāo)題在固定位置,logo在固定位置。
python-pptx可以打開現(xiàn)有PPT,找到特定的占位符,替換里面的內(nèi)容。
prs = Presentation("公司模板.pptx")
slide = prs.slides[0] # 取第一頁
# 遍歷這一頁上所有的占位符
for shape in slide.placeholders:
print(f"占位符ID: {shape.placeholder_format.idx}, 名字: {shape.name}")
# 根據(jù)索引替換
slide.placeholders[0].text = "2025年Q1匯報(bào)"
slide.placeholders[1].text = "銷售部"
prs.save("填好內(nèi)容的匯報(bào).pptx")
先跑一下打印占位符的代碼,記下每個(gè)位置對(duì)應(yīng)的ID,然后就可以用代碼批量填充了。
幾個(gè)容易踩的坑
坑一:修改已有文本框內(nèi)容時(shí),格式丟了
如果你拿到一個(gè)已有的文本框,直接text_frame.text = "新內(nèi)容",里面的格式會(huì)被清空。想保留格式,應(yīng)該操作具體的段落和Run。
坑二:中文字體顯示成方塊
必須指定系統(tǒng)里存在的字體。Windows用"微軟雅黑"或"SimHei",Mac用"PingFang SC"。不指定的話,可能會(huì)用默認(rèn)字體,中文就變成方塊了。
坑三:文本框太小,字顯示不全
設(shè)置text_frame.auto_size = MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT,文本框會(huì)自動(dòng)撐大?;蛘咴O(shè)置text_frame.word_wrap = True讓它自動(dòng)換行。
坑四:添加多個(gè)段落時(shí),第一段消失了
剛創(chuàng)建的文本框自帶一個(gè)空段落。如果你調(diào)用add_paragraph()之前沒有clear(),那第一段可能會(huì)被覆蓋。保險(xiǎn)做法:加內(nèi)容之前先text_frame.clear()。
還能做什么?
掌握了文本框,python-pptx還能干更多事:
- 插入圖片和表格
- 畫各種形狀(矩形、圓形、箭頭)
- 讀取現(xiàn)有PPT的內(nèi)容
- 批量修改幾十個(gè)PPT的頁腳
比如給100份產(chǎn)品介紹PPT統(tǒng)一加上公司logo和聯(lián)系方式,手改要半天,用代碼兩秒跑完。
回到小張。她現(xiàn)在每周五上午花兩分鐘改改參數(shù),然后去倒杯咖啡,回來周報(bào)就生成好了。
她說:“以前覺得會(huì)寫代碼的人很酷,現(xiàn)在發(fā)現(xiàn)會(huì)寫代碼的自己更酷。”
?到此這篇關(guān)于使用Python實(shí)現(xiàn)批量生成文本框并自動(dòng)排版的文章就介紹到這了,更多相關(guān)Python批量生成文本框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python TestSuite生成測(cè)試報(bào)告過程解析
這篇文章主要介紹了Python TestSuite生成測(cè)試報(bào)告過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
怎么在Python的正則表達(dá)式中找到每個(gè)匹配的確切位置
Python正則表達(dá)式是一種用于字符串匹配和操作的工具,它通過定義一系列的字符組合規(guī)則來實(shí)現(xiàn)對(duì)文本的查找、替換等操作,這篇文章主要介紹了怎么在Python的正則表達(dá)式中找到每個(gè)匹配的確切位置,需要的朋友可以參考下2026-01-01
python中Scikit-learn庫的高級(jí)特性和實(shí)踐分享
Scikit-learn是一個(gè)廣受歡迎的Python庫,它用于解決許多機(jī)器學(xué)習(xí)的問題,在本篇文章中,我們將進(jìn)一步探索Scikit-learn的高級(jí)特性和最佳實(shí)踐,需要的朋友可以參考下2023-07-07
python實(shí)現(xiàn)的文件同步服務(wù)器實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的文件同步服務(wù)器,實(shí)例分析了文件同步服務(wù)器的原理及客戶端、服務(wù)端的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-06-06
使用Arcgis做路徑規(guī)劃方式(使用python腳本調(diào)用)
本文介紹了如何使用ArcGIS和Python來解決鐵路路徑規(guī)劃問題,通過配置ArcGIS、導(dǎo)入路網(wǎng)數(shù)據(jù)和列車行駛點(diǎn)數(shù)據(jù)、處理線要素、構(gòu)建拓?fù)浣Y(jié)構(gòu),可以使用Network?Analyst工具進(jìn)行路徑分析,最后,通過Python腳本自動(dòng)化處理大量數(shù)據(jù),生成最優(yōu)路徑2024-12-12
Django自定義錯(cuò)誤頁面實(shí)現(xiàn)方式
文章介紹了在Django項(xiàng)目中設(shè)置生產(chǎn)環(huán)境相關(guān)配置的方法,包括關(guān)閉調(diào)試模式、設(shè)置允許訪問的主機(jī)、創(chuàng)建錯(cuò)誤頁面模板以及在項(xiàng)目的urls.py中指定錯(cuò)誤處理視圖的入口2025-10-10
Python實(shí)現(xiàn)多級(jí)目錄壓縮與解壓文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)多級(jí)目錄壓縮與解壓文件的方法,涉及Python針對(duì)文件路徑的遍歷、判斷以及文件壓縮、解壓縮等相關(guān)操作技巧,需要的朋友可以參考下2018-09-09

