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

Python使用python-pptx庫實現(xiàn)PPT自動化

 更新時間:2025年08月15日 11:01:32   作者:憶愿  
Python PPT自動化極大地提高了PPT制作的效率,從創(chuàng)建新文件、添加文本和圖片,到插入表格和圖表,python-pptx庫幾乎可以實現(xiàn)所有常見的PPT操作,本文就給大家介紹了Python使用python-pptx庫實現(xiàn)PPT自動化的方法,需要的朋友可以參考下

做了這么多年技術(shù),PPT還真是躲不開。每次開會前熬夜做PPT,改來改去煩死人。

不是字體對不齊,就是配色不統(tǒng)一,搞得人焦頭爛額。

有時候明明內(nèi)容都準(zhǔn)備好了,光調(diào)整格式就得花上大半天。

直到我發(fā)現(xiàn)了python-pptx這個寶藏庫,整個人都輕松了。

一個腳本搞定的事兒,干嘛要手動點來點去?

寫好代碼一鍵生成,不僅省時省力,而且格式統(tǒng)一,看著特別專業(yè)。

說真的,我剛開始也不信這玩意能這么厲害。

但是當(dāng)我用它處理了一個真實項目,把原來要忙活一下午的工作縮短到十來分鐘,我就知道這東西真沒吹牛。

關(guān)鍵是不會出錯,格式統(tǒng)一,看著特別專業(yè)。

這個庫最大的優(yōu)勢就是自動化程度高。

你想想看,手動做PPT的時候要點多少次鼠標(biāo)?要調(diào)整多少次格式?

用代碼的話,寫一次模板,以后就可以一鍵生成,而且格式永遠統(tǒng)一,不會出現(xiàn)字體大小不一致的尷尬。

python-pptx是啥?

說白了就是用Python代碼來操作PPT的工具庫。

它能讓你用代碼來創(chuàng)建、修改和自動化處理PPT文件,比手動操作效率高出幾十倍。

裝起來賊簡單,一行命令就搞定:

pip install python-pptx

裝好就能用,不用管什么Office啊WPS的,跨平臺也沒問題。

在Windows、Mac還是Linux上都能完美運行,這就避免了很多環(huán)境配置的麻煩。

不過要記得,這個庫只支持.pptx格式,老版本的.ppt得先另存為新格式。

這是因為.pptx采用了更現(xiàn)代的XML格式,便于程序讀寫和處理。

如果你手上有老版本的PPT文件,記得先用Office或WPS另存為.pptx格式再處理。

python-pptx的功能相當(dāng)強大,從簡單的文本編輯到復(fù)雜的圖表制作都能搞定。

它不僅能處理文字、圖片、形狀這些基本元素,還能創(chuàng)建各種圖表,設(shè)置動畫效果,甚至能處理母版和布局。

對于需要批量處理PPT或者經(jīng)常制作格式統(tǒng)一的PPT的人來說,這簡直就是一個神器。

從零開始搞個PPT

來看看最基礎(chǔ)的PPT制作:

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

class PPTCreator:
    def __init__(self):
        self.prs = Presentation()
        
    def add_title_slide(self, title, subtitle=None):
        """添加標(biāo)題頁"""
        slide = self.prs.slides.add_slide(self.prs.slide_layouts[0])
        title_shape = slide.shapes.title
        subtitle_shape = slide.placeholders[1]
        
        # 設(shè)置標(biāo)題
        title_shape.text = title
        title_shape.text_frame.paragraphs[0].font.size = Pt(44)
        title_shape.text_frame.paragraphs[0].font.bold = True
        title_shape.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
        
        # 設(shè)置副標(biāo)題
        if subtitle:
            subtitle_shape.text = subtitle
            subtitle_shape.text_frame.paragraphs[0].font.size = Pt(32)
            
        return slide
        
    def save(self, filename):
        """保存PPT文件"""
        self.prs.save(filename)

# 使用示例
ppt = PPTCreator()
ppt.add_title_slide("超級厲害的PPT", "powered by Python")
ppt.save('demo.pptx')

這就整出來一個PPT了,是不是比手動點點點快多了?

而且格式統(tǒng)一,不會出現(xiàn)字體大小不一致的尷尬。

用代碼生成的PPT,每個標(biāo)題、每個段落的字體大小都完全一致,不會出現(xiàn)手動調(diào)整時可能產(chǎn)生的細微差異。

特別是在做系列PPT的時候,這種統(tǒng)一性顯得尤為重要,能讓整個作品看起來更專業(yè)、更有質(zhì)感。

花式玩法

光整個標(biāo)題頁太基礎(chǔ)了,來點花活:

class FancyPPTCreator(PPTCreator):
    def add_content_slide(self, title, content_list, layout_idx=1):
        """添加內(nèi)容頁"""
        slide = self.prs.slides.add_slide(self.prs.slide_layouts[layout_idx])
        
        # 設(shè)置標(biāo)題
        title_shape = slide.shapes.title
        title_shape.text = title
        title_shape.text_frame.paragraphs[0].font.size = Pt(36)
        
        # 設(shè)置內(nèi)容
        body_shape = slide.shapes.placeholders[1]
        tf = body_shape.text_frame
        
        # 添加項目符號
        for idx, item in enumerate(content_list):
            p = tf.add_paragraph()
            p.text = item
            p.font.size = Pt(18)
            p.font.name = '微軟雅黑'
            
            # 設(shè)置不同層級的縮進
            level = 0 if idx == 0 else 1
            p.level = level
            
        return slide
        
    def add_two_column_slide(self, title, left_content, right_content):
        """添加雙欄內(nèi)容頁"""
        slide = self.prs.slides.add_slide(self.prs.slide_layouts[3])
        
        # 設(shè)置標(biāo)題
        title_shape = slide.shapes.title
        title_shape.text = title
        
        # 左側(cè)內(nèi)容
        left_shape = slide.shapes.add_textbox(
            Inches(1), Inches(1.5),
            Inches(3.5), Inches(5)
        )
        left_tf = left_shape.text_frame
        left_tf.text = left_content
        
        # 右側(cè)內(nèi)容
        right_shape = slide.shapes.add_textbox(
            Inches(5), Inches(1.5),
            Inches(3.5), Inches(5)
        )
        right_tf = right_shape.text_frame
        right_tf.text = right_content
        
        return slide

溫馨提示:字體得是系統(tǒng)里有的,不然會用默認字體替代哦!

圖表繪制大法

數(shù)據(jù)展示少不了圖表,來整個漂亮的:

class ChartPPTCreator(FancyPPTCreator):
    def add_chart_slide(self, title, chart_data, chart_type=None):
        """添加圖表頁"""
        slide = self.prs.slides.add_slide(self.prs.slide_layouts[6])
        
        # 設(shè)置標(biāo)題
        title_shape = slide.shapes.title
        title_shape.text = title
        
        # 創(chuàng)建圖表數(shù)據(jù)
        chart_data = CategoryChartData()
        
        # 添加類別
        categories = chart_data['categories']
        values = chart_data['values']
        series_name = chart_data.get('series_name', '數(shù)據(jù)')
        
        chart_data.categories = categories
        chart_data.add_series(series_name, values)
        
        # 設(shè)置圖表類型
        if chart_type is None:
            chart_type = XL_CHART_TYPE.COLUMN_CLUSTERED
            
        # 添加圖表
        x, y = Inches(2), Inches(2)
        cx, cy = Inches(6), Inches(4.5)
        chart = slide.shapes.add_chart(
            chart_type, x, y, cx, cy, chart_data
        ).chart
        
        # 設(shè)置圖表樣式
        self._style_chart(chart)
        
        return slide
        
    def _style_chart(self, chart):
        """設(shè)置圖表樣式"""
        # 設(shè)置標(biāo)題
        chart.has_title = True
        chart.chart_title.text_frame.paragraphs[0].font.size = Pt(18)
        
        # 設(shè)置圖例
        chart.has_legend = True
        chart.legend.position = XL_LEGEND_POSITION.BOTTOM
        
        # 設(shè)置網(wǎng)格線
        chart.value_axis.has_major_gridlines = True
        chart.value_axis.major_gridlines.format.line.color.rgb = RGBColor(200, 200, 200)
        
    def add_multi_series_chart(self, title, data_dict):
        """添加多系列圖表"""
        slide = self.prs.slides.add_slide(self.prs.slide_layouts[6])
        
        chart_data = CategoryChartData()
        chart_data.categories = data_dict['categories']
        
        # 添加多個系列
        for series_name, values in data_dict['series'].items():
            chart_data.add_series(series_name, values)
            
        # 添加圖表
        x, y = Inches(2), Inches(2)
        cx, cy = Inches(6), Inches(4.5)
        chart = slide.shapes.add_chart(
            XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data
        ).chart
        
        self._style_chart(chart)
        return slide

高級圖片處理

PPT里插圖片是常事,來看看怎么玩:

class ImagePPTCreator(ChartPPTCreator):
    def add_image_slide(self, title, image_path, position=None):
        """添加圖片頁"""
        slide = self.prs.slides.add_slide(self.prs.slide_layouts[6])
        
        # 設(shè)置標(biāo)題
        title_shape = slide.shapes.title
        title_shape.text = title
        
        # 處理圖片
        img_path = self._process_image(image_path)
        
        # 設(shè)置圖片位置
        if position is None:
            position = {
                'left': Inches(2),
                'top': Inches(2),
                'width': Inches(6),
                'height': Inches(4.5)
            }
            
        # 添加圖片
        slide.shapes.add_picture(
            img_path,
            position['left'],
            position['top'],
            position['width'],
            position['height']
        )
        
        return slide
        
    def _process_image(self, image_path, max_size_mb=2):
        """處理圖片尺寸和大小"""
        from PIL import Image
        import os
        
        # 創(chuàng)建臨時文件夾
        if not os.path.exists('temp'):
            os.makedirs('temp')
            
        # 復(fù)制圖片到臨時文件
        temp_path = os.path.join('temp', os.path.basename(image_path))
        img = Image.open(image_path)
        
        # 壓縮圖片直到小于指定大小
        while os.path.getsize(image_path) > max_size_mb * 1024 * 1024:
            width, height = img.size
            img = img.resize((int(width*0.8), int(height*0.8)))
            img.save(temp_path)
            
        return temp_path

批量制作神器

要是要做一堆類似的PPT,手動改不得累死?整個批量處理:

class BatchPPTCreator(ImagePPTCreator):
    def batch_create(self, data_list, template_path=None):
        """批量創(chuàng)建PPT"""
        for item in data_list:
            # 使用模板或創(chuàng)建新PPT
            if template_path:
                self.prs = Presentation(template_path)
            else:
                self.prs = Presentation()
                
            try:
                # 創(chuàng)建標(biāo)題頁
                self.add_title_slide(
                    item['title'],
                    item.get('subtitle')
                )
                
                # 創(chuàng)建內(nèi)容頁
                if 'content' in item:
                    self.add_content_slide(
                        "主要內(nèi)容",
                        item['content']
                    )
                    
                # 創(chuàng)建圖表頁
                if 'chart_data' in item:
                    self.add_chart_slide(
                        "數(shù)據(jù)分析",
                        item['chart_data']
                    )
                    
                # 創(chuàng)建圖片頁
                if 'images' in item:
                    for img in item['images']:
                        self.add_image_slide(
                            img['title'],
                            img['path']
                        )
                        
                # 保存文件
                output_path = f"output/{item['title']}.pptx"
                self.save(output_path)
                print(f"創(chuàng)建成功:{output_path}")
                
            except Exception as e:
                print(f"處理 {item['title']} 時出錯:{str(e)}")
                continue

模板套用大法

每次從零開始太麻煩?用模板?。?/p>

class TemplatePPTCreator(BatchPPTCreator):
    def apply_template(self, template_path, data):
        """應(yīng)用模板"""
        self.prs = Presentation(template_path)
        
        # 遍歷所有頁面
        for slide_idx, slide in enumerate(self.prs.slides):
            # 遍歷頁面中的所有形狀
            for shape in slide.shapes:
                if not shape.has_text_frame:
                    continue
                    
                # 替換文本中的占位符
                text_frame = shape.text_frame
                for paragraph in text_frame.paragraphs:
                    for run in paragraph.runs:
                        for key, value in data.items():
                            placeholder = f'{{{key}}}'
                            if placeholder in run.text:
                                run.text = run.text.replace(
                                    placeholder,
                                    str(value)
                                )
                                
    def create_from_template(self, template_path, data_list):
        """批量使用模板創(chuàng)建PPT"""
        for item in data_list:
            try:
                # 應(yīng)用模板
                self.apply_template(template_path, item)
                
                # 保存文件
                output_path = f"output/{item['title']}.pptx"
                self.save(output_path)
                print(f"創(chuàng)建成功:{output_path}")
                
            except Exception as e:
                print(f"處理 {item['title']} 時出錯:{str(e)}")
                continue

實用工具函數(shù)

來點實用小工具:

class PPTUtils:
    @staticmethod
    def check_font(font_name):
        """檢查字體是否可用"""
        from matplotlib.font_manager import FontManager
        fm = FontManager()
        font_list = [f.name for f in fm.ttflist]
        return font_name in font_list
        
    @staticmethod
    def convert_to_pdf(pptx_path):
        """轉(zhuǎn)換PPT為PDF"""
        import comtypes.client
        
        powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
        powerpoint.Visible = True
        
        ppt = powerpoint.Presentations.Open(pptx_path)
        pdf_path = pptx_path.replace('.pptx', '.pdf')
        ppt.SaveAs(pdf_path, 32)  # 32 是PDF格式
        
        ppt.Close()
        powerpoint.Quit()
        
    @staticmethod
    def merge_ppts(ppt_list, output_path):
        """合并多個PPT"""
        merged_ppt = Presentation()
        
        for ppt_path in ppt_list:
            ppt = Presentation(ppt_path)
            
            for slide in ppt.slides:
                # 復(fù)制頁面
                new_slide = merged_ppt.slides.add_slide(
                    merged_ppt.slide_layouts[
                        slide.slide_layout.index
                    ]
                )
                
                # 復(fù)制所有形狀
                for shape in slide.shapes:
                    el = shape.element
                    new_el = deepcopy(el)
                    new_slide.shapes._spTree.insert_element_before(
                        new_el,
                        'p:extLst'
                    )
                    
        merged_ppt.save(output_path)

使用示例

來個完整的使用示例:

def main():
    # 創(chuàng)建PPT生成器
    creator = TemplatePPTCreator()
    
    # 準(zhǔn)備數(shù)據(jù)
    data_list = [
        {
            'title': '2023年度報告',
            'subtitle': '技術(shù)部',
            'content': [
                '項目完成情況',
                '技術(shù)創(chuàng)新',
                '團隊建設(shè)',
                '未來規(guī)劃'
            ],
            'chart_data': {
                'categories': ['Q1', 'Q2', 'Q3', 'Q4'],
                'series': {
                    '項目數(shù)': [10, 15, 12, 18],
                    '完成率': [0.8, 0.85, 0.9, 0.95]
                }
            },
            'images': [
                {
                    'title': '團隊照片',
                    'path': 'images/team.jpg'
                }
            ]
        }
    ]
    
    # 批量生成PPT
    creator.batch_create(data_list)
    
    # 轉(zhuǎn)換為PDF
    PPTUtils.convert_to_pdf('output/2023年度報告.pptx')

if __name__ == '__main__':
    main()

這些代碼夠你玩一陣子了。

不過記住啊,代碼寫完得測試,別一上來就真實PPT,要是把老板的報告搞壞了可就尷尬了。

還有個事兒,這些代碼我都實際用過,不同Python版本可能會有點差異,用的時候記得看看版本兼容性。

要是遇到問題,就打印下錯誤信息,基本都能解決。

寫代碼也要講究性價比,能用簡單方法解決的問題,咱就別上重型武器了。

畢竟,能跑起來的代碼才是好代碼!

以上就是Python使用python-pptx庫實現(xiàn)PPT自動化的詳細內(nèi)容,更多關(guān)于Python PPT自動化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐

    Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐

    本文主要介紹了Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 釘釘群自定義機器人消息Python封裝的實例

    釘釘群自定義機器人消息Python封裝的實例

    今天小編就為大家分享一篇釘釘群自定義機器人消息Python封裝的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 使用Python文件讀寫,自定義分隔符(custom delimiter)

    使用Python文件讀寫,自定義分隔符(custom delimiter)

    這篇文章主要介紹了使用Python文件讀寫,自定義分隔符(custom delimiter),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 詳解Python+OpenCV進行基礎(chǔ)的圖像操作

    詳解Python+OpenCV進行基礎(chǔ)的圖像操作

    OpenCV是一個用于計算機視覺和圖像操作的免費開源庫,有數(shù)千種優(yōu)化的算法和函數(shù)用于各種圖像操作。本文將使用OpenCV在Python中進行一些圖像操作,感興趣的可以學(xué)習(xí)一下
    2022-02-02
  • Python函數(shù)式編程指南(四):生成器詳解

    Python函數(shù)式編程指南(四):生成器詳解

    這篇文章主要介紹了Python函數(shù)式編程指南(四):生成器詳解,本文講解了生成器簡介、生成器函數(shù)、生成器函數(shù)的FAQ等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Python統(tǒng)計不同整數(shù)的出現(xiàn)次數(shù)的三種方法

    Python統(tǒng)計不同整數(shù)的出現(xiàn)次數(shù)的三種方法

    在數(shù)據(jù)處理和分析領(lǐng)域,統(tǒng)計不同整數(shù)的出現(xiàn)次數(shù)是一個常見需求,無論是清洗日志數(shù)據(jù)、分析用戶行為,還是處理實驗觀測值,我們都需要快速準(zhǔn)確地獲取不同整數(shù)的數(shù)量,本文將用通俗的語言,結(jié)合Python代碼示例,為你系統(tǒng)講解三種主流解決方案,需要的朋友可以參考下
    2025-04-04
  • Python中IndexError與KeyError的解決方案和預(yù)防措施

    Python中IndexError與KeyError的解決方案和預(yù)防措施

    在Python編程中,索引錯誤(IndexError)和鍵錯誤(KeyError)是兩種極為常見的異常類型,本文將深入剖析這兩種錯誤的本質(zhì)、產(chǎn)生原因,并提供一系列實用的解決方案和預(yù)防措施,需要的朋友可以參考下
    2025-12-12
  • NumPy實現(xiàn)廣播機制與廣播規(guī)則的示例

    NumPy實現(xiàn)廣播機制與廣播規(guī)則的示例

    NumPy中的廣播機制,這是一種允許不同形狀數(shù)組之間進行逐元素運算的技術(shù),本文就來詳細的介紹一下NumPy實現(xiàn)廣播機制與廣播規(guī)則的示例,感興趣的可以了解一下
    2026-05-05
  • Python實現(xiàn)二分法查找及優(yōu)化的示例詳解

    Python實現(xiàn)二分法查找及優(yōu)化的示例詳解

    二分查找法(Binary?Search)是一種在有序數(shù)組中查找某一特定元素的算法,在本文中,我們將使用?Python?實現(xiàn)二分查找算法,并深入探討算法的原理和實現(xiàn)細節(jié),感興趣的可以了解一下
    2023-04-04
  • 在python tkinter中Canvas實現(xiàn)進度條顯示的方法

    在python tkinter中Canvas實現(xiàn)進度條顯示的方法

    今天小編就為大家分享一篇在python tkinter中Canvas實現(xiàn)進度條顯示的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

喀什市| 个旧市| 武功县| 石渠县| 绵竹市| 道真| 博兴县| 安化县| 鹤峰县| 台中县| 肥西县| 两当县| 阜宁县| 三亚市| 海安县| 竹溪县| 海晏县| 南城县| 温泉县| 海南省| 苏尼特右旗| 从江县| 民勤县| 桃园市| 呼图壁县| 通榆县| 白山市| 洞口县| 青龙| 潜山县| 黔西县| 临潭县| 新河县| 大理市| 庄浪县| 东丽区| 日照市| 汉寿县| 千阳县| 凉山| 本溪|