Python自动化ppt制作工牌

最近被已毕业的师兄拉过去给一次会议当注册人员,要挨个给参会人员制作工牌,就是将下面的表单数据里面的人名以及其拼音,按照给的ppt模版手工挨个复制粘贴过去。

参会人员名单.JPG

ppt模版.png

虽然参会人员没有成千上万人,我们几个机动注册人员手动干活的话也就拼音那块要手动敲,但爱偷懒的我还是想万物皆可编程解决,于是很快就想出了以下解决方案:

  1. 复制姓名一列到txt文档中,利用Python按行读取文档内容转换成list,安装导入xpinyin模块,获取每个姓名对应的拼音,将其按行写入到一个新的txt文档。
  2. 利用Pythonsubprocess.Popen打开指定路径的ppt文件,并使用SendKeys模块以及clipboard模块对这项纯粹是复制粘贴的重复手工劳动力活进行自动化操作

#1. 文字转拼音
pip install安装好官网的xpinyin
然后列出代码,慢慢讲解:

# -*- coding:utf-8 -*-
import requests
import urllib2
import re
import sys
import io
from selenium import webdriver
import time
import math
import os

from pywinauto import application
import SendKeys
import pymouse,pykeyboard,os,sys
from pymouse import *
from pykeyboard import PyKeyboard
import win32api
import win32con
import pyautogui
import subprocess
import win32clipboard as clipboard
import chardet
from xpinyin import Pinyin
p = Pinyin()
def pinyinTransfer(name_list):
    pinyin_array=[]
    for key in range(0,len(name_list)):
        a=name_list[key].decode('utf-8')
        b=p.get_pinyin(a, ' ')
        # print b
        c=b.split(' ')
        d=[]
        for num in range(0,len(c)):
            temp0=c[num].encode('utf-8')
            if (num>1):
                pass
            else:
                temp0=temp0.capitalize()
            d.append(temp0)
        # print d
        num=len(d)
        pinyin=''.join(d[1::])+' '+d[0]
        # print pinyin
        pinyin_array.append(pinyin)
    return pinyin_array

# print pinyinTransfer(['黄健辉','陈晨'])

temp_path='D:\\蒙皮会议\\'
keyword='Namelist'
temp=temp_path+keyword+".txt"
pinyin_list = temp_path + keyword + "_pinyin.txt"
print pinyin_list

fp= open(unicode(temp, 'utf-8'),'r')   #设置文件对象
lines = fp.readlines()
lists = []#直接用一个数组存起来就好了
count=0
for line in lines:
    #print line
    temp=line.split()
    # print temp
    count=count+1
    if(count==1):
        lists.append(temp[0].decode("utf-8-sig").encode('utf-8'))
    else:
        lists.append(temp[0])
fp.close()
pinyin_array=pinyinTransfer(lists)

fp = open(unicode(pinyin_list, 'utf-8'), 'w')  # 文件名不乱码
fp.write('\n'.join(pinyin_array))
fp.close()

注意事项讲解:

fp= open(unicode(temp, 'utf-8'),'r')   #设置文件对象

当读取的文件路径有中文字符时,为了保证不出错,我们把已知编码为utf-8编码的路径转化为unicode通用二进制编码。(可以用chardet.detect()来检测编码)
2.

lines = fp.readlines()
lists = []#直接用一个数组存起来就好了
count=0
for line in lines:
   #print line
   temp=line.split()
   # print temp
   count=count+1
   if(count==1):
       lists.append(temp[0].decode("utf-8-sig").encode('utf-8'))
   else:
       lists.append(temp[0])
fp.close()
pinyin_array=pinyinTransfer(lists)

txt文档每行只有一个名字,所以我们可以按行读取,然后用split函数将\n与姓名分开,第一个就是姓名。lists.append(temp[0].decode("utf-8-sig").encode('utf-8'))这句代码的写入是因为读取的时候发现开头的二进制文件多了一部分,网上查找后发现这是因为保存的是utf-8-sig格式导致,我们仅对第一行进行处理即可。
pinyinTransfer(lists)中,一开始把姓名进行解码.decode('utf-8'),为了实现周杰伦-Jielun Zhou的拼音效果,我们用p.get_pinyin(a, ' ')代码使得获得的拼音之间以空格符分割开,然后用b.split(' ')将其分为几部分。然后我们将前2个拼音的首字母进行大写,然后按照想要的顺序编排pinyin=''.join(d[1::])+' '+d[0]


文字转拼音效果图

#2. Python操控ppt
####这部分内容是通过模拟人工方法,并非利用ppt的宏,编写执行vbs来达到效果的。
和人工方法一样,先打开指定的ppt文件,然后点击要复制粘贴的文本框进行替换,再按下键盘的↓切换到下一页,反复操作即可。先放出代码:

# -*- coding:utf-8 -*-
import requests
import urllib2
import re
import sys
import io
from selenium import webdriver
import time
import math
import os

from pywinauto import application
import SendKeys
import pymouse,pykeyboard,os,sys
from pymouse import *
from pykeyboard import PyKeyboard
import win32api
import win32con
import pyautogui
import subprocess
import win32clipboard as clipboard
import chardet
import subprocess

def ppt_more():
    mouse = PyMouse()
    try:
        time.sleep(1)
        exeName = 'D:\Software\Office_2013\Office15\POWERPNT.EXE'
        fileName = r'D:\conference\Card.pptx'
        file = exeName + " " + fileName
        subprocess.Popen(file)
        print(fileName+'打开成功!')

        time.sleep(10)
        mouse.click(80, 250)
        time.sleep(0.1)
        SendKeys.SendKeys('^a')
        time.sleep(0.1)
        SendKeys.SendKeys('^c')
        num=203
        for k in range(0,num):
            SendKeys.SendKeys('^v')
            time.sleep(0.1)

        time.sleep(1)
        SendKeys.SendKeys('^s')
        time.sleep(10)
        # os.system(r'taskkill /F /IM POWERPNT.EXE')
        mouse.click(1904, 10)
        print (fileName+'关闭成功!')
    except:
        pass
        # fp1.close()

def clipfunc(word):
    clipboard.OpenClipboard()
    clipboard.EmptyClipboard()
    clipboard.SetClipboardData(win32con.CF_TEXT, word.decode('utf-8').encode('gbk'))
    clipboard.CloseClipboard()
    print word

def anjianFunc():
    time.sleep(0.1)
    SendKeys.SendKeys('^v')
    # SendKeys.SendKeys('+{F10}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{DOWN}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{DOWN}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{DOWN}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{DOWN}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{Right}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{Right}')
    # time.sleep(0.1)
    # SendKeys.SendKeys('{ENTER}')

def ppt_card_name(namelists,pinyinlists):
    mouse = PyMouse()
    try:
        time.sleep(1)
        exeName = 'D:\Software\Office_2013\Office15\POWERPNT.EXE'
        fileName = r'D:\conference\Card_more.pptx'
        file = exeName + " " + fileName
        subprocess.Popen(file)
        print(fileName + '打开成功!')
        time.sleep(3)
        for num in range(0,len(namelists)):
            time.sleep(0.1)
            mouse.click(1054, 471)
            time.sleep(0.1)
            SendKeys.SendKeys('^a')
            time.sleep(0.1)
            clipfunc(namelists[num])
            time.sleep(0.1)
            anjianFunc()

            time.sleep(0.1)
            mouse.click(1054, 571)
            time.sleep(0.1)
            SendKeys.SendKeys('^a')
            time.sleep(0.1)
            clipfunc(pinyinlists[num])
            time.sleep(0.1)
            anjianFunc()

            time.sleep(0.1)
            mouse.click(820, 930)
            time.sleep(0.1)
            if (num==len(namelists)):
                pass
            else:
                SendKeys.SendKeys('{DOWN}')
    except:
        pass

# ppt_more()
temp=r'D:\conference\Namelist.txt'
fp= open(unicode(temp, 'utf-8'),'r')   #设置文件对象
lines = fp.readlines()
namelists = []#直接用一个数组存起来就好了
for line in lines:
    temp=line.split()
    namelists.append(temp[0].decode("utf-8-sig").encode('utf-8'))
fp.close()

temp=r'D:\conference\Namelist_pinyin.txt'
fp= open(unicode(temp, 'utf-8'),'r')   #设置文件对象
lines = fp.readlines()
pinyinlists = []#直接用一个数组存起来就好了
for line in lines:
    temp=line.replace('\n','')
    pinyinlists.append(temp.decode("utf-8-sig").encode('utf-8'))
fp.close()
ppt_card_name(namelists,pinyinlists)
  1. ppt_more()这个函数是将ppt中一页幻灯片模版复制粘贴为你想要的页数,比如参会人员有N个,那么就要有N页ppt参会工牌。
  2. subprocess.Popen函数可以用来打开特定文件,exeNamefileName分别是程序的exe绝对路径和要打开文件的绝对路径,这个不可以包含中文。代码中的time.sleep()不能去掉,否则可能会引起时序紊乱。SendKeys.SendKeys能很好地模拟键盘输入。
  3. clipfunc是模拟复制字符串到剪切板,这里最好对待复制的中文字符进行处理.decode('utf-8').encode('gbk')
  4. anjianFunc()中如果ppt是默认无格式粘贴的话,就可以直接用代码,如果粘贴的时候要选择格式,就要根据情况,像被注释掉的代码样进行选择粘贴操作。
  5. ppt_card_name()这个函数就是模拟人工打开ppt。在程序运行前mouse.click(1054, 471)的参数需要根据自己电脑确定,我电脑是1920*1080分辨率,这个屏幕坐标是在点击ppt右上方中的□最大化测量出来的。

最后上一张动态图:

代码实现动态图

喜欢的朋友可以收藏哦,代码可以直接用!

#个人名片

姓名毕业院校专业专业技能
小辉电子科技大学(本科+硕士)电磁场与微波技术HFSS,CST,FEKO,AutoCAD,MATLAB(GUI),Python

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值