【Python自动化办公】实现excel表中的数据批量导入到word指定位置(表格形式和下滑线形式)

案例1——word模板为表格

目的就是把excel中的数据,填入word模板中的对应位置

如下是我自定义的两个文档(仅作为学习),包括一个申请表.doc和申请名单.xlsx

在这里插入图片描述
有需要的可以下载:https://note.youdao.com/s/JshqQRVK

申请名单.xlsx 中数据如下
在这里插入图片描述
申请表.doc 内容如下(准备好需要的文档——申请表.doc )
在这里插入图片描述


对于这种表格形式的需求,我觉得最快速的就是用word自带的邮件合并功能了,超级简单,写 chui 子个代码

例如:打开申请表,点击 “邮件-邮件开始合并”,就可以做相应的操作

在这里插入图片描述
具体的操作,网上太多了,推荐几个吧

如何把excel表格中的内容批量填写到word模板中
word每页生成一个单独文件1分钟快速生成几百个文件

最终效果
在这里插入图片描述

当然,这里还有一个就是怎么把word每一页变为一个单独的文档问题,额,百度应该有。

案例2——word模板中带有下划线形式

同样的,自定义如下数据
在这里插入图片描述
数据链接:https://note.youdao.com/s/GGOc4voN,有需要学习的伙伴可以下载试一下

word模板内容如下
在这里插入图片描述
申请信息数据如下
在这里插入图片描述
对于这种带有下划线的,考虑使用python来完成。这里主要使用了专门处理word的python扩展包python-docx

关于docx 的安装

pip  install  -i  https://pypi.doubanio.com/simple/  --trusted-host pypi.doubanio.com  docx

如果按照上面代码安装,会报如下的错误
在这里插入图片描述
在网上找的方法,说是可以通过离线安装

在这个网站https://www.lfd.uci.edu/~gohlke/pythonlibs/下载好 python_docx-0.8.10-py2.py3-none-any.whl 这个文件,然后在cmd或者Anaconda Prompt中输入pip install 再把这个whl文件按住拖动到pip install 后面,回车安装即可。
在这里插入图片描述

python docx基本操作

参考网上的那些教程,自己也学习学习~

1.创建word文档

# 导包
from docx import Document
# docx.shared 中包含诸如"字号","颜色","行间距"等常用模块
from docx.shared import Inches,Pt,RGBColor
from docx.oxml.ns import qn


#创建 Document 对象,相当于打开一个 word 文档
#将整个文章看做是一个Document对象
document = Document()

# 对正文的样式进行设置
# Normal指的是正文部分,还有很多其他选项如标题、表格、列表等,可遍历doc.styles进行查看
# 设置正文颜色,大小,粗体
document.styles['Normal'].font.color.rgb = RGBColor(0, 0, 255)
document.styles['Normal'].font.size = Pt(12)
document.styles['Normal'].font.bold = True
document.styles['Normal'].font.name = u'宋体'
# 对于中文字体必须加这一句
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

#向文档中添加一个标题,标题级别设置为0级,0,1,2...表示标题号大到小
document.add_heading('网红书店', level=0)

#向文档中添加一个段落,并将段落引用赋给变量 p(https://www.jianshu.com/p/7d2fcf976914)
#- 每个Document包含许多个代表“段落”的Paragraph对象,存放在document.paragraphs中
#可以使用 add_run 方法在P后面继续追加文字,并设置格式
#- 每个Paragraph都有许多个代表"行内元素"的Run对象,存放在paragraph.runs中。
p = document.add_paragraph('实体书店承载着人们的情怀与梦想')
p.add_run('城市发展').bold = True # 加粗
p.add_run('也应为实体书店') 
p.add_run('留下一席之地。').italic = True # 斜体

#添加标题和段落,采用不同的形式
document.add_heading('书店可以成为城市“文化会客厅”', level=1)
document.add_paragraph('实体书店只有不断研究消费者需求',style="Intense Quote")
document.add_paragraph('不断创新', style='List Bullet')
document.add_paragraph('才是发展之道', style='List Number')

#添加图片,设置图片大小
document.add_picture(r"C:\Users\ABC\Desktop\12.png", width=Inches(2.25))

#添加表格,填入表格内容
table = document.add_table(rows=2, cols=2)
table.cell(0,0).text = "1"
table.cell(0,1).text = "2"
table.cell(1,0).text = "3"
table.cell(1,1).text = "4"

table=document.add_table(rows=2,cols=4,style='Table Grid')
for i in range(0,2):
    for j in range(0,4):
        table.cell(i,j).text="第{i}行{j}列".format(i=i+1,j=j+1)

# 插入一个分页符
document.add_page_break()

#保存文本
document.save('demo.docx')

效果如下
在这里插入图片描述

2.编辑已存在的word文档(修改前)

在这里插入图片描述

# 导入
from docx import Document
from docx.shared import Inches,Pt,RGBColor
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE #所有样式 (包括段落、文字、表格)的枚举常量集
from docx.enum.text import WD_ALIGN_PARAGRAPH #对齐方式 的枚举常量集,不过在vscode中显示有错,事实又能够执行
from docx.enum.text import WD_LINE_SPACING #行间距的单位枚举常量集(包括:单倍行距,1.5倍行距,固定 值,最小值等)


# 从文件创建文档对象
document = Document('./书店.docx')

# 显示每段的内容
for p in document.paragraphs:
    print(p.text)
    #设置段落间距
    paragraph_format = p.paragraph_format
    # p.space_before=Pt(18)    #上行间距
    # p.space_after=Pt(12)    #下行间距
    paragraph_format.line_spacing=Pt(25)  #行距
    paragraph_format.first_line_indent=document.styles['Normal'].font.size * 2 #段落首行缩进量
    for run in p.runs:
        run.font.bold = True
        # run.font.italic = True
        run.font.underline = True
        # run.font.strike = True
        # run.font.shadow = True
        run.font.size = Pt(12)
        # run.font.color.rgb = RGBColor(255,0,255)
        run.font.name = "黑体"
        # 设置像黑体这样的中文字体,必须添加下面 2 行代码
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"),"黑体")

# 修改正文样式
document.styles['Normal'].font.color.rgb = RGBColor(0, 0, 255)
document.styles['Normal'].font.size = Pt(20)
document.styles['Normal'].font.bold = True
document.styles['Normal'].font.name = u'楷体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体')
#document.styles['Normal'].paragraph_format.line_spacing_rule=WD_LINE_SPACING.EXACTLY #段落行距样式为固定值,必须指定行距值,否则就会变成 多倍行距 模式 
#document.styles['Normal'].paragraph_format.line_spacing_rule=WD_LINE_SPACING.SINGLE #段落行距样式为单倍行距 模式
document.styles['Normal'].paragraph_format.line_spacing_rule=WD_LINE_SPACING.MULTIPLE #多倍行距,此模式的具体行间距由文字字号大小决定,如果后面指定了行距值,此多倍行距设置会被忽略,变成固定值模式
document.styles['Normal'].paragraph_format.line_spacing=Pt(22) #行距值
document.styles['Normal'].paragraph_format.space_before=Pt(10) #段前距
document.styles['Normal'].paragraph_format.space_after=Pt(20) #段后距
document.styles['Normal'].paragraph_format.first_line_indent=document.styles['Normal'].font.size * 2 #段落首行缩进量


# 添加段落
paragraph = document.add_paragraph('实体书店承载着人们的情怀与梦想,城市发展也应为实体书店留下一席之地。')
paragraph.bold = True # 加粗
# 在此段落之前插入一个段落
prior_paragraph = paragraph.insert_paragraph_before('---------------')

# 保存文档
document.save('书店.docx')

处理效果如下
在这里插入图片描述

回到需求

对于这种下划线形式,如果直接填数据,会改变模板结构,比如

在这里插入图片描述

我想的是,把数据都填在中间位置,同时也不改变填入范围的宽度(大致不变)

额,想了一个比较笨的方法就是一个段落一个段落的处理。如下,我把不需要填入数据的内容先保留(开头),放到一个重新创建的文档中——申请书1.docx

然后在这个文档的基础上,逐行添加

在这里插入图片描述

比如,先处理 申请人: 申请时间: 这一个段落

先添加p = document.add_paragraph('申请人:'),没有下划线,紧接着添加申请信息数据p.add_run(c).font.underline = True,设置下划线,紧接又添加p.add_run(' 申请时间:')

p1 = '申请人:                申请时间:               '
# 获取p1中的空格
kg1 = '                '
kg2 = '                '
len_kg1 = len(kg1)
len_kg2 = len(kg2)
ccc = df.loc[i,"申请人"]
e  = df.loc[i,"申请时间"]
ddd = str(e.year) + '-' + str(e.month) + '-' + str(e.day)
len_c = len(ccc)
len_d = len(ddd)
x = int(round((len_kg1-len_c)/2,0))
y = int(round((len_kg2-len_d)/2,0))

c = ' '*x + ccc + ' '*x
d = ' '*y + ddd + ' '*y
p = document.add_paragraph('申请人:')
p.add_run(c).font.underline = True
p.add_run(' 申请时间:') 
p.add_run(d).font.underline = True

在处理的时候,需要注意空格
在这里插入图片描述
还有缩进的问题

在这里插入图片描述
在这里插入图片描述

具体的操作可以看代码吧。

把Excel中每一个申请信息填入空白Word模板中,生成的最终结果如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完整代码:

# 导入
from docx import Document
from docx.shared import Inches,Pt,RGBColor
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE #所有样式 (包括段落、文字、表格)的枚举常量集
from docx.enum.text import WD_ALIGN_PARAGRAPH #对齐方式 的枚举常量集,不过在vscode中显示有错,事实又能够执行
from docx.enum.text import WD_LINE_SPACING #行间距的单位枚举常量集(包括:单倍行距,1.5倍行距,固定 值,最小值等)
import pandas as pd
import os


def GetDesktopPath():
    """
    获取桌面
    -------
    TYPE
        DESCRIPTION.
    """
    return os.path.join(os.path.expanduser("~"), 'Desktop')
DesktopPath = GetDesktopPath()+'\\'


def isexists_dir_Create(path):
     if not os.path.exists(path):
        os.makedirs(path)

isexists_dir_Create(DesktopPath+'批量处理结果')


# 读取数据
df = pd.read_excel('申请信息.xlsx')    
#读取excel数据
for i in df.index:
    print(i)
    # 一行一行的处理
    # 从文件创建文档对象
    document = Document('./申请书1.docx')
    document.styles['Normal'].font.size = Pt(14)
    document.styles['Normal'].font.name = u'宋体'
    document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    p1 = '申请人:                申请时间:               '
    # 获取p1中的空格
    kg1 = '                '
    kg2 = '                '
    len_kg1 = len(kg1)
    len_kg2 = len(kg2)
    ccc = df.loc[i,"申请人"]
    e  = df.loc[i,"申请时间"]
    ddd = str(e.year) + '-' + str(e.month) + '-' + str(e.day)
    len_c = len(ccc)
    len_d = len(ddd)
    x = int(round((len_kg1-len_c)/2,0))
    y = int(round((len_kg2-len_d)/2,0))
    
    c = ' '*x + ccc + ' '*x
    d = ' '*y + ddd + ' '*y
    p = document.add_paragraph('申请人:')
    p.add_run(c).font.underline = True
    p.add_run(' 申请时间:') 
    p.add_run(d).font.underline = True
    
    # -----------------------------------------
    
    p1 = '申请地点:                                       '
    kg1 = '                                       '
    len_kg1 = len(kg1)
    ccc = df.loc[i,'申请地点']
    len_c = len(ccc)
    x = int(round((len_kg1-len_c)/2,0))
    c = ' '*x + ccc + ' '*x
    p = document.add_paragraph('申请地点:')
    p.add_run(c).font.underline = True
    
    # -----------------------------------------
    
    p1 = '审批人:         证件号:                        '
    kg1 = '         '
    kg2 = '                        '
    len_kg1 = len(kg1)
    len_kg2 = len(kg2)
    ccc = df.loc[i,'审批人1']
    ddd = str(df.loc[i,'证件号1'])
    len_c = len(ccc)
    len_d = len(ddd)
    x = int(round((len_kg1-len_c)/2,0))
    y = int(round((len_kg2-len_d)/2,0))
    c = ' '*x + ccc + ' '*x
    d = ' '*y + ddd + ' '*y
    p = document.add_paragraph('审批人:')
    p.add_run(c).font.underline = True
    p.add_run(' 证件号:') 
    p.add_run(d).font.underline = True
    
    # -----------------------------------------
    
    p1 = '         证件号:                        '
    kg1 = '        '
    kg2 = '                        '
    len_kg1 = len(kg1)
    len_kg2 = len(kg2)
    ccc = df.loc[i,'审批人2']
    ddd = str(df.loc[i,'证件号2'])
    len_c = len(ccc)
    len_d = len(ddd)
    x = int(round((len_kg1-len_c)/2,0))
    y = int(round((len_kg2-len_d)/2,0))
    c = ' '*x + ccc + ' '*x
    d = ' '*y + ddd + ' '*y
    p = document.add_paragraph()
    p.add_run(c).font.underline = True
    paragraph_format = p.paragraph_format
    paragraph_format.left_indent=Inches(0.5826772)
    paragraph_format.first_line_indent=document.styles['Normal'].font.size * 1
    p.add_run(' 证件号:') 
    p.add_run(d).font.underline = True
    
    #  -----------------------------------------
    
    p1 = '         证件号:                        '
    kg1 = '        '
    kg2 = '                        '
    len_kg1 = len(kg1)
    len_kg2 = len(kg2)
    ccc = df.loc[i,'审批人3']
    ddd = str(df.loc[i,'证件号3'])
    len_c = len(ccc)
    len_d = len(ddd)
    x = int(round((len_kg1-len_c)/2,0))
    y = int(round((len_kg2-len_d)/2,0))
    c = ' '*x + ccc + ' '*x
    d = ' '*y + ddd + ' '*y
    p = document.add_paragraph()
    p.add_run(c).font.underline = True
    paragraph_format = p.paragraph_format
    paragraph_format.left_indent=Inches(0.5826772)
    paragraph_format.first_line_indent=document.styles['Normal'].font.size * 1
    p.add_run(' 证件号:') 
    p.add_run(d).font.underline = True
    
    # # -----------------------------------------
    
    p1 = '记录人:               联系电话:                '
    kg1 = '              '
    kg2 = '                '
    len_kg1 = len(kg1)
    len_kg2 = len(kg2)
    ccc = df.loc[i,'记录人']
    ddd = str(df.loc[i,'联系电话'])
    len_c = len(ccc)
    len_d = len(ddd)
    x = int(round((len_kg1-len_c)/2,0))
    y = int(round((len_kg2-len_d)/2,0))
    c = ' '*x + ccc + ' '*x
    d = ' '*y + ddd + ' '*y
    p = document.add_paragraph('记录人:')
    p.add_run(c).font.underline = True
    p.add_run(' 联系电话:') 
    p.add_run(d).font.underline = True
    
    # # -----------------------------------------
    
    document.add_paragraph()
    document.add_paragraph('这是申请书的主要部分,通常要先介绍一下个人的现实情况、个人简历、家庭成员及社会关系情况。')
    # # -----------------------------------------
    p1 = '												日期:                '
    kg1 = '                '
    len_kg1 = len(kg1) 
    e  = df.loc[i,"日期"]
    ccc = str(e.year) + '-' + str(e.month) + '-' + str(e.day)
    len_c = len(ccc)
    x = int(round((len_kg1-len_c)/2,0))
    c = ' '*x + ccc + ' '*x
    p = document.add_paragraph('												')
    p.add_run(' 日期:') 
    p.add_run(c).font.underline = True

    # # -----------------------------------------
    
    # 保存
    path = DesktopPath + '批量处理结果'+ '\\' 
    document.save(f"{path}{df.loc[i,'申请人']}.docx")

最后,还要推荐几篇文章,实现的方式也非常值得学习,冲!

Python+Excel+Word一秒制作百份合同
【Python实战案例】读取Excel批量替换Word局部信息
Python办公自动化|从Excel到Word

### 回答1: 可以使用Python的openpyxl和python-docx库来实现Excel数据写入Word的功能。 具体步骤如下: 1. 使用openpyxl库读取Excel文件数据。 2. 使用python-docx库创建一个新的Word文档。 3. 将Excel数据逐行写入Word文档。 4. 保存Word文档代码示例: ```python import openpyxl from docx import Document # 打开Excel文件 wb = openpyxl.load_workbook('data.xlsx') sheet = wb.active # 创建一个新的Word文档 doc = Document() # 将Excel数据逐行写入Word文档 for row in sheet.iter_rows(min_row=2): # 获取Excel数据 name = row[0].value age = row[1].value gender = row[2].value # 将数据写入Word文档 doc.add_paragraph(f'姓名:{name}') doc.add_paragraph(f'年龄:{age}') doc.add_paragraph(f'性别:{gender}') doc.add_page_break() # 保存Word文档 doc.save('data.docx') ``` 注意:在使用openpyxl库读取Excel文件时,需要安装openpyxl库。在使用python-docx库创建Word文档时,需要安装python-docx库。 ### 回答2: Python是一种功能强大且广泛使用的编程语言,可以轻松地将数据从电子表格文件提取并将其写入Word文档Python包含了很多可用的库,例如openpyxl和python-docx,使用这些库可以非常方便地完成这个任务。 首先,我们需要安装这两个库。openpyxl库可以帮助我们访问和编辑Excel文件数据,而python-docx库可以用于创建和编辑Word文档。 要使用openpyxl库,我们需要导入它并打开Excel文件。例如,下面的代码打开名为“data.xlsx”的Excel文件,并将第一个工作表中数据存储在名为“worksheet”的变量: ```python import openpyxl workbook = openpyxl.load_workbook('data.xlsx') worksheet = workbook.active ``` 接下来,我们需要使用python-docx库创建一个新的Word文档。我们可以使用Document类来实现这一点。下面的代码创建了一个新的Word文档: ```python from docx import Document document = Document() ``` 完成这些准备工作后,我们可以开始将Excel数据添加到Word文档。我们可以使用table对象来保存要写入Word文档数据。下面的代码创建一个包含三行和三列的表格,并将Excel数据添加到其: ```python from docx.shared import Inches table = document.add_table(rows=3, cols=3) for i, row in enumerate(worksheet.iter_rows(values_only=True)): if i == 0: table.cell(i, 0).text = str(row[0]) table.cell(i, 1).text = str(row[1]) table.cell(i, 2).text = str(row[2]) else: row_cells = table.add_row().cells row_cells[0].text = str(row[0]) row_cells[1].text = str(row[1]) row_cells[2].text = str(row[2]) ``` 最后,我们可以将保存有Excel数据Word文档写入磁盘。下面的代码Word文档保存为“output.docx”: ```python document.save('output.docx') ``` 以上就是使用PythonExcel数据写入Word文档的所有步骤。使用这些代码可以轻松地进行数据格式化和大规模批处理,使得这个任务变得简单、快速、高效。 ### 回答3: Python作为一种高级编程语言,提供了强大的库和工具来管理各种数据文件,包括ExcelWord文档Python可以轻松读取Excel数据并将其写入Word文档。 首先,需要安装第三方库“openpyxl”和“python-docx”。这两个库都可以在命令行上通过“pip install”命令进行安装。安装完成后,我们可以在Python代码使用它们。 接下来,我们需要导入这两个库并打开Excel文件。使用“openpyxl.load_workbook”方法可以打开指定Excel文件。例如,以下代码将打开名为“data.xlsx”的文件: ``` import openpyxl workbook = openpyxl.load_workbook('data.xlsx') ``` 之后,我们需要获取Excel数据,可以使用“workbook.active”属性获取活动工作表,再使用“cell”的“value”属性或“row”的“values”属性获取单元格或一行数据。例如,以下代码获取第一个工作表的A2单元格的值和第二行的所有值: ``` worksheet = workbook.active # 获取A2单元格的值 value = worksheet.cell(row=2, column=1).value # 获取第二行的所有值 values = [cell.value for cell in worksheet['2']] ``` 接下来,我们需要创建一个新的Word文档。使用“Document”类可以创建一个新的文档。例如,以下代码创建了一个新的文档: ``` from docx import Document document = Document() ``` 创建了新文件后,我们可以使用Python代码来向其添加文本,表格等信息。比如,以下代码向创建的文档添加一个表格并填充内容: ``` from docx import Document from docx.shared import Inches # 创建一个文档 document = Document() # 添加一个表格 table = document.add_table(rows=3, cols=3) # 填充表格内容 data = ((1, 2, 3), (4, 5, 6), (7, 8, 9)) for i, row in enumerate(table.rows): for j, cell in enumerate(row.cells): cell.text = str(data[i][j]) # 保存文档 document.save('output.docx') ``` 最后,我们需要将Excel数据写入Word文档。我们可以使用Python的循环遍历Excel数据并将其写入Word表格,或将其作为文本写入Word文档。 综上,PythonExcel数据写入Word可以分为三个步骤:打开Excel文件并获取数据、创建新的Word文档并添加表格或文本、将Excel数据写入Word文档Python作为一种高级编程语言,其相对于其他编程语言在数据处理方面具有优势。通过Python处理数据的灵活性和便捷性,减少了编写大量的Excel VBA或Word VBA软件的工作和时间成本,提高了数据处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值