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()来检测编码)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容