python自动化办公——定制化读取Excel数据并写入到word表格

Python自动化办公——Excel写word表格

文章目录

  • Python自动化办公——Excel写word表格
    • 一、引言
    • 二、数据准备
    • 三、python代码
      • 1、方法一
      • 2、方法二
      • 3、方法三

一、引言

最近到了毕业设计答辩的时候,老师让我帮毕业生写一段毕业设计的功能就是提供一个学士学位授予申请表,根据定制化需求,编写定制化代码。

二、数据准备

docx格式的word如下图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBrj88Zk-1687013257270)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230615225250472.png)]

再提供一个Excel表格,要求可以直接读取表格里的对应内容,填入到word表格里的对应位置。表格是我自己定义的如下表:

学生姓名所在院系班级简称学号(10位)学制身份证号专业名称外语A级外语四级外语六级专业四级专业八级项目名称1项目名称2项目名称3项目名称4项目名称5项目名称6项目名称7项目名称8奖励绩点1奖励绩点2奖励绩点3奖励绩点4奖励绩点5奖励绩点6奖励绩点7奖励绩点8处分名称1处分名称2处分名称3罚扣绩点1罚扣绩点2罚扣绩点3处分时间1处分时间2处分时间3
天海电子与信息工程学院智能BG201744411115555452013145555人工智能智慧农业可视化计算机视觉教辅计赛国家一等奖互联网+省二等奖0.20.20.40.1偷吃老师抽屉的饼干撒谎的人要吞一千根针哦0.10.92023年6年15日2022年12月14日

三、python代码

那么根据定制化需求,我制作了三套代码。

1、方法一

我们的逻辑是:

  1. 读取Excel文件
  2. 找准word中表格对应位置与顺序
  3. 插入读取到Excel中的数据到word表格中

先展示最终嵌入到项目中的代码吧.

首先需要引入docx的库和pandas库,注意由于docx库的版本不同使用的方法也有一定差异

import docx
from docx.enum.text import WD_ALIGN_PARAGRAPH
import pandas as pd

接下来进行第一步,读取表格数据,并打开word

#打开或创建word文档
doc_name = "test.docx"
doc = docx.Document(doc_name)
# 读取Excel数据
df = pd.read_excel('source.xlsx', sheet_name='info')

content = [list(row) for _, row in df.iterrows()]

print(content)

人为分析了word的表格索引位置,并写入index中

table = doc.tables[0]

index = [[0,3],[0,12],[1,3],[1,12],[2,3],[2,12],[5,3],
[5,5],[5,10],[5,13],[5,16],[7,7],[7,16],[8,7],[8,16],
[9,7],[9,16],[10,7],[10,16],[12,3],[12,7],[12,11],
[13,3],[13,7],[13,11],[14,3],[14,7],[14,11]]

写入28条数据并将空的数据输入空格,设置居中和宋体字体,随后将输出的word保存为学号+.docx

for i in range(0,28):
	cell = table.cell(index[i][0],index[i][1])
	cell.text = str(content[0][i])
	if cell.text == 'nan':
		cell.text = ' '
	print('%d:'%i,cell.text)
	cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
	for par in cell.paragraphs:
		for run in par.runs:
			run.font.size = docx.shared.Pt(12)
			run.font.name = '宋体'


filename = str(df.iloc[0, 3])
doc.save(filename + '.docx')

完整代码如下:

    file_name = "D:\\poppler-0.67.0_x86\\test1.docx"
    doc = docx.Document(file_name)
    df = pd.read_excel('D:\\poppler-0.67.0_x86\\学员表.xlsx', sheet_name='info')
    print(df)
    for item in range(df.shape[0]):
        content = [list(row) for _, row in df.iterrows()]
        table = doc.tables[0]
        index = [[0, 3], [0, 12], [1, 3], [1, 12], [2, 3], [2, 12], [5, 3],
                 [5, 5], [5, 10], [5, 13], [5, 16], [7, 7], [7, 16], [8, 7], [8, 16],
                 [9, 7], [9, 16], [10, 7], [10, 16], [12, 3], [12, 7], [12, 11],
                 [13, 3], [13, 7], [13, 11], [14, 3], [14, 7], [14, 11]]
        for i in range(0, 28):
            cell = table.cell(index[i][0], index[i][1])
            cell.text = str(content[item][i])
            if cell.text == 'nan':
                cell.text = ' '
            cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
            for par in cell.paragraphs:
                for run in par.runs:
                    run.font.size = docx.shared.Pt(12)
                    run.font.name = '宋体'

        file_name = 'D:\\poppler-0.67.0_x86\\doc_output\\' + str(df.iloc[item, 3]) + '.docx'
        # file_name = "D:\\poppler-0.67.0_x86\\7414119104.docx"
        doc.save(file_name)
        print("保存成功!")

这样一来,Excel里所有的行都会输出为word文件,有几行数据就能输出几个word,且以学号命名。
缺点:需要自己分析模板word并写死索引

2、方法二

使用的方法二就是精简版的方法一,原理就是不考虑word表格分布写入数据,而是自己在代码里写一个新的word表格进行插入数据。

具体步骤如下:

  1. 读取Excel数据
  2. 生成、配置word的表格和名称
  3. 填写表格
  4. 保存word

代码如下:

这里我就是定义了两个循环来生成简单的37行2列的表格并填写数据

import pandas as pd
from docx import Document
from docx.shared import Inches

# 读取Excel数据
df = pd.read_excel('source.xlsx', sheet_name='info')

# 获取表格标题和内容
header = list(df.columns)
content = [list(row) for _, row in df.iterrows()]

# 生成Word文件名
filename = df.iloc[0, 3]
# 配置Word
document = Document('output.docx')
table = document.add_table(rows=37, cols=2, style='Table Grid')

# 填写表格
for i, text in enumerate(header):
    table.cell(i, 0).text = text
for i, row in enumerate(content):
    for j, text in enumerate(row):
        table.cell(j, i+1).text = str(text)

# 保存Word文件
document.save(f'{filename}.docx')

3、方法三

使用字符串匹配来进行变量的写入,缺点:无法进行表格写入,可以在无表格的word文章中发挥很大优势。

可以使用pyqt5来制作一个小工具进行文字替换。这里我也实现了,但由于代码量过大,这里不做介绍啦,有需要的可以私信我,再进行更新。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0K8kmBb-1687013257271)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230617224638416.png)]
document.save(f'{filename}.docx')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32426.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于CST软件的对数周期天线设计

摘要: 对数周期天线存在多种形式,主要包括齿片形、齿线型和偶极型等。其中,1960年提出的对数周期偶极子天线(LPDA)是结构最简单、应用最广泛且性能优良的一类对数周期天线,广泛应用于 UHF、VHF、HF 频段的…

python中os库用法详解(总结)

os库主要是对文件和文件夹进行操作,在Python中对⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能。 具体步骤如下: 1. 导⼊os模块 import os 2. 使⽤ os 模块相关功能 os.函数名() 1、⽂件重命名 os.rename(⽬标⽂件名, 新⽂件名) 示例代码&#…

MySQL:七种 SQL JOINS 的实现(图文详解)

MySQL:7种SQL JOINS的实现 前言一、图示表示二、代码举例1、INNER JOIN(内连接)2、LEFT JOIN(左连接)3、RIGHT JOIN(右连接)4、OUTER JOIN(全连接)5、LEFT EXCLUDING JOI…

nbcio-vue中formdesigner的组件显示不正常的处理

今天看演示系统的formdesigner组件显示不正常,也不知道是什么时候开始的事情, 如下: 对组件的操作倒是正常,但看本地是正常的,如下: 开始也不知道是什么原因,看代码也是一样的,应该…

JavaScript 中内存泄漏的几种情况?

一、是什么 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存 并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失…

Hidl编程实战(一)——定义HAL服务

1. 概述 hidl基本知识可以参考官网 安卓官网-hidl 也讲解了C和Java实现hidl 本文讲解CHal服务的创建 2. 文件的创建 aosp整编过的代码,可以直接choosecombo后使用hidl-gen工具。如果没有整编过,可以单编hidl-gen工具。 hidl-gen工具可以用来协助创建h…

Windows和Linux动态注入

摘要:最近对动态注入有一些兴趣因此搜索了些资料,简单整理了下相关的技术实现。本文只能够带你理解何如注入以及大概如何实现,对注入的方法描述的并不详细。   关键字:dll注入,hook,提权   读者须知&am…

基于Springboot+Vue的校园招聘系统(进阶版)

本项目是一年前写的一个项目的升级版,因为某些原因将它作了一个升级改进, 好多兄弟来问有没有演示,现在先来写个说明!!! 目录 一. 🦁 前言二. 🦁 开源代码与组件使用情况说明三. &am…

Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

目录 1、需求背景2、使用Qt键盘事件3、安装事件过滤器4、事件处理级别 1、需求背景 现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。 2、使用Qt键盘事件 一种更为直接的解决方案是子类化QLi…

如何在 Linux 中安装、设置和使用 SNMP?

概要 SNMP(Simple Network Management Protocol)是一种用于管理和监控网络设备的协议。它允许网络管理员通过远程方式收集设备的运行状态、性能数据和错误信息,以便进行故障排除和网络优化。在Linux系统中,我们可以安装、设置和使…

IDEA配置本地Maven详细教程

IDEA配置本地Maven详细教程 一、下载二、安装三、配置环境变量四、IDEA配置Maven 一、下载 官网下载:点击下载 网盘下载:点击下载 二、安装 将下载后的zip文件(免安装版)解压到自己想要放的位置,,我这里…

对MVVM和MVC开发模式的理解

对MVVM和MVC开发模式的理解 1、MVVM2、MVC3、MVVM与MVC的区别 1、MVVM MVVM最早由微软提出来,它借鉴了桌面应用程序的MVC思想,在前端页面中,把Model用纯JavaScript对象表示,View负责显示,两者做到了最大限度的分离&am…

UE4/5 通过Control rig的FullBody【蜘蛛模型,不用basic ik】

目录 根设置 FullBody IK 额外骨设置 ​编辑 晃动效果 根设置 第一步你需要准备一个蜘蛛模型,不论是官方示例或者是epic上购买的模型 然后我用的是epic上面购买的一个眼球蜘蛛: 第一步,我们从根创建一个空项【这个记得脱离父子级到root之…

多传感器时频信号处理:多通道非平稳数据的分析工具(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

四、用户管理

云尚办公系统:用户管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!&#x…

【服务器远程工具】一款好用的xshell

这里写目录标题 背景Tabby简介安装使用SSHSFTPPowerShellGit 设置外观颜色快捷键窗口 插件支持总结 背景 作为一名后端开发,我们经常需要和Linux系统打交道,免不了要使用Xshell这类终端工具来进行远程管理。今天给大家推荐一款更炫酷的终端工具Tabby&…

【SQL应知应会】分析函数的点点滴滴(三)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数:…

计算机中CPU、内存、缓存的关系

CPU(Central Processing Unit,中央处理器) 内存(Random Access Memory,随机存取存储器) 缓存(Cache) CPU、内存和缓存之间有着密切的关系,它们共同构成了计算机系统的核…

go-cqhttp签名服务sign-server的本地搭建

新版go-cqhttp新增签名服务器签名服务器相关问题 Issue #2242 Mrs4s/go-cqhttp GitHubhttps://github.com/Mrs4s/go-cqhttp/issues/2242 其在win10系统下本地化搭建的方式为: 1.解压缩qq安装包提取lib里面的libfekit.so、libQSec.so文件并存放至一个文件夹&…

nodejs高版本降为低版本的详细解决方案

部分老旧项目需要使用低版本的node,网上很多是无效的,高版本无法直接安装低版本node,但是低版本nodejs可以安装部分高版本node,从而达到升级效果,下面这篇文章主要给大家介绍了关于nodejs高版本降为低版本的详细解决方案,需要的朋友可以参考下 1.首先通过控制面板应用卸载当前环…