分享

使用python对excel和word文件进行批量操作,从而简化工作流程

 rUNoUT 2020-05-19

前言

前两天,朋友想让我帮个忙:公司给了一个word模板,让他将excel中的数据输入到word模板里面。数据量很多,所以问问我能不能编程来解决这个简单但是重复枯燥的工作。

想法

我其实对编程还不太熟练,也不会用宏,只会点python。拿到模板后,我先瞅了瞅模板,发现模板里面在需要输入的地方都用空格给标出来了。我开始的想法是能不能写循环读取word中的文字,遇到空格就在空格处输入excel里面的内容。后来觉得这样写太不正常了,其实主要是发现了win32com这个很厉害的第三方库。这个库可以提供类似于word里面全局替换的那种功能。于是,我只需要用excel里面的数据内容替换掉word模板的空格就可以了。

用到的第三方库

win32com
xlrd
我电脑上的环境用的是anaconda(python3.5)+pycharm。安装第三方库时,既可以在pycharm的图形界面直接安装,也可以用 conda install 语句安装。conda 安装上述两个库的语句如下:

conda install pywin32
conda install xlrd

记得pycharm里面的编译器一定要选对,否则会发现找不到第三方库。

主要代码

import xlrd
import sys
import win32com
import datetime
from xlrd import xldate_as_tuple
from win32com.client import Dispatch,constants

#word文件路径,这里的两个路径得用绝对路径,win32com好像不支持相对路径
template_path = r'path'

#生成文件的位置
store_path = r'path'

w = win32com.client.Dispatch('Word.Application')
w.Visible = 0 # 后台显示
w.DisplayAlerts = 0 #不警告

#读取execl文件
data = xlrd.open_workbook('data.xlsx')
#选择文件中的第一个表
table = data.sheet_by_index(0)

#读取数据的行数和列数
nrows = table.nrows
ncols = table.ncols
#创建需要替换的列表,这个列表里的字符串就是word文档里需要替换的字符串,我这里是把空格改成了拼音。
list = ['','','','','']
#完成的文件个数
num = 0

for row in range(2,nrows): #这里选择从2开始循环,是因为我要的数据在excel里面是从第三行开始的。。。。
	num = num +1
	doc = w.Documents.Open(FileName = template_path)
	#一次替换开始
	col = 0 #从第一列开始读数据
	cell = table.cell(row,col).value
	w.Selection.Find.ClearFormatting()
	w.Selection.Find.Replacement.ClearFormatting()
	w.Selection.Find.Execute(list[0], False, False, False, False, False, True, 1, True, cell, 1)
	#第一次替换结束
	···
	doc.SaveAs(store_path+word_name+'.doc')
	doc.Close()
	print(num)

以上就是代码的主体部分,很简单,但是里面有两个小问题需要注意一下:

  1. 注意word模板里面的正文部分不要被替换掉,即需要被替换的字符串不要出现在正文中
  2. xlrd模板在读取excel里面的日期时,会把该日期读取为浮点数,因此替换到word模板里时,日期会变成浮点数

针对第一个问题,只需要将被替换的字符串写成不常见的字符就可以了,也可以是拼音之类的,和正文有关。
针对第二个问题,我的word模板需要把日期写成xx年xx月xx日,因此,我写了如下代码来解决这个问题:

cell = table.cell(row,col).value #此时的cell不是字符串,而是浮点数
cell = xldate_as_tuple(cell,0)  #将浮点数转为元组,元组的前三位分别是年、月、日
cell_date = str(cell[0])+'年'+str(cell[1])+'月'+str(cell[2])+'日'

这样,就将浮点数转成了字符串。

程序打包为exe可执行文件

运行程序后,没啥问题,就准备将源文件打包成exe文件,用到的第三方库为Pyinstaller,安装方法如下:

conda install PyInstaller

安装完成后,打开cmd窗口,把当前路径切换到py文件所在的路径,然后运行如下命令:

pyinstaller -F myfile.py

-F表示生成单个可执行文件,生成后的exe文件位于dist文件夹下。点击exe文件,exe文件正常运行。

嗯,任务完成。

最后一点补充

看到网上有人打包完成后运行时,会出错,提示缺少module文件,这种情况就是打包时发生了错误。首先先看看你的site-packages文件夹里有没有你使用的第三方库,没有的话,找到你下载第三方库的位置,把它复制过来,然后把build里的文件删掉,重新打包

如果打包之后还是提示缺失module文件,那就找到py文件下的spec文件,这个是在打包的过程中生成的python脚本,打开该文件,找到’hiddenimports=[]’,将缺失的module写进去,如下:

hiddenimports=['xlrd','win32com']

然后再在cmd窗口的该目录下运行

pyinstaller -F myfile.spec

这样,在打包的过程中,会强制寻找该module,从而完成打包。

OK,最后,祝大家早日成为编程大佬。

参考文章:

  1. https://blog.csdn.net/weixin_42052836/article/details/82315118
  2. https://my.oschina.net/zhangyangyang/blog/737072
  3. https://blog.csdn.net/orangleliu/article/details/38476881
  4. http://www./infodetail-1380635.html
  5. https://blog.csdn.net/yelyyely/article/details/8997247

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多