百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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

off999 2024-12-13 15:37 22 浏览 0 评论

在繁忙的职场中,你是否也遇到过这样的烦恼:辛苦整理完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_workbook
wb = load_workbook("收货数据.xlsx")
ws = wb.active
data=[]
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个位置,索引是5
sum_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 Document
doc = Document("收货记录模板.docx")
#读取word文档中的第一个表格的第二和第三列除标题和尾部总数行的数据
table = doc.tables[0] #已确定是第一个表格,其索引是0
supplier = [] #存储供应商名称
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列,索引为1
Merge_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 _Cell
from docx.oxml import OxmlElement
from docx.oxml.ns import qn


def 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 nsdecls
from docx.oxml import parse_xml
def 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 Document


doc = 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"获取本篇文章的代码和示例数据。

相关推荐

win7连不上win10打印机拒绝访问

原因及解决方法:1.在Win10Cortana搜索框中,搜索控制面板将打开;2.转到控制面板,选择查看方法作为一个小图标,然后单击程序和功能;3.单击以启用或禁用Windows功能选项;4....

电脑主机不启动但通电(电脑主机开机不通电没反应)

第1步:首先检查电脑的外部接线是否接好,把各个连线重新插一遍,看故障是否排除。第2步:如果故障依旧,接着打开主机箱查看机箱内有无多余金属物,或主板变形造成的短路,闻一下机箱内有无烧焦的糊味,主板上有无...

苹果一体机怎么重装系统(苹果一体机重装系统win10)

苹果更换硬盘后,如果您没有创建一个启动磁盘或者使用TimeMachine备份系统,您可以按照以下步骤重新安装操作系统:1.准备一个可用于安装系统的启动磁盘。您可以使用官方提供的macOS安装介质(...

装系统的u盘怎么制作(装系统怎么制作u盘启动盘)
装系统的u盘怎么制作(装系统怎么制作u盘启动盘)

1、下载安装u当家u盘启动盘制作工具,完成之后打开该软件2、将之前准备好的U盘插入电脑,U当家会自动识别并选为默认,如果有多个U盘可以在“选择U盘”的下拉框中选择要制作成U盘启动盘的U盘。3、点击下面的“一键制作”按钮。(如果是电脑主板是U...

2025-11-15 07:03 off999

台电u盘怎么样

感觉台电U盘还是可以的,我知道台电是国内最成功的数码产品制造商之一,是一个致力于IT及消费数码类产品研发、生产、销售及服务的一体化品牌,U盘很好用,用的人很多。威刚是480Mbit/S只是USB2...

u盘重装系统蓝屏进不去(u盘装系统重启蓝屏)

尊敬的用户您好:可按下面的步骤进行系统盘装系统:1.买一张win7光盘,将系统光盘放入光驱里。2.打开电源,然后观察屏幕的提示,在启动系统之前有按“f2进行bios设置。3.设置启动方式。找到boot...

win快捷键大全(win快捷键大全表)

win快捷键:单独按Windows:显示或隐藏“开始”功能表Windows+BREAK:显示“系统属性”对话框Windows+D:显示桌面或恢复桌面Windows+M:最小化所有窗口Windows...

u盘突然要格式化怎么回事(用着的u盘突然要格式化)

U盘提示格式化的原因可能有以下几点:文件系统损坏:U盘的文件系统可能出现损坏,导致无法正常读取和写入数据。病毒感染:U盘可能被病毒感染,病毒会破坏文件系统或隐藏文件。不兼容的文件系统:U盘可能使用了一...

路由器pppoe怎么设置(路由器如何设置pppoe上网)

移动宽带PPPOE是不用设置的,你只要把帐号和密码填上其他都不选就能上网。但是要注意连接到你电脑的网线是直接经过一个路由器后连接到猫上的,因为我见过有人是这样连接的猫---路由器---路由器---电脑...

win7桌面图标设置在哪里(win7桌面图标在哪个文件夹)

要调出Win7桌面图标,首先需要进入桌面。可以通过点击任务栏上方的“显示桌面”按钮或按下Windows键+D快捷键进入桌面。在桌面上右键单击空白区域,选择“个性化”,然后选择“更改桌面图标”选项。在弹...

win7手机壁纸(windows7手机桌面主题)

1.首先我们打开手机进入到桌面,找到设置图标点击打开。华为手机如何设置自定义锁屏壁纸2.进入到设置界面之后,点击下方的显示选项。华为手机如何设置自定义锁屏壁纸3.然后我们就可以在显示界面中找到壁纸...

怎么开启路由器wifi(怎么开启路由器的dhcp功能)

把路由器改为开放网络方法如下:1、打开浏览器,在地址栏输入路由器网关IP地址(路由器背后的标签上有,一般是192.168.1.1),输入登录用户名和密码(一般均为admin);2、登录成功后就显示运行...

win10加载不出来桌面黑屏(window10加载不出来)

方法一、如果是遇到了突发性黑屏首先尝试使用Ctrl+Alt+Delete组合键来进行电脑重启一般重启可以解决大部分黑屏故障。win10电脑黑屏按什么键恢复_win10电脑黑屏一键恢复的方法方法...

怎么用火绒关闭win安全中心(win10火绒安全软件怎么关闭)

一、火绒防火墙关闭方法在电脑上运行火绒软件后,点击首页界面的“防护中心”,在病毒防护界面可以关闭文件、U盘、邮件等保护功能,。系统防护:在该界面可以关闭系统防护功能,。网络防护:可以关闭网络保护等功...

微软应用商店下载手机版(微软应用商店在哪下)

、在桌面任务栏找到微软应用商店,点击并打开。2、进入页面后点击【应用】,进入应用页面。3、在页面里往下移动,找到热门应用,找到一个软件,点击进入。4、进入页面后,点击【安装】,软件会自动安装,安装完毕...

取消回复欢迎 发表评论: