Python|VBA|实现word中表格的复制粘贴

在《Python|实现公司周报的自动生成》中我实现了公司周报(word)的自动生成。在实际运行中发现待合并的word中会有表格,而通过python的docx库进行合并时不能保证表格的样式。这里还是通过VBA脚本处理更稳定,通过VBA脚本实现word中表格的合并,并通过python的win32com库实现VBA的执行。

处理逻辑

在周报的合并中,我先把待合并的word进行遍历。在一篇word的处理中按照顺序进行段落的合并,如果word中存在表格,则通过“【插入表格】”的占位符进行占位。
在word简单合并后,只需要再遍历一下待合并的word,逐篇提取出word中的表格,在占位符位置进行表格插入即可。

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from loguru import logger
import win32com.client as win32
import os
import datetime
import time
from docx import Document

# 插入表格
def insert_tables(sourceDoc,targetDoc):
# 创建word应用程序对象
word_app = win32.Dispatch("Word.Application")
# 打开要插入表格的word文档
doc = word_app.Documents.Open('D:/a.docx')
# time.sleep(5)
# VBA字符串只能255个字符,所以拆成两段拼接一下
vba_code_part1 = '''
Sub InsertTables()
Dim sourceDoc As Document
Dim targetDoc As Document
Dim sourceTable As Table
Dim foundRange As Range
Dim deleteRange As Range
Dim tableIndex As Integer
'''
vba_code_part2 = '''
Set sourceDoc = Documents.Open("{}")
Set targetDoc = Documents.Open("{}")
'''.format(sourceDoc,targetDoc)
vba_code_part3 = '''
tableIndex = 1
' 在源文件中查找每個“【插入表格】”
For Each sourceTable In sourceDoc.Tables
Set foundRange = targetDoc.Content
With foundRange.Find
.Text = "【插入表格】"
.Execute
End With
'''
vba_code_part4 = '''
If foundRange.Find.Found Then
' 刪除段落
Set deleteRange = foundRange.Paragraphs(1).Range
deleteRange.Delete
' 复制表格
sourceTable.Range.Copy
foundRange.Paste
'''
vba_code_part5 = '''
Else
Exit Sub
End If

' 更新表格索引
tableIndex = tableIndex + 1
Next sourceTable

' 关闭源文件和目标文件
sourceDoc.Close
targetDoc.Close
End Sub

'''

# 在Word VBA中创建新的模块
vba_module = doc.VBProject.VBComponents.Add(1)
# 拼接VBA脚本
vba_code = vba_code_part1 + vba_code_part2 + vba_code_part3 + vba_code_part4 + vba_code_part5
# 添加VBA代码
vba_module.CodeModule.AddFromString(vba_code)
# 运行VBA宏
word_app.Run("InsertTables")
# 关闭word,退出word程序
doc.Close()
word_app.Quit()

# 20230725 add 遍历表格单元格行尾,若以“;”结尾则修改为“。”
def modify_word_table(filename):
doc = Document(filename)

for table in doc.tables:
for row in table.rows:
for cell in row.cells:
paragraphs = cell.paragraphs
for paragraph in paragraphs:
for run in paragraph.runs:
if run.text.endswith(";"):
modified_text = run.text[:-1] + "。" # 将分号改为句号
run.text = modified_text

doc.save(filename)

if __name__ == '__main__':
# pass
# 创建日志对象
FileLog = 'D:/workspace/weeklyNewspaper/log/log{}.log'.format(datetime.date.today())
logger.add(FileLog,rotation="500MB", encoding="utf-8", enqueue=True)
logger.info('***开始处理各总部表格***')
footnotes = []
fontindextext = []
path = 'D:/aidownload/gongsizhoubao/{}'.format(datetime.datetime.today().date())
logger.info('遍历文件夹下的文件')
for i in os.listdir(path):
if i != '公司周报{}.docx'.format(datetime.datetime.today().date()) :
logger.info(path + '/' +i)
insert_tables(path + '/' +i,path + '/公司周报{}.docx'.format(datetime.datetime.today().date()))
logger.info('--该文件已处理')
time.sleep(5)
logger.info('遍历各总部表格单元格行尾,若以“;”结尾则修改为“。”')
modify_word_table(path + '/公司周报{}.docx'.format(datetime.datetime.today().date()))
logger.info('***各总部表格处理结束***')


商业转载请联系作者获得授权,非商业转载请注明出处。

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

Python|VBA|实现word中表格的复制粘贴
http://hncd1024.github.io/2023/07/21/VBA_tableInsertWord/
作者
CHEN DI
发布于
2023-07-21
许可协议