最近被已毕业的师兄拉过去给一次会议当注册人员,要挨个给参会人员制作工牌,就是将下面的表单数据里面的人名以及其拼音,按照给的ppt模版手工挨个复制粘贴过去。
虽然参会人员没有成千上万人,我们几个机动注册人员手动干活的话也就拼音那块要手动敲,但爱偷懒的我还是想万物皆可编程解决
,于是很快就想出了以下解决方案:
- 复制姓名一列到
txt
文档中,利用Python
按行读取文档内容转换成list
,安装导入xpinyin
模块,获取每个姓名对应的拼音,将其按行写入到一个新的txt
文档。- 利用
Python
的subprocess.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)
ppt_more()
这个函数是将ppt中一页幻灯片模版复制粘贴为你想要的页数,比如参会人员有N个,那么就要有N页ppt参会工牌。subprocess.Popen
函数可以用来打开特定文件,exeName
和fileName
分别是程序的exe绝对路径和要打开文件的绝对路径,这个不可以包含中文。代码中的time.sleep()
不能去掉,否则可能会引起时序紊乱。SendKeys.SendKeys
能很好地模拟键盘输入。clipfunc
是模拟复制字符串到剪切板,这里最好对待复制的中文字符进行处理.decode('utf-8').encode('gbk')
。anjianFunc()
中如果ppt是默认无格式粘贴的话,就可以直接用代码,如果粘贴的时候要选择格式,就要根据情况,像被注释掉的代码样进行选择粘贴操作。ppt_card_name()
这个函数就是模拟人工打开ppt。在程序运行前mouse.click(1054, 471)
的参数需要根据自己电脑确定,我电脑是1920*1080分辨率,这个屏幕坐标是在点击ppt右上方中的□最大化测量出来的。
最后上一张动态图:
喜欢的朋友可以收藏哦,代码可以直接用!
个人名片
姓名 毕业院校 专业 专业技能 小辉 电子科技大学(本科+硕士) 电磁场与微波技术 HFSS,CST,FEKO,AutoCAD,MATLAB(GUI),Python