📢作者: 小小明-代码实体
📢博客主页:https://blog.csdn.net/as604049322
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!
📢本文链接:https://xxmdmst.blog.csdn.net/article/details/129409456
需求:有几百个Word文档,同时存在doc和docx格式,要合并到一个文件中。
对于该问题,python最简单的方法是调用宏复制粘贴去实现。我的思路:
先创建一个word空文档,复制每个要合并的文档,在空文档中新增一个空段落,然后在刚才新增的段落上粘贴当前遍历到的Word,循环完毕后保存文件。
最终完整代码为:
"""
小小明的代码
CSDN主页:https://blog.csdn.net/as604049322
"""
__author__ = '小小明'
__time__ = '2023/3/8'
from glob import glob
from win32com import client as win32
import os
def combine_word(src_dir, result):
word = win32.Dispatch("Word.Application")
word.Visible = True
rDoc = word.Documents.Add()
# 将此属性设置为false可在代码运行时抑制提示和警报消息;当消息需要响应时,Excel将选择默认响应。
word.DisplayAlerts = False
# 关闭屏幕更新,可视模式下将无法看到执行情况,需要看的时候重新设置为True即可
word.ScreenUpdating = False
for file in glob(f"{src_dir}/[!~]*.doc*"):
filepath = os.path.abspath(file)
print(filepath)
wdDoc = None
try:
wdDoc = word.Documents.Open(filepath)
# Range(start,end)根据起始和结束位置获取文档对象,不传入获取整个文档
wdDoc.Range().Copy()
# 粘贴前先插入一个段落
new_p = rDoc.Paragraphs.Add()
# 将结果文档粘贴到新段落中
new_p.Range.Paste()
finally:
if wdDoc is not None:
wdDoc.Close()
word.ScreenUpdating = True
rDoc.SaveAs(os.path.abspath(result))
rDoc.Close()
word.Quit()
if __name__ == '__main__':
src_dir = "word合并"
result = "word合并.docx"
combine_word(src_dir, result)
最终以下文件都合并到了一个文件中:
不过上述代码经过测试发现了一点图片错位的问题:
另外我发现Word自带的功能也可以完成Word文档合并的需求:
通过程序在循环中调用上述方法,居然会出现相同的问题,但写死代码调用就没有这个问题。
为了解决该问题,我的考虑是,每次插入一个文件后,插入一个分页符。
再进一步考虑,如果我们总是新建文件,就可能丢失了页边距等格式,为了解决该问题,我们可以考虑将第一个文件作为基准文件,这样就能保证拥有第一个文件的基准样式。
最终代码为:
"""
小小明的代码
CSDN主页:https://blog.csdn.net/as604049322
"""
__author__ = '小小明'
__time__ = '2023/3/9'
from glob import glob
from tqdm import tqdm
from win32com import client as win32
import os
def combine_word(src_dir, result, ScreenUpdating=False):
files = glob(f"{src_dir}/[!~]*.doc*")
if len(files) == 0:
print("未找到Word文档")
return
word = win32.Dispatch("Word.Application")
word.Visible = True
rDoc = None
qbar = tqdm(files)
word.ScreenUpdating = ScreenUpdating
for file in qbar:
filepath = os.path.abspath(file)
qbar.set_description(os.path.basename(filepath))
if rDoc is None:
rDoc = word.Documents.Open(filepath)
new_p = rDoc.Paragraphs.Add()
else:
new_p = rDoc.Paragraphs.Add()
new_p.Range.InsertFile(filepath)
new_p.Range.InsertBreak()
# 删除文末空白行
while True:
p = rDoc.Paragraphs(rDoc.Paragraphs.Count)
if p.Range.Text.strip() == "":
p.Range.Delete()
else:
break
word.ScreenUpdating = True
rDoc.SaveAs(os.path.abspath(result))
rDoc.Close()
word.Quit()
if __name__ == '__main__':
src_dir = "word合并"
result = "word合并.docx"
combine_word(src_dir, result)
再次运行:
可以看到结果图片保持了原有的相对位置。