记录一次py中如何将excel中的数据导出到word中, 关键字导出

2024-02-29 18:35:12 浏览数 (2)

完整代码如下:

代码语言:javascript复制
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文档保存为新文件。

具体流程如下:

引入 openpyxldocx 两个库,分别用于操作excel和word文件。

代码语言:javascript复制
import openpyxl
from docx import Document

使用 openpyxl 库打开excel文件list.xlsx,并将数据读出保存到变量 data 中。在读取数据时,如果单元格的值为 None,则将其转换为空字符串 “”。

代码语言:javascript复制
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文档输出为新文件。

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

0 人点赞