完整代码如下:
import openpyxl
from docx import Document
import datetime
# 打开excel文件并读取数据
workbook = openpyxl.load_workbook('list.xlsx')
sheet = workbook.active
data = []
for row in sheet.iter_rows(min_row=2, values_only=True):
row = [str(cell) if cell is not None else "" for cell in row]
data.append(row)
for j in range(len(data)):
# 打开word文件并替换文本
document = Document('model.docx')
for paragraph in document.paragraphs:
# print(paragraph.text)
if "致,{{name}}" in paragraph.text and data[j][0]:
paragraph.text = paragraph.text.replace("{{name}}", data[j][0])
if "{{date1}}" in paragraph.text and data[j][6]:
paragraph.text = paragraph.text.replace("{{date1}}", data[j][6])
if "{{hi}}" in paragraph.text and data[j][10]:
paragraph.text = paragraph.text.replace("{{hi}}", data[j][10])
if "{{date2}}" in paragraph.text and data[j][6] and not "{{date1}}" in paragraph.text:
paragraph.text = paragraph.text.replace("{{date2}}", data[j][6])
if "{{date2}}" in paragraph.text and data[j][7] and "{{date1}}" in paragraph.text:
paragraph.text = paragraph.text.replace("{{date2}}", data[j][7])
if "{{bj}}" in paragraph.text and data[j][8]:
paragraph.text = paragraph.text.replace("{{bj}}", data[j][8])
if "{{wyj}}" in paragraph.text and data[j][9]:
paragraph.text = paragraph.text.replace("{{wyj}}", data[j][9])
now = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
document.save(f'output_{data[j][0]}_{now}.docx')
# 关闭 Excel 文件
workbook.close()
这段代码的主要功能是从excel文件中读取数据,然后以此数据为基础替换掉word文档中的相应占位符,并将替换后的word文档保存为新文件。
具体流程如下:
引入 openpyxl
和 docx
两个库,分别用于操作excel和word文件。
import openpyxl
from docx import Document
使用 openpyxl
库打开excel文件list.xlsx
,并将数据读出保存到变量 data 中。在读取数据时,如果单元格的值为 None,则将其转换为空字符串 “”。
workbook = openpyxl.load_workbook('list.xlsx') # 打开excel文件
sheet = workbook.active # 获取活动工作表
data = []
for row in sheet.iter_rows(min_row=2, values_only=True):
row = [str(cell) if cell is not None else "" for cell in row] # 转换None为""
data.append(row)
workbook.close() # 关闭Excel文件
在这里我们使用了
min_row=2
来跳过第一行,因为第一行通常是表头,不是我们需要的数据。
使用 docx
库打开Word文档model.docx
,并将文本进行替换,最后将替换后的word文档输出为新文件。
document = Document('model.docx') # 打开word模板
for paragraph in document.paragraphs:
if "致,{{name}}" in paragraph.text:
for j in range(len(data)):
for paragraph in document.paragraphs:
if "{{name}}" in paragraph.text and data[j][0]:
paragraph.text = paragraph.text.replace("{{name}}", data[j][0])
if "{{date1}}" in paragraph.text and data[j][6]:
paragraph.text = paragraph.text.replace("{{date1}}", data[j][6])
if "{{hi}}" in paragraph.text and data[j][10]:
paragraph.text = paragraph.text.replace("{{hi}}", data[j][10])
if "{{date2}}" in paragraph.text and data[j][6] and not "{{date1}}" in paragraph.text:
paragraph.text = paragraph.text.replace("{{date2}}", data[j][6])
if "{{date2}}" in paragraph.text and data[j][7] and "{{date1}}" in paragraph.text:
paragraph.text = paragraph.text.replace("{{date2}}", data[j][7])
if "{{bj}}" in paragraph.text and data[j][8]:
paragraph.text = paragraph.text.replace("{{bj}}", data[j][8])
if "{{wyj}}" in paragraph.text and data[j][9]:
paragraph.text = paragraph.text.replace("{{wyj}}", data[j][9])
print(data,j)
document.save(f'output_{data[j][0]}.docx')
在这个过程中,我们使用了双重循环。外层的 for 循环遍历Word文档中的每一段落,找到包含
致,{{name}}
文本的段落。内层的 for 循环用来遍历数据,每次将数据中的占位符{{name}}
等替换为相应的数据,最后通过document.save()
方法将替换好数据的Word文档保存为新文件,文件名为output_{name}.docx
,其中name
是该行数据中的第一列。
最后,关闭Excel文件。
需要注意的是,在内层循环中,要在替换完相应的占位符后再调用
document.save()
方法保存Word文档,否则会导致代码多次保存同一个文件,从而覆盖之前保存的内容。