PPT自動化 python-pptx - 10 : 表格(tables)

在日常工作中,我們經常需要制作包含表格的 PowerPoint 演示文稿,以此清晰展示數據或文本信息。手動制作不僅耗時,當數據更新時還需重復操作,效率低下。而?python-pptx?庫為我們提供了自動化操作 PowerPoint 表格的可能。本文將詳細介紹如何使用該庫創建、填充和操作表格,助你輕松實現 PPT 表格自動化生成。

1. PowerPoint 表格概述

功能定位

PowerPoint 表格的核心作用是將文本和數字以行列對齊的形式呈現,從而提升信息的可讀性,尤其適合展示大量數據項或文本塊。雖然它在功能上不如 Excel 電子表格強大,也沒有 Word 表格靈活,但對于演示文稿的常規需求來說,通常已經足夠。

核心限制

需要注意的是,PowerPoint 表格有一個重要限制:單元格只能包含純文本,無法容納圖像、其他形狀或嵌套表格。這一點在使用 python-pptx 操作表格時需特別留意。

2. 核心概念詳解

理解以下術語是熟練操作 python-pptx 表格的基礎:

  • 表格 (Table):由單元格按行和列對齊組成的矩陣。
  • 單元格 (Cell):表格中的基本內容容器,包含一個文本框用于存放內容,且可單獨設置背景填充、邊框、邊距等格式。
  • 行 (Row):水平方向上共享相同上、下邊界的單元格序列。
  • 列 (Column):垂直方向上共享相同左、右邊界的單元格序列。
  • 表格網格 / 單元格網格 (Table Grid / Cell Grid):PowerPoint 表格底層由嚴格規整的網格單元構成。例如,一個 3x3 表格有 9 個網格單元。合并單元格操作會覆蓋部分網格單元,但不會改變網格單元的總數。在 python-pptx 中,訪問單元格總是通過其在網格中的坐標 (row, column) 實現,該坐標可能與單元格在表格中的視覺位置(或被合并覆蓋的狀態)不一致。
  • 合并單元格 (Merged Cell):將相鄰(水平、垂直或同時)的單元格合并后形成的單個單元格,它跨越了原來多個單元格的區域。
  • 合并起始單元格 (Merge-Origin Cell):合并區域中左上角的那個網格單元格。其特殊行為是:只有這個單元格的內容會顯示在幻燈片上,被合并的其他單元格內容會被隱藏。在 python-pptx 中,可通過?_Cell.is_merge_origin?屬性識別,通過?span_height?和?span_width?屬性獲取合并區域的大小(占幾行幾列),使用其?split()?方法可以將合并單元格拆分回原來的網格單元。
  • 被合并單元格 (Spanned Cell):合并區域中除了合并起始單元格之外的其他網格單元格。直觀地說,合并起始單元格 “跨越” 了其區域內的其他網格單元格,可通過?_Cell.is_spanned?屬性識別。注意:合并起始單元格本身不是被合并單元格。

3. 添加表格到幻燈片

方法一:直接添加表格到幻燈片

from pptx import Presentation
from pptx.util import Inches# 1. 創建新演示文稿并添加一張幻燈片(通常使用標題幻燈片布局)
prs = Presentation()
slide_layout = prs.slide_layouts[5]  # 通常第6個布局是“僅標題”或“空白”,適合放表格
slide = prs.slides.add_slide(slide_layout)# 2. 定義表格位置和大小 (x, y 是左上角坐標; cx, cy 是寬度和高度)
x = Inches(2)  # 距離左邊距2英寸
y = Inches(2)  # 距離上邊距2英寸
cx = Inches(4)  # 表格寬4英寸
cy = Inches(1.5)  # 表格高1.5英寸# 3. 添加表格 (rows行, cols列)
shape = slide.shapes.add_table(rows=3, cols=3, left=x, top=y, width=cx, height=cy)# 4. 獲取表格對象 (add_table返回的是包含表格的GraphicFrame形狀)
if shape.has_table:  # 安全起見,檢查形狀是否包含表格table = shape.table# 現在可以使用table對象操作表格了,例如:cell = table.cell(0, 0)  # 訪問第1行第1列的單元格 (索引從0開始)cell.text = "示例內容"

關鍵點

  • slide.shapes.add_table()?返回的是一個 GraphicFrame 形狀對象 (shape),不是表格對象本身。
  • 通過?shape.has_table?可以確認該形狀是否包含表格。
  • 通過?shape.table?屬性獲取真正的 Table 對象進行操作。

方法二:將表格插入到占位符 (推薦用于模板化)

如果幻燈片布局中預先定義了表格占位符,插入表格到占位符能確保位置、大小與模板設計一致。

# 1. 打開包含特定布局的模板
prs = Presentation('your_template.pptx')  # 替換為你的模板路徑# 2. 添加一張使用包含表格占位符的布局的幻燈片 (假設索引2的布局有表格占位符)
slide_layout_with_table_placeholder = prs.slide_layouts[2]
slide = prs.slides.add_slide(slide_layout_with_table_placeholder)# 3. 獲取表格占位符 (通常需要知道它在幻燈片形狀集合中的位置)
# 假設它是幻燈片上的第二個形狀 (索引1)
table_placeholder = slide.shapes[1]  # 注意:索引可能因模板而異# 4. 在占位符中插入表格 (指定行數和列數)
shape = table_placeholder.insert_table(rows=3, cols=4)  # 插入一個3行4列的表格# 5. 獲取表格對象
table = shape.table  # 現在可以操作這個table對象了

關鍵點

  • 使用?Placeholder.insert_table(rows, cols)?方法將表格插入到特定的占位符中。
  • 位置和大小由占位符定義,無需手動指定。
  • 同樣通過?shape.table?獲取 Table 對象。

4. 訪問和操作單元格

  • 訪問單元格:使用?table.cell(row_idx, col_idx)?方法,行列索引從 0 開始。
  • 讀寫文本
top_left_cell = table.cell(0, 0)  # 訪問左上角單元格
print(top_left_cell.text)          # 讀取單元格文本 (初始為空字符串)
top_left_cell.text = "項目名稱"    # 設置單元格文本

單元格像文本框一樣,支持段落 (paragraphs) 和文本塊 (runs) 進行更精細的格式化。_Cell.text?屬性是快速設置簡單文本的便捷方式。

5. 合并單元格

通過指定要合并區域的左上角單元格和右下角單元格來合并。

# 獲取要合并區域的左上角和右下角單元格
top_left = table.cell(0, 0)    # 第1行第1列
bottom_right = table.cell(1, 1) # 第2行第2列 (這將合并一個2x2的區域)# 合并前檢查 (可選)
print("Is top_left a merge origin before merge?", top_left.is_merge_origin)  # False# 執行合并 (兩種方式效果相同)
top_left.merge(bottom_right)  # 方式1
# bottom_right.merge(top_left) # 方式2: 效果相同,合并起始單元格總是左上角那個# 合并后屬性
print("Is top_left a merge origin after merge?", top_left.is_merge_origin)  # True
print("Is top_left spanned?", top_left.is_spanned)                         # False
print("Is bottom_right spanned?", bottom_right.is_spanned)                 # True
print("Is cell(0, 1) spanned?", table.cell(0, 1).is_spanned)              # True

重要說明

  • 合并后,視覺上形成一個跨越指定區域的單個大單元格。
  • 格式繼承:新合并單元格的格式(背景色、字體等)完全取自合并起始單元格 (左上角單元格)。
  • 內容遷移:被合并區域中所有單元格的文本內容會被遷移到合并起始單元格中。每個原始單元格的內容會成為合并后單元格中的一個獨立段落,不會拼接成一個段落。遷移順序通常是按行從左到右、從上到下。
  • 合并起始單元格總是所選矩形區域的左上角單元格。

6. 拆分合并單元格 (取消合并)

在合并起始單元格上調用?.split()?方法。

# 假設 cell(0,0) 是之前合并區域的起始單元格
merge_origin_cell = table.cell(0, 0)if merge_origin_cell.is_merge_origin:merge_origin_cell.split()  # 執行拆分# 拆分后檢查print("Is cell(0,0) still a merge origin?", merge_origin_cell.is_merge_origin)  # Falseprint("Is cell(0,1) still spanned?", table.cell(0, 1).is_spanned)              # False

關鍵點

  • 只能對合并起始單元格 (is_merge_origin == True) 調用?.split()?方法,否則會引發 ValueError。
  • 拆分操作會恢復底層網格結構。
  • 注意:.split()?不會逆轉合并時發生的內容遷移。合并起始單元格中遷移過來的所有文本段落會保留在該單元格中(現在是網格中的單個單元格)。被拆分出來的其他單元格內容為空。

寫在最后

  • 內容遷移注意:合并單元格時,原始單元格的內容會作為獨立段落遷移到合并起始單元格。拆分時不會自動移回原位置,需要手動處理文本邏輯。
  • 網格坐標是核心:始終記住 python-pptx 操作的是底層的網格坐標 (row_idx, col_idx),視覺上的 “一個” 合并單元格對應網格中的一個起始單元格 (is_merge_origin) 和多個被合并單元格 (is_spanned)。
  • 占位符優勢:對于需要統一布局的幻燈片,優先考慮使用表格占位符來插入表格,讓 PowerPoint 模板控制位置和大小,提升演示文稿的專業性和一致性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917622.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在安卓中使用 FFmpegKit 剪切視頻并添加文字水印

在安卓中用到的三方庫:https://github.com/arthenica/ffmpeg-kit 這個庫很強大,支持很多平臺,每個平臺都有各自的分支代碼,用了一段時間,穩定性挺好的, 找到安卓下的分支:FFmpegKit for Andro…

Flask + HTML 項目開發思路

Flask HTML 項目開發思路:以公共資源交易信息展示為例 一、開篇明義——為什么選 Flask 框架 在眾多 Python Web 框架(如 Django、Tornado 等)里,本次項目堅定選擇 Flask,背后有清晰的技術考量: 1. 輕量…

Vue中:deep()和 ::v-deep選擇器的區別

在 Vue.js 中,:deep()和 ::v-deep都是用于穿透組件作用域的深度選擇器,但它們在語法、適用場景和版本支持上存在區別。以下是兩者的核心差異:一、??語法與用法? :Vue2中用 ::v-deep,Vue2中不支持:deep()&#xff0c…

Deep learning based descriptor

1、DH3D: Deep Hierarchical 3D Descriptors for Robust Large-Scale 6DoF Relocalization 論文鏈接 代碼鏈接 這是一篇訓練點云的文章,在訓練出local descriptor之后,通過聚類的方法得出global descriptor,并且提出了hierarchical network&…

PandasAI連接LLM對MySQL數據庫進行數據分析

1. 引言 在之前的文章《PandasAI連接LLM進行智能數據分析》中實現了使用PandasAI連接與DeepSeek模型通過自然語言進行數據分析。不過那個例子中使用的是PandasAI 2.X,并且使用的是本地.csv文件來作為數據。在實際應用的系統中,使用.csv作為庫表的情況比…

FloodFill算法——DFS

FloodFill算法就是用來尋找性質相同的連通快的算法,這篇博客都是用dfs來實現FloodFill算法 1.圖像渲染 題目鏈接:733. 圖像渲染 - 力扣(LeetCode) 題目解析:將和(sr,sc)相連的所有像素相同的…

【BUUCTF系列】[極客大挑戰 2019]LoveSQL 1

本文僅用于技術研究,禁止用于非法用途。 Author:枷鎖 文章目錄一、題目核心漏洞分析二、關鍵解題步驟與技術解析1. 確定列數(ORDER BY)2. 聯合查詢獲取表名3. 爆破字段名4. 提取Flag三、漏洞根源與防御方案1. 漏洞成因2. 防御措施四、CTF技巧…

AI時代,童裝銷售的“指路明燈”

別看現在AI、大數據這些詞眼花繚亂的,當年我剛入行那會兒,也跟你一樣,對著一堆庫存和銷量數據發愁,不知道勁兒該往哪使。童裝銷售這行,看著簡單,其實水挺深。不過呢,這二十多年摸爬滾打下來&…

Swin-Transformer從淺入深詳解

第一部分:出現背景在 Swin Transformer 出現之前,計算機視覺(Computer Vision, CV)領域主要由 CNN (卷積神經網絡) 主導。后來,NLP(自然語言處理)領域的 Transformer 模型被引入 CV,…

如何手動打包 Linux(麒麟系統)的 Qt 程序

gcc版本 gcc版本確保目標系統(運行環境)的 GCC 版本 高于或等于開發環境的版本,否則程序無法在目標平臺運行。通過 gcc -v 可查看當前版本。cmake生成可執行文件 強烈建議在cmakelists添加設置運行時 rpath 為 $ORIGIN/…/lib(相對…

解決 “crypto.hash is not a function”:Vite 從 6.x 升級至 7.x 后 `pnpm run dev` 報錯問題

🚀 作者主頁: 有來技術 🔥 開源項目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 倉庫主頁: GitCode︱ Gitee ︱ Github 💖 歡迎點贊 👍 收藏 ?評論 …

我的創作紀念日____在 CSDN一年來的成長歷程和收獲

365 天創作札記:在代碼與文字的褶皺里,遇見 1300 束光一年來。點開csdn網站后臺粉絲數的那一刻,1327 這個數字在屏幕上微微發燙。原來那些在深夜敲下的字符、調試到凌晨的代碼示例、反復修改的技術拆解,真的在時光里悄悄織成了一張…

VirtualBox 的 HOST 鍵(主機鍵)是 右Ctrl 鍵(即鍵盤右側的 Ctrl 鍵)筆記250802

VirtualBox 的 HOST 鍵(主機鍵)是 右Ctrl 鍵(即鍵盤右側的 Ctrl 鍵)筆記250802 VirtualBox 的 HOST 鍵(主機鍵)是什么?HOST鍵 是 右Ctrl 鍵VirtualBox 的 主機鍵(Host Key) 是一個…

Zama的使命

全同態加密(Fully Homomorphic Encryption,FHE)實現互聯網端到端加密的使命的重要里程碑。(FHE) 是一種無需解密即可處理數據的技術。它可用于在公共、無需許可的區塊鏈上創建私人智能合約,只有特定用戶才能看到交易數據和合約狀態…

Go語言流式輸出技術實現-服務器推送事件(Server-Sent Events, SSE)

目錄引言背景與技術概述實現技術細節1. HTTP 頭部配置2. 事件格式與發送3. 保持連接與刷新4. 處理連接關閉4.1 使用上下文管理連接生命周期4.2 使用通道管理客戶端連接5. 客戶端交互6.demo7.Go轉發大模型流式輸出demo引言 服務器推送事件(Server-Sent Events, SSE&…

高端房產管理小程序

系統介紹1、用戶端地圖找房:對接地圖API,地圖形式顯示周邊房源,支持新盤和租房兩種模式查詢房價走勢:城市房價走勢,由后臺每月錄入房源搜索:搜索房源,支持多維度篩選房源類型:新盤銷售、房屋租賃…

文本轉語音(TTS)腳本

文本轉語音(TTS)腳本 概述 generate_voice.py 是一個用于生成語音的Python腳本。該腳本提供了文本轉語音(TTS)功能,可以將文本內容轉換為語音文件。 功能特性 文本轉語音: 將輸入的文本轉換為語音文件多種語音選項: 支持不同的語音類型和參數批量處理: 可以處理多個…

磁盤管理與分區

磁盤管理 一、磁盤類型 SATA,SCSI,SAS類型的磁盤,在Linux中用sd來表示。 其中第一塊硬盤為sda,第二塊二sdb,以此類推。 第一塊硬盤的第一個分區為sda1。 nvme類型的磁盤,在Linux中使用nvmeXnYpZ進行表示。 X:數字&…

Linux 邏輯卷管理

練習創建物理卷(pv->vg->lv)物理卷(PV)就像把一塊塊獨立的硬盤,標記成 "可用于搭建 LVM 的積木",讓系統知道這些硬盤可以被 LVM 管理。#把sdb這塊硬盤標記為物理卷(相當于給這塊積木蓋章,說…

向日葵參考基因組

向日葵參考基因組升級多個版本 向日葵基因組為油脂代謝、開花調控及菊類植物進化提供新見解-文獻精讀151-CSDN博客 官網 https://www.sunflowergenome.org/annotations-data/