Python之pptx实现添加内容与删除(移动)页操作
问题背景
大量表格数据需要生成指定格式的ppt文件,内容以文字和表格为主,首尾页与内容有固定格式。博主不熟悉VBA操作,希望通过模板用Python完成自动化。
基本思路
- 使用
xlrd
模块读取xlsx文件内容 - 使用
pptx
模块完成ppt修改
模块版本
本文完成时使用的Python模块版本如下
pip install xlrd==1.2.0 python-pptx==0.6.18
具体实现
数据读取
有关xls读取参考我的博文:Python之xlrd模块读取xls文件与报错解决
插入页面
网上有很多关于pptx的参考资料,很快可以上手并新建新的幻灯片页(slide):
from pptx import Presentation
prs = Presentation('template.pptx')
def new_slide(idx):
'Add slide with layout, 0 = title, 1 = content, 2 = ending'
layout = prs.slide_layouts[idx]
slide = prs.slides.add_slide(layout)
return slide
上述代码支持根据幻灯片版式(layout)生成不同的空白页,如模板定义0标题1内容2结尾。具体版式可在ppt菜单【视图】-【幻灯片母版】中进行编辑。
缺陷:新建slide会自动添加到末尾页,无法移动。
写入内容
在Office 2007之后的pptx文件本质上是一个结构化的xml压缩包,而xml中的段落决定了每一页的元素的模板、内容、格式、字体、大小、位置等,因此通过搜过xml文件中不同的内容即可快速定位到需要修改的字段。
在ppt中每个元素都抽象为shape,对于表格,我的方案是在模板中做好格式并使用deepcopy复制到新的页面再修改内容。
from copy import deepcopy
slide = new_slide(1) #content slide
slide.shapes.title.text = '本页标题'
el = prs.slides[1].shapes[2].element #table in template
ol = deepcopy(el) #duplicate
slide.shapes._spTree.insert_element_before(ol)
table = slide.shapes[1].table #table in new slide
table.cell(1,1).text_frame.paragraphs[0].runs[0].text = '表格内容'
删除页面
官方issue指出无法移动slide可通过remove+insert间接实现,比较繁琐。
问题简化:尾部批量添加新容页结和尾最页,后删去模板二三页。
【模板开头】【模板内容】【模板结尾】【新内容1】【新内容2】……【新结尾】
def del_slide(index):
slides = list(prs.slides._sldIdLst)
prs.slides._sldIdLst.remove(slides[index])
参考文档
Python之pptx实现添加内容与删除(移动)页操作的更多相关文章
- 通过js给某个标签添加内容或者删除标签
添加内容 //先保存div中原来的html var tag = document.getElementById("tag").innerHTML; //构造新的内容 var cou ...
- (一)、vim及gvim添加多行注释及删除多行注释块操作
一.添加多行注释 选中要注释的行(连续的多行): Ctrl + v进入块选择模式: 按住I(大写)进入行首插入模式: 插入注释符: 按Esc回到命令模式. 或者 1. 进入命令行模式,按ctrl ...
- Python的文件输入输出,如何追加内容,读取内容,添加内容
python主要的文件打开的几种访问模式 模式可以为读模式('r').写模式('w')或追加模式('a'),当然还有rb.wb.ab.r+.w+.a+.rb+.wb+.ab+,然而实际从代码上我也没看 ...
- Python实现单链表数据的添加、删除、插入操作
Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...
- 生成 PDF 全攻略【2】在已有PDF上添加内容
项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...
- 用C#Winform写个简单的批量清空文件内容和删除文件的小工具
用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...
- linux下在某行的前一行或后一行添加内容
linux的sed工具是十分强大的,能很容易的实现在某关键词的前一行或后一行增加内容.今天在批量修改tomcat的日志时就用到了该功能. 一.在某行的前一行或后一行添加内容 具休操作如下: #匹配行前 ...
- C#通过Ado.net对连接数据库并进行添加删除等常规操作的代码
如下资料是关于C#通过Ado.net对连接数据库并进行添加删除等常规操作的内容. static string sqlcon = "server=.;database=;Integrated ...
- JavaScript实验一(添加节点,删除节点)
静态html页面: <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
随机推荐
- NLP新秀 - Bert
目录 什么是Bert Bert能干什么? Bert和TensorFlow的关系 BERT的原理 Bert相关工具和服务 Bert的局限性和对应的解决方案 沉舟侧畔千帆过, 病树前头万木春. 今天介绍的 ...
- android studio sqlite实际应用中存在的问题
原项目已上传到github long f = dbdatabase.update("user", values, "id=?", new String[]{St ...
- 计蒜客A1998 Ka Chang (分块+dfs序+树状数组)
题意 给你一个\(1e5\)的有点权的树,有\(1e5\)个操作: 1.给第\(x\)层的点加上\(y\) 2.求以\(x\)为根的子树的点权和 思路 首先处理出层数为x的所有点 操作2一般都是用df ...
- HDU 6602 Longest Subarray (线段树)
题意: 1e5的数组,c(1e5)种数字求最长的子串,使得其中每个出现的数字出现的次数为0次或者大于k次 思路: 枚举右端点i,维护当前右端点时,每个左端点的可行元素数量,当且仅当可行元素为c时更新答 ...
- symfony传参,接收参数,twig方法记录
呜呜呜,很烦,让我自己完成一个在线学习系统后端,和前端整合一下,我把接口参数搞了半天(学习symfony太久远),记录一下屈辱历史,以后注意,不然上线了一堆bug,很烦 下面是几种返回的数据的格式 1 ...
- linux入门系列12--磁盘管理之分区、格式化与挂载
前面系列文章讲解了VI编辑器.常用命令.防火墙及网络服务管理,本篇将讲解磁盘管理相关知识. 本文将会介绍大量的Linux命令,其中有一部分在"linux入门系列5--新手必会的linux命令 ...
- VFP9利用_GdiPlus类处理图片分辨率及缩放
VFP利用GDI来处理图片,已经不是一件太难的事了.GdiPlus类就是专门来干这事的,有关其属性等请参考其它资料.下面将处理图片缩放及分辨率的代码示例贴出来.这些代码都是很久以前的了,由于新冠宅家无 ...
- 【Java并发工具类】Java并发容器
前言 Java并发包有很大一部分都是关于并发容器的.Java在5.0版本之前线程安全的容器称之为同步容器.同步容器实现线程安全的方式:是将每个公有方法都使用synchronized修饰,保证每次只有一 ...
- lwip1.4.1需要的文件
1.4.1版本一共必须25个文件,如下,接下来,要看如何将2.0.2用起来 以上是必须的lwip原始的文件, 此外,还需要一些其它文件 Keil uVision5包含路径配置:
- Kubernetes 部署 Nginx Ingress Controller 之 nginxinc/kubernetes-ingress
更新:这里用的是 nginxinc/kubernetes-ingress ,还有个 kubernetes/ingress-nginx ,它们的区别见 Differences Between nginx ...