使用Python批处理修改word文件
使用zipfile库修改.docx文件,zipfile不用额外安装
如果需要修改.doc文件,还需要pypiwin32库,
说明:pypiwin32库只能在Windows下使用,因此此文例子为Windows下运行,采用Python3.9
安装需要的库
Windows下安装:
pip install pywin32
代码范例
# _*_coding:utf-8_*_
# 使用方法
# 安装pyhon3
# 命令行安装pywin32
# 命令:pip install pywin32
import os,zipfile
from win32com import client as wc
#当前目录
path='.\\'
# 文件名上面需要替换的字符串内容
# 比如文件名称为《Pojec-02-R02 设计开发计划书.docx》,想改成《XXXX-02-R02 设计开发计划书.docx》
perfix="Pojec-02"
# 文件名上面目标字符串内容
target="XXXX-02" # 02指研发过程
# 用于保存文档内部的需要替换内容的键值对
replaceDic= {"Pojec-02":"XXXX-02", #替换文档中的编号
"北京xxxx有限公司":"上海XXXXXXX", #替换公司名称
"机密":"", #删除机密
"秘密":""}
#遍历path目录并将docx和xlsx挑选出来修改
def modifyFiles(oldstr, newstr):
# fileNames =[]
for file in os.listdir(path):
if file.endswith('.docx') and file.find(perfix)>=0:
print (file,'\t', file.replace(oldstr,newstr))
#fileNames.append((os.path.join(path,file), os.path.join(path,file.replace(perfix,target))))
#fileNames.append((file, file.replace(oldstr,newstr)))
docx_replace(file, file.replace(oldstr,newstr), replaceDic )
if file.endswith('.xlsx') and file.find(perfix)>=0:
#print( os.path.join(path,file), os.path.join(path,file.replace("KTH2-02-01","ECOM-02")))
print (file,'\t', file.replace(oldstr,newstr))
#fileNames.append((os.path.join(path,file), os.path.join(path,file.replace(perfix,target))))
#fileNames.append((file, file.replace(oldstr,newstr)))
xlsx_replace(file, file.replace(oldstr,newstr), replaceDic )
# return fileNames
#替换docx中的文字,包含页眉页脚
def docx_replace(old_file,new_file,rep):
zin = zipfile.ZipFile (old_file, 'r')
zout = zipfile.ZipFile (new_file, 'w')
for item in zin.infolist():
buffer = zin.read(item.filename)
if (item.filename == 'word/document.xml' or 'header' in item.filename or 'footer' in item.filename):
res = buffer.decode("utf-8")
for r in rep:
res = res.replace(r,rep[r])
buffer = res.encode("utf-8")
zout.writestr(item, buffer)
zout.close()
zin.close()
# 替换xlsx中的文字
def xlsx_replace(old_file,new_file,rep):
zin = zipfile.ZipFile (old_file, 'r')
zout = zipfile.ZipFile (new_file, 'w')
for item in zin.infolist():
buffer = zin.read(item.filename)
if ('xl/worksheets/sheet' in item.filename):
res = buffer.decode("utf-8")
for r in rep:
res = res.replace(r,rep[r])
buffer = res.encode("utf-8")
zout.writestr(item, buffer)
zout.close()
zin.close()
# 将目录下的xls文件转换成xlsxx文件
def convertXlsToXlsx(rawpath):
excel = wc.Dispatch("Excel.Application")
filenamelist = os.listdir(rawpath)
for i in os.listdir(rawpath):
# 找出文件中以.xls结尾并且不以~$开头的文件(~$是为了排除临时文件的)
if i.endswith('.xls') and not i.startswith('~$'):
print(i)
# try
# 打开文件
wb = excel.Workbooks.Open(rawpath + i)
# # 将文件名与后缀分割
rename = os.path.splitext(i)
# 将文件另存为.xlsx
wb.SaveAs(rawpath + rename[0] + '.xlsx', 51) # 51表示xlsx格式
wb.Close()
excel.Quit()
# 将目录下的doc文件转换成docx文件
def convertDocToDocx(rawpath):
word = wc.Dispatch("Word.Application")
filenamelist = os.listdir(rawpath)
for i in os.listdir(rawpath):
# 找出文件中以.doc结尾并且不以~$开头的文件(~$是为了排除临时文件的)
if i.endswith('.doc') and not i.startswith('~$'):
print(i)
# try
# 打开文件
doc = word.Documents.Open(rawpath + i)
# # 将文件名与后缀分割
rename = os.path.splitext(i)
# 将文件另存为.docx
doc.SaveAs(rawpath + rename[0] + '.docx', 12) # 12表示docx格式
doc.Close()
word.Quit()
#如果模板为xls文件,需要先转换程xlsx
#convertXlsToXlsx(path)
#如果模板为doc文件,需要先转换程docx
#convertDocToDocx(path)
modifyFiles(perfix, target)
以上可以自己修改以便于适于自己的应用场景。
End.