昨天女朋友告诉我她遇到了一个比较复杂的难题,需要对七十多篇文档统一改格式,改的很简单就是文件太多,然后保存为pdf,每个文档都有好多页,可能手动改得改一天。听了之后,我突然萌生了给写个程序帮她改的想法。说干就干。后面会把程序贴出来,并记录下遇到的问题。
首先是导入模块:
import win32com
from win32com.client import Dispatch
import glob
然后开启一个进程:
w = win32com.client.Dispatch('kwps.Application') # 可能会报错
w.Visible = 0
w.DisplayAlerts = 0
刚开始我使用的是“Word.Application”,结果报错pywintypes.com_error: (-2147221005, '无效的类字符串', None, None),查了一些资料,说是改成“wps.Application”或者“kwps.Application”,改了之后果然成功了。仔细想来,原理应该是开一个文档处理程序(office或wps)的线程进行处理,因为我电脑没有装office,所以失败了。wps和kwps的区别是你电脑上转wps的版本。
接下来就是处理的程序:
def process():
filenames = glob.glob(root + '\*.doc')
for filename in filenames:
print(filename)
doc = w.Documents.Open(FileName=filename)
# # 文档最开始插入文字,这里是插入文档的名字
# insert = filename.split('.')[0] + '\n'
# myRange = doc.Range(0, 0)
# myRange.InsertBefore(insert)
par = doc.Range(10, doc.Content.End)
par.ParagraphFormat.LineSpacing = 12
w.ActiveDocument.Select()
w.Selection.Font.Name = "微软雅黑"
w.Selection.Font.Size = "12"
# 删除空行,这里数量是1,因为回车占一个字符
for each in w.ActiveDocument.Paragraphs:
if each.Range.Words.Count == 1:
each.Range.Delete()
print("已处理:" + filename)
# 保存为PDF
pdf_name = filename.split('.')[0]
doc.SaveAs(pdf_name, FileFormat=17)
doc.Close()
print("处理完毕!")
运行完成之后,在目录里生成对应的PDF文件了,每个文件名都跟之前的相对应。
完整代码如下:
import win32com
from win32com.client import Dispatch
import glob
w = win32com.client.Dispatch('kwps.Application')
w.Visible = 0
w.DisplayAlerts = 0
def process():
filenames = glob.glob(root + '\*.doc')
for filename in filenames:
print(filename)
doc = w.Documents.Open(FileName=filename)
# # 文档最开始插入文字,这里是插入文档的名字
# insert = filename.split('.')[0] + '\n'
# myRange = doc.Range(0, 0)
# myRange.InsertBefore(insert)
par = doc.Range(10, doc.Content.End)
par.ParagraphFormat.LineSpacing = 12
w.ActiveDocument.Select()
w.Selection.Font.Name = "微软雅黑"
w.Selection.Font.Size = "12"
# 删除空行,这里数量是1,因为回车占一个字符
for each in w.ActiveDocument.Paragraphs:
if each.Range.Words.Count == 1:
each.Range.Delete()
print("已处理:" + filename)
# 保存为PDF
pdf_name = filename.split('.')[0]
doc.SaveAs(pdf_name, FileFormat=17)
doc.Close()
print("处理完毕!")
if __name__ =='__main__':
root = r'F:\github\Modify_word_using_python\word'
process()
后续:我用了半个小时就搞定了我女朋友一天的工作量,她高兴疯了。我告诉她,知识就是力量!