欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用Python实现Word多文档合并

程序员文章站 2022-07-05 11:18:56
用Python实现Word多文档合并1、使用python-docx和docxcompose扩展库2、doc另存为docx3、发布EXE4、爬坑爬坑1:打开rtf或doc时避免弹出爬坑2:另存为docx爬坑3:doccompose模板文件找不到通过手动的方式可以很方便的把多个Word文档合并为一个。但如何通过代码实现批量Word的合并呢?操作步骤来了。1、使用python-docx和docxcompose扩展库安装扩展库pip install python-docx docxompose合并Doc...

通过手动的方式可以很方便的把多个Word文档合并为一个。但如何通过代码实现批量Word的合并呢?操作步骤来了。

1、使用python-docx和docxcompose扩展库

安装扩展库

pip install python-docx docxompose

合并Docx

from docx import Document
from docxcompose.composer import Composer

def combine_docx(master, sub):
    if not os.path.exists(sub):#待合并文件必须存在
        return False

    if not master.endswith('.docx'):#主文件必须是docx格式(可以不存在)
        return False

    sub_docx = sub
    if not sub.endswith('.docx'):
        sub_docx = saveAsDocx(sub)

    if os.path.exists(master):
        doc_master = Document(master)
        doc_master.add_page_break()
        cp = Composer(doc_master)
        cp.append(Document(sub_docx))
    else:
        #master不存在,则sub直接给master
        doc_master = Document(sub_docx)

    doc_master.save(master)
    return True

2、doc另存为docx

因为python-docx只能合并docx,对于rtf和doc无能为力,因此需要把doc另存为docx

。需要使用win32com。

安装扩展库

pip install pywin32

另存为docx

import win32com.client as wc
word = wc.gencache.EnsureDispatch('Word.Application')

#Doc另存为Docx
def saveAsDocx(file):
    word.Visible = False
    word.DisplayAlerts = False
    doc = word.Documents.Open(file, False)#打开文档,不提示转换确认框
    new_file = file.split('.')[0] + '.docx'
    doc.SaveAs(new_file, 12)
    doc.Close()
    
    return new_file

3、发布EXE

pyinstaller

pyinstaller -D DocMergeTool.py

在dist目录下生成 DocMergeTool文件夹,测试运行没有问题,打包独立exe

pyinstaller -Fw DocMergeTool.py

-F 独立exe

-w 不显示黑窗

生成DocMergeTool.exe,完美运行。唯一不满意的一点是exe太大了,居然有225mb。在网上查了一下,是因为Anconda环境里面包含了太多不需要的依赖。

网上有两个方案:1)创建一个干净的Python环境,只安装需要的扩展库,在该环境下打包;2)在anconda里创建一个新的虚拟环境,安装需要的扩展库,重新打包。

先试了第二种方案,发现大小不变,还是200多mb。所以选了第一种方案,在虚拟机上安装了干净的python环境,重新打包,最终exe文件大小控制到15mb,初步接受。

过程碰到几个问题:生成的exe运行时提示win32com库找不到;doccompose模板文件找不到。解决办法见爬坑章节。

4、爬坑

爬坑1:打开rtf或doc时避免弹出

虽然设置了word.Visible = False和word.DisplayAlerts = False,但是通过word.Documents.Open(file)打开rtf时还是会弹转换类型确认框。

用Python实现Word多文档合并

该选项在这里:

用Python实现Word多文档合并
可以手动关掉,但是用户未必知道,所以还是要从代码上解决。win32com实际调用的是以com方式调用office接口,所以祭出MSDN:https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word.documents.open?view=word-pia
用Python实现Word多文档合并

ConfirmConversions就是我们要找的,给它传False,就不会弹转换类型确认框了。

爬坑2:另存为docx

https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word._document.saveas?view=word-pia

用Python实现Word多文档合并

FileFormat对应值在该链接可以找到:https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word.wdsaveformat?view=word-pia

爬坑3:doccompose模板文件找不到

提示如下:

FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\Administrator\dist\xxx\docxcompose\templates\custom.xml’

解决办法:

找到docxcompose\templates\custom.xml文件所在的位置,通过–add-data 参数添加到打包文件中。另外也可以使用spec文件,更强大,更灵活。可以参考传送门

pyinstaller
-Fw --add-data C:\work\docxcompose\templates\*.*;docxcompose\templates\.
C:\work\DocMergeTool.py

也可以直接下载使用:百度网盘 提取码:zpr1

本文地址:https://blog.csdn.net/lsyoulin/article/details/107187064