背景介绍:今天是我和老婆度过的第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‘
在新版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
运行很完美,没有其他问题了,不需要眨眼功夫,二十多个人员的合同就做好了,现在要下班了,回去给老婆个惊喜,看看她什么表情。