Python Modify Word


使用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.


文章作者: doghoo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 doghoo !
  目录