这几日做了一个小程序,主要功能是使用win32com库调用WPS,并运用一些简单的二次开发指令,实现文件格式的转换并另存为新文件。
大致代码如下:
import win32com import win32com.client w=win32com.client.constants wps=win32com.client.gencache.('kwps.application') d=wps.Documents.Open(r'C:\Users\asus\Desktop\project\文档2.docx') d.SaveAs2(FileName=r'C:\Users\asus\Desktop\project\文档文本.txt',FileFormat=w.wdFormatText )
pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -2147467259), None)
在网上找了很久,最后在一个博客里看到有人使用了
win32com.client.gencache.EnsureDispatch
加载了WPS,便在我的程序中使用了,不过那位博主也提出:“不知道解决的原因是什么。”我在使用了EnsureDispatch后,问题也凑巧得到了“解决”(继续看下去),代码如下:
import win32com import win32com.client w=win32com.client.constants wps=win32com.client.gencache.EnsureDispatch('kwps.application') d=wps.Documents.Open(r'C:\Users\asus\Desktop\project\文档2.docx') d.SaveAs2(FileName=r'C:\Users\asus\Desktop\project\文档文本.txt',FileFormat=w.wdFormatText )
经过我的反复尝试,我发现:
问题的出现原因并不是接入的方式或者其他什么原因,而是一个很简单的原因:当前程序没有对目标文件的支配权限。也就是说,我们挂载的WPS并没有权限去另存为这个被打开的文档。继续深究,原因很简单也很可笑:
之前打开的WPS尚未被关闭。
这个时候,出现问题是很自然的事情了。在采用EnsureDispatch的同时,我恰巧手动关闭了WPS的进程,再发现运行成功后也没有再试,而是继续编写了后续关闭挂载程序的函数,所以问题也就再没有出现过……以至于我认为它“解决了”。
附上关闭WPS的代码:
def closesoft(): print('''挂载程序关闭中…… ''') import win32com import win32com.client wc=win32com.client.constants try: wps=win32com.client.gencache.EnsureDispatch('kwps.application') except: wps=win32com.client.gencache.EnsureDispatch('wps.application') else: wps=win32com.client.gencache.EnsureDispatch('word.application') try: wps.Documents.Close() wps.Documents.Close(wc.wdDoNotSaveChanges) wps.Quit except:pass
虽然最后并不真的影响程序使用,但问题依然存在,记下来,各位以后可以知道原因。