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

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

完整代码如下:

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文档保存为新文件。

具体流程如下:

  1. 引入 openpyxldocx 两个库,分别用于操作excel和word文件。
import openpyxl
from docx import Document
  1. 使用 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 来跳过第一行,因为第一行通常是表头,不是我们需要的数据。

  1. 使用 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 是该行数据中的第一列。

  1. 最后,关闭Excel文件。

需要注意的是,在内层循环中,要在替换完相应的占位符后再调用 document.save() 方法保存Word文档,否则会导致代码多次保存同一个文件,从而覆盖之前保存的内容。

相关文章
|
20天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
86 5
|
3月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
46 0
|
20天前
|
Java API Apache
|
23天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
32 4
|
27天前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
|
2月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
1月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
323 5
|
1月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
135 0
|
1月前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
276 0