使用Python将Word内容按照Excel表格所列出的内容填写并保存

背景介绍:今天是我和老婆度过的第13个情人节,没买花(我觉得不实用),就想着送给老婆一个工具,快速处理她工作中遇到的简单重复劳动。她是做ISO认证的,很多资料需要整理,其中一项就是按照模板把相关企业的信息填写进去。这个可以通过邮件功能,或者VBA都可以实现。我刚开始自学Python就决意要用Python来实现这个简单的功能。在这个过程中,我遇到了几个问题,所以想写下来,作为自己的记录,也作为后来人的踏脚石。

我的情况:电脑系统是win10 ltsc 2019;Office版本是32位2019版;Python版本为3.9;

搜集资料

通过Bing并不难找到各种各样的方法去实现,我选取了@qq_41807327写的一篇文章开始了我的调试过程。

原文内容为:读取excel数据,根据word模板生成word文件。【python】【word vba】两种方法

开始调试

按照文中截图把表格和word文档做好,放在一个文件夹里,新建PY文件,使用IDE编辑调试。

文件名要保持一致,另外就是sheet1名也需要改为“首次简易合同人员”。

问题1 no module named 'docxtpl'

点击运行看报错内容:

no module named 'docxtpl'

搜到资料:

于是通过Anaconda 的Anaconda Prompt命令窗口安装docxtpl,输入一下指令:

pip install docxtpl

安装一下docxtpl这个包,解决问题1

问题2 打不开xlsx文件

弹出MessageBox说打不开xlsx文件

我注意到代码中注释说:

import xlrd  #要1.2.0版本or其他可用版本!!!我下了个2.1.0的版本,打不开xlsx文件。

于是我通过Anaconda 的Anaconda Prompt命令窗口卸载当前版本xlrd,代码如下:

pip uninstall xlrd

安装1.2.0版本,代码如下:

pip install xlrd==1.2.0

解决问题2

问题3 AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘

运行时报这个错误:AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘

处理过程参考资料:

AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘

【解决】python使用xlrd读取Excel报错的问题

在新版python3.9中,windows中使用的更新删除了getiterator方法,所以我们老版本的xlrd库调用getiterator方法时会报错。AttributeError: 'ElementTree' object has no attribute 'getiterator'

解决方法

wind中找出目录python\Lib\site-packages\xlrd下的xlsx.py文件,把两个地方的的getiterator()改成iter()后保存文件。

————————————————

版权声明:本文为CSDN博主「suhao0911」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/suhao0911/article/details/110950742

解决问题3

问题4 自动执行打印文档时卡死Spyder

前面的问题解决后,文件可以批处理,但是自动打印文档时Spyder卡死,重启电脑后,删除打印文档的部分,因为我老婆平时只是修改文档,不打印。删除部分代码如下:

is_print = win32api.MessageBox(0, "word已生成\n是否现在打印????\n打印的话可能会卡,请耐心", "是否打印", win32con.MB_YESNO)#询问是否打印
        if is_print == 6:#如果点击yes
            is_printer = win32api.MessageBox(0, "打印机是"+win32print.GetDefaultPrinter()+"\n如果不是这个打印机,请把你想要打印的打印机设置为默认打印机!!!", "默认打印机", win32con.MB_YESNO)#询问默认打印机
            if is_printer == 6:#如果点击yes
                n=0
                files_dir_list = os.listdir(os.path.join(os.getcwd(),"结果"))#遍历当前文件夹下的【结果】文件夹里的文件
                time_start = time.time()#开始时间
                for files in files_dir_list:
                    print("="*30)
                    n = n+1
                    if n !=1:
                        print("正在打印:第",n,"个文件,共",len(excel_content),"个文件\n剩余时间:"+str(round((time.time()-time_start)/60/n*(len(excel_content)-n),2)) + "分钟")#这个时间不是很准
                    if n % 5 == 0:#每发送5次命令的时候,把word窗口清理一次。如果太大,我的电脑会漏打几个文件
                        close_word()
                    printer_loading(os.path.join(result_dir,files))
                close_word()#全部结束了,再执行一次关闭word窗口
                message_exit("请等待打印机加载好了再点击!!!!!!!\n要不然会有没打印完的文件!!!!!!!", exit=False)#因为发送命令比打印快,所以程序完成的时候并不是所有文件都加载到打印列队了
            elif is_printer == 7:#如果点击了no
                pass
            pass
        elif is_print == 7:#如果点击了no
            pass

运行很完美,没有其他问题了,不需要眨眼功夫,二十多个人员的合同就做好了,现在要下班了,回去给老婆个惊喜,看看她什么表情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值