python 复制幻灯片并替换相应文字作为新的幻灯片_循环替换

发布时间 2023-04-05 21:05:23作者: 大话人生
# encoding=utf8
#-*-coding:utf-8 -*-


#pip install python-pptx -i https://pypi.tuna.tsinghua.edu.cn/simple
#pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple
#pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

from pptx import  Presentation  #导入PPT库
from pptx.util import  Cm,Pt   #导入单位 Cm,Pt
from docx import Document   #导入word库
import pandas as pd  #导入pandas


from pptx import Presentation, util
from pptx.util import Pt, Cm
from pptx.shapes.picture import Picture

from 制作PPT.util.operation_excel import OperationExcel


class HandleCopyPPT(object):
    def __init__(self,ppt_name,tihuan_content_list,new_ppt_name):
        self.new_ppt_name = new_ppt_name
        self.tihuan_content_list = tihuan_content_list
        self.tihuan_content_xiabiao = 0
        self.excel_hangshu = 1   #从第二行开始写,第一行写入标题
        self.ppt_name = ppt_name
        self.ppt = Presentation(self.ppt_name)
        self.oe = OperationExcel(file_name="hh.xls", sheet_id=None)
        self.all_yuansu_list = []   #记录所有元素
        self.shijiyuansu_list = []   #记录实际元素
        self.youyilou_list = []  #记录有遗漏的元素


    #写入表头
    def write_excel_title(self):
        biaoti_list = ['第几张PPT',"元素名字", "元素原始文本内容", "元素原始文本长度", "元素新赋值文本内容"]
        for i in range(0, len(biaoti_list)):
            self.oe.write_value(row=0, col=i, value=biaoti_list[i])

    def inOneListNotInTwoList(self,one_list,two_list):
        chayi_list = []
        for one in one_list:
            if one not in two_list:
                chayi_list.append(one)
        print("在第一个列表中,不在第二个列表中的元素:")
        print(chayi_list)
        return chayi_list



    #处理一页幻灯片,传入替换内容列表
    def rander_template_with_new(self,slide,zhangshu):
        #一页幻灯片中所有元素
        shape_list_one_slide = slide.shapes
        # all_yuansu_list = []
        yuansu_geshu = len(shape_list_one_slide)
        print("幻灯片中存在元素个数为:%s" % yuansu_geshu)
        for k in range(0,yuansu_geshu):

            one_shape = shape_list_one_slide[k]
            shape = one_shape
            print("处理幻灯片中第%s个元素" % str(k+1))
            shape_name = shape.name
            print("幻灯片中第%s个元素 的名字是 %s" % (str(k + 1),str(shape_name)))

            one_yuansu_list = []
            one_yuansu_list.append(zhangshu)
            one_yuansu_list.append(shape_name)
            self.shijiyuansu_list.append(shape_name)


            # try:
            #     shape_text = shape.text
            #
            # except Exception as e:
            #     shape_text = e
            # one_yuansu_list.append(shape_name)
            # self.all_yuansu_list.append(one_yuansu_list)


            try:
                if shape.has_text_frame == True:
                    print("==========================文本框=============================")
                    duanluo_list = shape.text_frame.paragraphs  #段落列表
                    duanluo_shu = len(duanluo_list)  #段落个数
                    print("段落长度:", duanluo_shu)
                    for n in range(0,duanluo_shu):
                        one_paragraph = duanluo_list[n]
                        paragraph = one_paragraph
                        print("处理幻灯片中第%s个元素的第%s段落" % (str(k + 1),str(n+1)))
                        run_list = paragraph.runs  #段落的run的列表
                        run_shu = len(run_list)
                        for l in range(0,run_shu):

                            one_run_list = []
                            one_run_list.append(zhangshu)   #统计张数,第几张幻灯片
                            one_run_list.append(shape_name)  # 元素名字
                            print("处理幻灯片中第%s个元素的第%s段落的第%s个run" % (str(k + 1), str(n + 1),str(l+1)))
                            one_run = run_list[l]
                            run = one_run
                            yuan_run_text = run.text
                            print("幻灯片中第%s个元素的第%s段落的第%s个run的原始文本内容为 %s" % (str(k + 1), str(n + 1), str(l + 1),yuan_run_text))
                            one_run_list.append(yuan_run_text)   #统计元素原始文本
                            yuanshi_text_zijie_changdu = len(yuan_run_text)
                            print("幻灯片中第%s个元素的第%s段落的第%s个run的原始文本内容长度 %s" % (str(k + 1), str(n + 1), str(l + 1),yuanshi_text_zijie_changdu))
                            one_run_list.append(yuanshi_text_zijie_changdu)  # 统计元素原始文本的长度
                            xinfuzhi = self.tihuan_content_list[self.tihuan_content_xiabiao]
                            self.tihuan_content_xiabiao = self.tihuan_content_xiabiao+1  #赋值之后就加1
                            run.text = str(xinfuzhi)
                            print("幻灯片中第%s个元素的第%s段落的第%s个run的新文本内容为 %s" % (str(k + 1), str(n + 1), str(l + 1), xinfuzhi))
                            one_run_list.append(xinfuzhi)  # 统计元素文本新内容

                            self.all_yuansu_list.append(one_run_list)
                            print("符合条件添加成功")
                            self.youyilou_list.append(shape_name)


                elif shape.has_table == True:

                    print("==========================表格==============================")
                    one_table_data = []
                    for row in shape.table.rows:  # 读每行
                        row_data = []
                        for cell in row.cells:  # 读一行中的所有单元格
                            cell.text = cell.text if cell.text != "" else "未填写"
                            c = cell.text
                            row_data.append(c)
                        one_table_data.append(row_data)  # 把每一行存入表
                    # 用二维列表输出表格行和列的数据
                    print(one_table_data)
                    print("第一个单元格内容:", shape.table.rows[0].cells[0].text)
                    # self.all_yuansu_list.append(one_yuansu_list)
                    # self.youyilou_list.append(shape_name)


                elif isinstance(shape, Picture):
                    print("==========================图片==============================")
                    index = 0
                    with open(f'{index}.jpg', 'wb') as f:
                        f.write(shape.image.blob)
                        index += 1
                    # self.all_yuansu_list.append(one_yuansu_list)
                    # self.youyilou_list.append(shape_name)

                else:
                    # self.all_yuansu_list.append(one_yuansu_list)
                    # self.youyilou_list.append(shape_name)
                    print("不符合条件添加成功")


            except Exception as e:
                print("报错:%s" % e)
                # self.all_yuansu_list.append(one_yuansu_list)
                # self.youyilou_list.append(shape_name)
                print("异常添加成功")


        print("实际元素:")
        print(self.shijiyuansu_list)
        print("有遗漏的元素:")
        print(self.youyilou_list)
        self.inOneListNotInTwoList(one_list=self.shijiyuansu_list,
                                  two_list=self.youyilou_list)






    #插入图片
    def insert_pic(self,slide):
        img_path = '1.jpg'  # 图片路径
        # 设置图片的位置和大小
        left = util.Cm(8.04)
        top = util.Cm(9.93)
        width = util.Cm(15.07)
        height = util.Cm(4.06)
        # 在页面中插入图片
        slide.shapes.add_picture(img_path, left, top, width, height)


    #处理多张幻灯片
    def rander_many(self):
        self.write_excel_title()  #写入标题
        all_slide_list = self.ppt.slides  #获取所有幻灯片
        len_all_slide_list = len(all_slide_list)

        print("替换后的列表内容")
        print(self.tihuan_content_list)
        for i in range(0,len_all_slide_list):
            print("处理第%s张幻灯片"% str(i+1))
            one_slide = all_slide_list[i]
            self.rander_template_with_new(slide=one_slide,zhangshu=i+1)

        #写入excel中
        print("self.all_yuansu_list:")
        for one in self.all_yuansu_list:
            print(one)
            one_yuansu_list = one   #写入excel中
            for f in range(0,len(one_yuansu_list)):
                self.oe.write_value(row=self.excel_hangshu, col=f, value=one_yuansu_list[f])
            self.excel_hangshu = self.excel_hangshu + 1

        len_all_yuansu_list = len(self.all_yuansu_list)

        print("幻灯片总共个有%s个元素" % str(len_all_yuansu_list))

        self.ppt.save(self.new_ppt_name)


if __name__ == "__main__":

    all_data_list = []
    excel_data = pd.read_excel("副本49过程定义作用时间.xlsx", header=None)  # pandas 读取excel中的数据 ,header=None,表示不要读取表头
    print(excel_data)
    print("excel_data类型:")
    print(type(excel_data))
    print(excel_data.iloc[0, 0])  # excel_data.iloc[0,0],表示获取数据中的第0行第0列的数据

    for i in range(1,50):
        one_list = []
        for j in range(0,6):
            print(excel_data.iloc[i,j])

            one_list.append(excel_data.iloc[i,j])
        print(one_list)




        #一个开始
        ppt_name = "一页模板.pptx"
        # # tihuan_content_list = [a for a in range(0,1000)]
        #
        # tihuan_content_list = []
        #
        # data_excel_name = "gjjs.xls"
        # #读取excel中的数据作为替换字符列表
        # mubiao_data = pd.read_excel(data_excel_name)
        # print(mubiao_data["赋值"])   #赋值 为表格第一行的一个表头
        # print(type(mubiao_data["赋值"]))
        # print(mubiao_data)
        # for i in range(0,6):
        #     print("第%s数据:"% str(i))
        #     tihuanshuju = mubiao_data.iloc[i,5]
        #     print(tihuanshuju )  #用iloc读取表格中的行、列数据
        #     tihuan_content_list.append(tihuanshuju )  #添加到列表中

        fangfa = str(i)

        tihuan_content_list =[]
        tihuan_content_list.append("49个管理过程")
        tihuan_content_list.append("49 management processes")
        tihuan_content_list.append("COMPANY INTRODUCE")
        tihuan_content_list.append(one_list[3])
        tihuan_content_list.append(one_list[4])
        tihuan_content_list.append("%s%s"%(one_list[1],one_list[2]))

        print(tihuan_content_list)
        new_ppt_name = "%s.pptx" % fangfa
        hcp = HandleCopyPPT(ppt_name,tihuan_content_list,new_ppt_name)
        hcp.rander_many()
        #一个结束