Python自动化办公——Excel写word表格
文章目录
Python自动化办公——Excel写word表格一、引言二、数据准备三、python代码1、方法一2、方法二3、方法三一、引言
最近到了毕业设计答辩的时候,老师让我帮毕业生写一段毕业设计的功能就是提供一个学士学位授予申请表,根据定制化需求,编写定制化代码。
二、数据准备
docx格式的word如下图。
再提供一个Excel表格,要求可以直接读取表格里的对应内容,填入到word表格里的对应位置。表格是我自己定义的如下表:
三、python代码
那么根据定制化需求,我制作了三套代码。
1、方法一
我们的逻辑是:
读取Excel文件找准word中表格对应位置与顺序插入读取到Excel中的数据到word表格中
先展示最终嵌入到项目中的代码吧.
首先需要引入docx的库和pandas库,注意由于docx库的版本不同使用的方法也有一定差异
import docxfrom docx.enum.text import WD_ALIGN_PARAGRAPHimport 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.CENTERfor 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.CENTERfor 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表格进行插入数据。
具体步骤如下:
读取Excel数据生成、配置word的表格和名称填写表格保存word
代码如下:
这里我就是定义了两个循环来生成简单的37行2列的表格并填写数据
import pandas as pdfrom docx import Documentfrom 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]# 配置Worddocument = 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 = textfor 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来制作一个小工具进行文字替换。这里我也实现了,但由于代码量过大,这里不做介绍啦,有需要的可以私信我,再进行更新。