如何用Python将Excel中的数据填写到word指定的格式模板内,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["企业名"]))
合同docx模板(在需要插值的位置填充 {{}} 表达式)
人员数据xlsx模板
问题中的代码是使用docxtpl
库来操作Word文档的。首先,我们需要明确一下所需的步骤:
下面是解决这个问题的具体步骤和代码示例:
from docxtpl import DocxTemplate
import pandas as pd
import os
zpath = os.getcwd() + '\\' # 当前工作路径
tpl_path = zpath + '建大附小家长通知书.docx' # 指定的格式模板路径
excel_path = zpath + '成绩单.xlsx' # Excel数据文件路径
output_folder = zpath + '文档生成结果' # 生成的Word文档保存的文件夹路径
try:
os.mkdir(output_folder)
except:
pass
grade = pd.read_excel(excel_path)
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文件中的列字母与代码中的对应列字母一致,以避免数据读取错误。