完整代码如下:
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文档,否则会导致代码多次保存同一个文件,从而覆盖之前保存的内容。