Python自动化:Excel一键填充Word,自动格式调整!效率提升万倍

我是智能取经人 2024-06-02 19:33:14

在繁忙的职场中,你是否也遇到过这样的烦恼:辛苦整理完Excel数据后,还要手动复制到Word文档中,调整格式,甚至因为数据变更而忘记修改Word内容?今天,就让我们一起探索如何用Python自动化办公,将Excel中的数据一键填充到Word模板中,并且还能自动调整好格式!让工作更高效!

背景故事

小李是一家大型公司的中层管理,每天都需要汇总各种数据,并撰写报告给不同层级的领导。然而,数据汇总完毕后,他还需要花费大量时间将Excel中的数据复制到Word文档中,并调整格式。更糟糕的是,当Excel数据发生变更时,他很容易忘记修改对应的Word内容,导致报告出现错误,这个过程中最让他头疼的就是复制粘贴和格式调整的工作,机械地重复性工作渐渐消磨掉了他的激情和热情。

解决方案

为了解决小明的困扰,我们引入了Python自动化办公的解决方案。通过Python的强大功能,我们可以编写一个脚本,自动读取Excel中的数据,并填充到Word文档的对应表格中。同时,我们还能通过脚本自动调整Word文档的格式,确保生成的报告既准确又美观。

实战操作

此例要求将Excel档的“收货数据”填写到Word档的“收货记录”中去,并加总收货数量。模板是下面这样的,需要将Excel里面的信息插入到模板表里。

模板文档:

填充完模板后得到的理想结果:

Excel数据信息:

首先,从excel里提取数据

#从Excel表中提取数据from openpyxl import load_workbookwb = load_workbook("收货数据.xlsx")ws = wb.activedata=[]for row in range(2,ws.max_row+1): seq = ws["A"+str(row)].value supplier = ws["B"+str(row)].value material_pn = ws["C"+str(row)].value material_model = ws["D"+str(row)].value desp = ws["E"+str(row)].value qty = ws["F"+str(row)].value date = ws["G"+str(row)].value.date() info = [seq, supplier, material_pn, material_model, desp, qty, date] data.append(info)

检查一下提取到数据

其次,对数据进行相应的加总

#定义数量加总函数def Sum_list(list): s = 0 for i in list: #累加列表中的所有数 s+=i return s#加总数量列的所有数字qty_list=[]for i in data: qty_list.append(i[5]) #数量在内层列表的第6个位置,索引是5sum_qty= Sum_list(qty_list) #调用加总函数加总sum_qty

接着,调整格式,合并单元格等

def Merge_cells(table,target_list,start_row,col): ''' table: 是需要操作的表格 target_list: 是目标列表,即含有重复数据的列表 start_row: 是开始行,即表格中开始比对数据的行(需要将标题除开) col: 是需要处理数据的列 ''' start = 0 #开始行计数 end = 0 #结束行计数 reference = target_list[0] #设定基准,以列表中的第一个字符串开始 for i in range(len(target_list)): #遍历列表 if target_list[i] != reference: #开始比对,如果内容不同执行如下 reference = target_list[i] #基准变成列表中下一个字符串 end = i - 1 table.cell(start+start_row,col).merge(table.cell(end+start_row,col)) start = end + 1 if i == len(target_list) - 1: #遍历到最后一行,按如下操作 end = i table.cell(start+start_row,col).merge(table.cell(end+start_row,col))

然后,往word表格里按格式写入word里

#数据提取即处理完毕后,就可以往Word的表格中写入数据了from docx import Documentdoc = Document("收货记录模板.docx")#读取word文档中的第一个表格的第二和第三列除标题和尾部总数行的数据table = doc.tables[0] #已确定是第一个表格,其索引是0supplier = [] #存储供应商名称pn = [] #存储物料编码for i in data: supplier.append(i[1]) pn.append(i[2])#按需增加行,以便填写数据for i in range(len(supplier)): #模板中已经有一行了,所以总共只需增加len(supplier)行 table.add_row() #增加好行后先做合并单元格操作Merge_cells(table,supplier,1,1) #开始合并行为2,索引为1;供应商名称是在2列,索引为1Merge_cells(table,pn,1,2) #开始合并行为2,索引为1;物料编码是在3列,索引为2#写入数据到表格for row in range(1,len(supplier)+1): for col in range(7): table.cell(row,col).text = str(data[row-1][col])max_row = len(table.rows) #获取最大一行qty_row = max_row-1 #确定需要写入加总数据的一行table.cell(qty_row,5).merge(table.cell(qty_row,5)) #合并右下角用于填写数量的两个单元格table.cell(qty_row,4).text = '总数:'table.cell(qty_row,5).text = str(sum_qty)doc.save("收货记录.docx")

最后,对word里的表格进行格式处理

from docx.table import _Cellfrom docx.oxml import OxmlElementfrom docx.oxml.ns import qndef Set_cell_border(cell: _Cell, **kwargs): """ 设置单元格边框函数 使用方法: Set_cell_border( cell, top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"}, bottom={"sz": 12, "color": "#00FF00", "val": "single"}, start={"sz": 24, "val": "dashed", "shadow": "true"}, end={"sz": 12, "val": "dashed"}, ) 传入参数有cell, 即单元格;top指上边框;bottom指下边框;start指左边框;end指右边框。 "sz"指线的粗细程度;"val"指线型,比如单线,虚线等;"color"指颜色,颜色编码可百度; "space"指间隔,一般不设置,设置的值大于0会导致线错开;"shadow"指边框阴影 """ tc = cell._tc tcPr = tc.get_or_add_tcPr() tcBorders = tcPr.first_child_found_in("w:tcBorders") if tcBorders is None: tcBorders = OxmlElement('w:tcBorders') tcPr.append(tcBorders) for edge in ('start', 'top', 'end', 'bottom', 'insideH', 'insideV'): edge_data = kwargs.get(edge) if edge_data: tag = 'w:{}'.format(edge) element = tcBorders.find(qn(tag)) if element is None: element = OxmlElement(tag) tcBorders.append(element) for key in ["sz", "val", "color", "space", "shadow"]: if key in edge_data: element.set(qn('w:{}'.format(key)), str(edge_data[key]))#定义单元格填充颜色函数from docx.oxml.ns import nsdeclsfrom docx.oxml import parse_xmldef Set_Background_Color(cell,rgbColor): shading_elm = parse_xml(r'<w:shd {} w:fill="{color_value}"/>'.format(nsdecls('w'),color_value = rgbColor)) #固定写法,照抄即可 cell._tc.get_or_add_tcPr().append(shading_elm)from docx.enum.text import WD_ALIGN_PARAGRAPH #设置水平居中对齐需要用到的库from docx.enum.table import WD_ALIGN_VERTICAL #设置垂直居中对齐需要用到的库from docx.shared import Cm # 长度单位(厘米cm用到的库)from docx import Documentdoc = Document("收货记录.docx") #打开word文件table= doc.tables[0]max_row = len(table.rows) #获取表格总行数#1.最后一行中,“总数”两个字要加粗run = table.cell(max_row-1,4).paragraphs[0].runs[0] # 获取最后一行第五列对应单元格中的文字块,即“总数”字样所在单元格run.font.bold = True #将文字块设置为粗体#2.最后一行的行高要调大一点,现在这样扁扁的,难看table.rows[max_row-1].height = Cm(1) # 将最后一行的行高设置为1厘米#3.最后一行那几个空单元格有框线,太碍眼,得去掉,将总数及左边两个cell左边框和下边框设成白色for i in range(3): cell = table.cell(max_row-1,i) Set_cell_border( cell, bottom={"color": "#FFFFFF"}, start={"color": "#FFFFFF" }, end={"color": "#FFFFFF"} )cell_1 = table.cell(max_row-1,3)Set_cell_border(cell_1,start={"color": "#FFFFFF" },bottom={"color": "#FFFFFF"})cell_2 = table.cell(max_row-1,6)Set_cell_border(cell_2,end={"color": "#FFFFFF" },bottom={"color": "#FFFFFF"})#4.各单元格水平和垂直方向都要居中对齐for row in range(1,max_row): for col in range(len(table.columns)): table.cell(row,col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER table.cell(row,col).vertical_alignment = WD_ALIGN_VERTICAL.CENTER#5.数量列≥85的,底色设置为橙色qty = [] #存储数量信息#读取第二行到29行,第2,3列中的数据for i in range(1,max_row-1): qty_info = table.rows[i].cells[5].text #cells[5]指表格第6列 qty.append(int(qty_info))#将数量≥85的单元格填色row=1 #行计数器for i in qty: if i>=85: cell = table.cell(row,5) #第6列数据为数量,列索引是5 Set_Background_Color(cell,"98F5FF") #填充颜色,"98F5FF"是蓝色的编码 row+=1 #跳转到下一行 doc.save("收货记录-整理.docx")

总结与展望

通过Python自动化办公,我们可以轻松实现Excel数据到Word文档的自动填充和格式调整。这不仅提高了工作效率,还减少了人为错误的可能性。未来,我们还可以进一步探索Python自动化办公的更多应用场景,如邮件自动发送、PPT自动制作等。让我们一起用技术改变生活,享受更加高效的工作体验吧!

关注公众号,私信“word"获取本篇文章的代码和示例数据。

0 阅读:0

我是智能取经人

简介:感谢大家的关注