Python将Excel数据填入word中

如何用Python将Excel中的数据填写到word指定的格式模板内,Excel中的数据存才一对多的情况

img


需要将上述的内容填写到下面的word表格内,一个公司生成一个word

img


填写模板时企业名只填写一次,企业名在Excel中对应的房间号及其他数据需要填写到这个表格内,且表格需要自增

代码如下 但无法执行,希望指导

# 操作excel表格的库
# pip install docxtpl
from docxtpl import DocxTemplate
# 操作docx文档的库
# pip install openpyxl
from openpyxl import load_workbook
import os

def replace(obj):
 if obj is None:
  obj = ''
  return obj


wb = load_workbook("D:/2/1.xlsx")
ws = wb.active
contexts = []
for row in range(2, ws.max_row + 1):
  企业名 = ws['A' + str(row)].value
  房间号 = ws['B' + str(row)].value
  电表倍数 = ws['C' + str(row)].value
  倍率 = ws['D' + str(row)].value
  上月表数 = ws['E' + str(row)].value
  本月表数 = ws['F' + str(row)].value
  电水费单价(元/度) == ws['G' + str(row)].value
  实用度数(度) == ws['H' + str(row)].value
  电费金额(元) == ws['I' + str(row)].value
  context = {"企业名":企业名, "房间号":房间号, "电表倍数":电表倍数,"倍率":倍率, "上月表数":上月表数, "本月表数":本月表数,"电水费单价(元/度)":电水费单价(元/度),"实用度数(度)":实用度数(度),"电费金额(元)":电费金额(元)}
  contexts.append(context)
  contexts
  document=docx.Document(r'D:/2/XX.docx')
  tables = document.tables
  table=tables[0]
  table.rows[1].cells[1].text='修改表格'

row_cells = table.add_row().cells
for i in range(4):#表格列数
    row_cells[i].text ='追加表格%d'%i
    row_cells[i].paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER #设置居中
os.mkdir("D:/2/XX")

for context in contexts:
 print(context)
 tpl = DocxTemplate('D:/2/XX.docx')
 tpl.render(context)
 tpl.save("D:/2/{}电费表.docx".format(context["企业名"]))

那你把.xlsx文件发一下


from docxtpl import DocxTemplate
from openpyxl import load_workbook
from docx.enum.table import WD_TABLE_ALIGNMENT
import os

def replace(obj):
    if obj is None:
        obj = ''
    return obj

wb = load_workbook("D:/2/1.xlsx")
ws = wb.active

contexts = []
for row in range(2, ws.max_row + 1):
    企业名 = ws['A' + str(row)].value
    房间号 = ws['B' + str(row)].value
    电表倍数 = ws['C' + str(row)].value
    倍率 = ws['D' + str(row)].value
    上月表数 = ws['E' + str(row)].value
    本月表数 = ws['F' + str(row)].value
    电水费单价 = ws['G' + str(row)].value
    实用度数 = ws['H' + str(row)].value
    电费金额 = ws['I' + str(row)].value

    context = {
        "企业名": replace(企业名),
        "房间号": replace(房间号),
        "电表倍数": replace(电表倍数),
        "倍率": replace(倍率),
        "上月表数": replace(上月表数),
        "本月表数": replace(本月表数),
        "电水费单价(元/度)": replace(电水费单价),
        "实用度数(度)": replace(实用度数),
        "电费金额(元)": replace(电费金额)
    }
    contexts.append(context)

document = DocxTemplate('D:/2/XX.docx')

for context in contexts:
    table = document.tables[0]
    table.rows[1].cells[1].text = '修改表格'

    row_cells = table.add_row().cells
    for i in range(4):  # Number of columns in the table
        row_cells[i].text = '追加表格%d' % i
        row_cells[i].paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER

os.mkdir("D:/2/XX")

for context in contexts:
    print(context)
    tpl = DocxTemplate('D:/2/XX.docx')
    tpl.render(context)
    tpl.save("D:/2/{}电费表.docx".format(context["企业名"]))
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1055652
  • 这篇博客你也可以参考下:使用python 将excel中数据批量生成word周报
  • 除此之外, 这篇博客: Python将Excel数据自动填充到Word指定位置中中的 需求 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 需求:批量制作档案表,要从excel表格中将每个人的数据导入到docx档案中,重复量很大,因此可以使用python高效解决。
    2. 渲染:为了让模板内容不变动,这里使用了类似jinja2的渲染引擎,使用{{ }}插值表达式把数据插入进去。也可以使用{% %}循环,条件语法等。
    3. 模板

    合同docx模板(在需要插值的位置填充 {{}} 表达式)
    在这里插入图片描述
    人员数据xlsx模板
    在这里插入图片描述

  • 您还可以看一下 董付国老师的Python可以这样学(第八季:课堂教学管理系统设计与开发实战)课程中的 Word试卷生成功能设计与实现小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题中的代码是使用docxtpl库来操作Word文档的。首先,我们需要明确一下所需的步骤:

    1. 读取Excel数据。
    2. 遍历Excel数据,逐个生成Word文档。
    3. 根据指定的格式模板,填写数据到Word文档中。
    4. 将生成的Word文档保存到指定的文件夹中。

    下面是解决这个问题的具体步骤和代码示例:

    1. 引入所需的库:
    from docxtpl import DocxTemplate
    import pandas as pd
    import os
    
    1. 定义文件路径和目标文件夹路径:
    zpath = os.getcwd() + '\\'  # 当前工作路径
    tpl_path = zpath + '建大附小家长通知书.docx'  # 指定的格式模板路径
    excel_path = zpath + '成绩单.xlsx'  # Excel数据文件路径
    output_folder = zpath + '文档生成结果'  # 生成的Word文档保存的文件夹路径
    
    1. 创建目标文件夹:
    try:
        os.mkdir(output_folder)
    except:
        pass
    
    1. 读取Excel数据:
    grade = pd.read_excel(excel_path)
    
    1. 遍历Excel数据,生成Word文档:
    tpl = DocxTemplate(tpl_path)
    for index, row in grade.iterrows():
        context = {
            "name": row['姓名'],
            "chinese": row['语文'],
            "math": row['数学'],
            "english": row['外语'],
            "date": pd.to_datetime('today').strftime('%Y-%m-%d')  # 当前日期
        }
        tpl.render(context)
        output_path = os.path.join(output_folder, f"{row['姓名']}的建大附小家长通知书.docx")
        tpl.save(output_path)
    

    以上代码利用pandas库读取Excel数据,并使用DocxTemplate类来加载指定的格式模板。在遍历Excel数据的过程中,将数据填写到指定的格式模板中,并保存生成的Word文档到目标文件夹中。

    请注意,上述代码中给出的文件路径是相对路径,需要根据实际情况进行调整。

    希望以上解决方案对您有帮助!如果您有任何问题,请随时提问。

模板发一下

用python 实现读取excel内容写入到word中

import xlrd
from docx import Document  # 功能是打开文档
from docx.shared import Pt  # 设置磅数
from docxtpl import DocxTemplate
from docx.enum.text import WD_ALIGN_PARAGRAPH  # 功能是对齐
from docx.oxml.ns import qn  # 负责中文格式  以上是每次使用word要使用的库
from docx.shared import Cm  # 调整行高和列宽

document = Document()  # 初始化文档
document.styles['Normal'].font.name = u'仿宋'  # 设置整个文档的字体
document.styles['Normal'].font.size = Pt(12)  # 设置文档磅号
document.styles['Normal'].element.rPr.rFonts.set(qn('w:esatAsia'), u'仿宋')
def read_excel():
    # 打开excel表格
    data_excel = xlrd.open_workbook('运营管理二期测试用例.xlsx')
    # 获取所有sheet名称
    names = data_excel.sheet_names()
    for name in names:
        # 根据sheet名称获取对应的表
        table = data_excel.sheet_by_name(sheet_name='%s' % name)
        # 获取sheet中总行数
        n_rows = table.nrows
        for row in range(1, n_rows):
            check_point = table.row_values(row)[10]
            transaction_name = table.row_values(row)[4]
            test_procedure = table.row_values(row)[12]
            test_procedure_list = test_procedure.split()
            procedure_str = ''
            for procedure in test_procedure_list:
                procedure_str += procedure
            expected_results = table.row_values(row)[13]
            document.add_paragraph("%s.【案例】:%s" % (row, check_point.strip()))
            document.add_paragraph("【交易/模块】:%s" % transaction_name.strip())
            test_procedure.split()
            document.add_paragraph("【步骤】:%s" % procedure_str)
            document.add_paragraph("【结果】:%s" % expected_results.strip())
            document.add_paragraph("【测试结论】:测试通过")
            paragraph = document.add_paragraph("【测试截图】:")
            paragraph_format = paragraph.paragraph_format
            paragraph_format.space_after = Pt(80)  # 上行间距
            document.save("{}".format(name) + ".docx")

read_excel()


实现思路,使用python的pandas库来读取数据,生成dataframe结构的数据,便于进行计算,因为你的数据存在一对多的情况,需要进行聚合累加等计算,而pandas库可以很方便的实现这一点。当然,你已经使用了openpyxl,可以不考虑使用pandas。
其次使用docx库操作word文档,将pandas处理之后的数据写入到word中。具体的操作代码,可以参考:
python将excel中的数据写入固定的word格式中:https://www.cnblogs.com/wdyjx/p/17514033.html

使用docx库,循环插入就可以了呀

引用chatgpt内容作答:
有几个问题需要修正你提供的代码:

1、在导入openpyxl库时,你使用了错误的导入语句。应该是from openpyxl import load_workbook而不是import openpyxl.load_workbook。

2、在创建新的Word文档对象时,你使用了docx.Document,但在导入库时使用的是DocxTemplate。你需要修改为DocxTemplate。

3、在创建新的Word文档对象后,你需要在循环中处理数据并将其插入表格中。你需要将这部分代码放在正确的位置,以便在每次迭代时都能填充不同的数据。

以下是修正后的代码:

from docxtpl import DocxTemplate
from openpyxl import load_workbook
import os

def replace(obj):
    if obj is None:
        obj = ''
    return obj

wb = load_workbook("D:/2/1.xlsx")
ws = wb.active
contexts = []

for row in range(2, ws.max_row + 1):
    企业名 = ws['A' + str(row)].value
    房间号 = ws['B' + str(row)].value
    电表倍数 = ws['C' + str(row)].value
    倍率 = ws['D' + str(row)].value
    上月表数 = ws['E' + str(row)].value
    本月表数 = ws['F' + str(row)].value
    电水费单价__度 = ws['G' + str(row)].value
    实用度数_度 = ws['H' + str(row)].value
    电费金额_元 = ws['I' + str(row)].value
    context = {
        "企业名": replace(企业名),
        "房间号": replace(房间号),
        "电表倍数": replace(电表倍数),
        "倍率": replace(倍率),
        "上月表数": replace(上月表数),
        "本月表数": replace(本月表数),
        "电水费单价(元/度)": replace(电水费单价__度),
        "实用度数(度)": replace(实用度数_度),
        "电费金额(元)": replace(电费金额_元)
    }
    contexts.append(context)

os.mkdir("D:/2/XX")

for context in contexts:
    tpl = DocxTemplate('D:/2/XX.docx')
    tpl.render(context)
    tpl.save("D:/2/{}电费表.docx".format(context["企业名"]))

这些修正后的代码将会读取Excel文件中的数据,将每个企业的信息填充到Word模板中,并将生成的Word文档保存到指定路径中。请确保你已经安装了docxtpl和openpyxl库。另外,确保Excel文件中的列字母与代码中的对应列字母一致,以避免数据读取错误。