win32模块打印word文档出问题了,请教高手怎么解决?
工作中经常遇到一种情况:从excel文件中提取数据,填到word模板中,并将word打印。我想,编一段代码,用以实现自动提取数据,填写模板,并打印。前面的部分都实现了,唯独打印部分除了问题。下面是打印部分的代码:
import os,win32api,time
def print_docx(file_dir,num):
'''打印num份文档'''
for i in range(num):
win32api.ShellExecute (0,"print",file_dir,'',".",0)
# 调用shellexecute,执行打印命令
# 第一个参数为父窗口的句柄,如果没有父窗口,则为0
# 第二个参数为要进行的操作,为“open”、“print”或者为空。
# 第三个参数为要运行的程序,或者打开的脚本或文件。
# 第四个参数要向程序传递的参数,如果打开的为文件,则为空。在此为空,则意味着启动默认打印机
# 第五个参数是程序初始化目录
# 第六个参数是是否显示窗口,0表示不显示,即不打开文件的窗口
目前的问题是这样的,如果只打印一个文件,且文件只打印一份,程序可以正常运行。但如果打印多份,就会弹出下面的窗口:
file:///C:/Users/Administrator/Desktop/%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6/%E5%BC%B9%E7%AA%97.jpg
弹窗提示:
××.docx被“Microsoft”锁定,无法编辑
只读打开副本
创建本地副本,稍后合并更改
在原副本可用时,接收通知
确定取消
当我选择一个选项,点击确定后,程序可以运行不报错,但是打印顺序经常会乱。
因为模板都是打印好的,我把每个人的模板文件对照Excel中的数据排好序,放入打印机,然后开始打印。
如果打印顺序乱了,就把每个人的信息都搞打印错乱了。
请教各位高手,看看该怎么解决
1、点击“我的电脑”右击,选中属性
2、单击高级系统设置
3、单击“环境变量”,下面只需修改环境变量即可。
4、在弹出的对话框中,选择变量Temp,然后单击编辑。
5、将变量值改为C:\WINDOWS\Temp,再单击确定。
6、变量Temp,也做同样处理。
7、点确定即可。操作完成看下效果 Hello. 发表于 2020-4-21 15:47
1、点击“我的电脑”右击,选中属性
2、单击高级系统设置
我试试!然后回复你。{:5_110:} Hello. 发表于 2020-4-21 15:47
1、点击“我的电脑”右击,选中属性
2、单击高级系统设置
请问:“在弹出的对话框中,选择变量Temp“,指的是将用户变量哪个框里面的Temp进行编辑是吗?
“6、变量Temp,也做同样处理。”这里你是不是在说变量Tmp?对它也做同样操作是不是将他的值也修改为C:\WINDOWS\Tmp?还有就是大小写有没有影响? jackoolee 发表于 2020-4-21 16:04
请问:“在弹出的对话框中,选择变量Temp“,指的是将用户变量哪个框里面的Temp进行编辑是吗?
“6、变 ...
Tep是的
大小写有影响 jackoolee 发表于 2020-4-21 15:49
我试试!然后回复你。
我试了一下:将用户变量里面的两个变量修改了,TEMP 的值是C:\WINDOWS\Temp;TMP 的值是C:\WINDOWS\Tmp。然后重启程序,打印一个文件,4份,仍然会出现弹窗。是不是我哪里操作的不对? jackoolee 发表于 2020-4-21 16:41
我试了一下:将用户变量里面的两个变量修改了,TEMP 的值是C:\WINDOWS\Temp;TMP 的值是C:\WINDOWS\Tmp。 ...
第二个也改成Temp 我想知道你填到word模板中用的什么方法
snaker 发表于 2020-4-21 16:45
我想知道你填到word模板中用的什么方法
word 模板事先发给每个人,让他们打印后,填写个人基本信息,盖上公章,而后再交给我,有我负责对照Excel里的数据,为他们填写后续信息。因为这是例行性工作,每个月都要进行,而且人数很多,所以我就想试着看能否编写程序自动执行。
我的方法是:用openxl模块读取Excel数据,用docx模块生成word文档。在填写word模板时候,事先设计好模板,待填入的数据位置固定。然后将模板内容的颜色设为白色。然后用docx慕课打开模板,填入从Excel中读取的数据,然后把数据设为黑色,然后另存文件,然后 用win32api模块打印。 jackoolee 发表于 2020-4-21 16:57
word 模板事先发给每个人,让他们打印后,填写个人基本信息,盖上公章,而后再交给我,有我负责对照Excel ...
可以了吗 Hello. 发表于 2020-4-21 17:38
可以了吗
还是不行。打印多份或多个人,依然会出现弹窗,打印顺序还是会乱。
前面的运行都很顺利,另存的文件都没问题,就最后打印出毛病了。
我只好一个个用word打开,逐个人打印了。至少比手写快点{:5_109:} jackoolee 发表于 2020-4-21 17:48
还是不行。打印多份或多个人,依然会出现弹窗,打印顺序还是会乱。
前面的运行都很顺利,另存的文件都没 ...
可以最佳么^_^ Hello. 发表于 2020-4-21 17:38
可以了吗
我弄不清楚原因是啥,不知道这和环境变量有什么关系。
我猜测原因是不是这样:
win32api打印docx时候,要调用word程序,然后程序跑的比较快,但打印过程较慢。word程序在一次调用没有结束时候,不能进行下一次调用。导致很多文件堆积在一起。于是出现弹窗。如果我点击弹窗的顺序不对,打印就会乱序。
我试着用time.sleep,每次打印结束后,暂停5秒,然后弹窗就消失了。
我想知道有没有一种方法,就是把打印任务依次传给打印机,就想在word里面操作打印多份文档一样? jackoolee 发表于 2020-4-21 17:56
我弄不清楚原因是啥,不知道这和环境变量有什么关系。
我猜测原因是不是这样:
win32api打印docx时候, ...
等一下吧,回复审核了{:10_266:} Hello. 发表于 2020-4-21 18:11
等一下吧,回复审核了
我现在级别太低,没法加好友 jackoolee 发表于 2020-4-22 09:33
我现在级别太低,没法加好友
脱机使用
页:
[1]