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

