目录
一、问题
我需要在下述表格中第三行的编号、证件名称、来源、证明对象一列的第三行填入1、1、1、1,之后复制第三行的格式,再填入2、2、2、2,再复制第三行的格式,填入3、3、3、3,以此类推。
from docx import Document
def generate_ELdocx(evidence_name, evidence_source, evidence_object, all_names_sources_objects, template_docx):
doc = Document(template_docx)
table = doc.tables[0]
# 从第三行开始填入内容,因此索引从2开始
start_row_index = 2
# 填写第三行的内容
table.cell(start_row_index, 0).text = '1' # 第1列
table.cell(start_row_index, 1).text = evidence_name # 第2列
table.cell(start_row_index, 5).text = evidence_source # 第6列
table.cell(start_row_index, 6).text = evidence_object # 第7列
# 假设复制第三行的格式
copy_row_index = start_row_index
copy_row = table.rows[copy_row_index]
copy_row_height = copy_row.height # 获取要复制的行的高度
if all_names_sources_objects:
row_number = 2 # 从第二行开始的行号
for names_sources_objects in all_names_sources_objects:
evidence_name = names_sources_objects['evidence_name']
evidence_source = names_sources_objects['evidence_source']
evidence_object = names_sources_objects['evidence_object']
# 添加新行并复制高度
new_row = table.add_row()
new_row.height = copy_row_height # 设置新行的高度
# 复制第三行格式并设置新行的单元格内容
for index, cell in enumerate(copy_row.cells):
new_cell = new_row.cells[index]
paragraph = new_cell.paragraphs[0]
run = paragraph.add_run()
# 复制字体大小、粗体、斜体等格式
if cell.paragraphs[0].runs:
example_run = cell.paragraphs[0].runs[0]
run.font.bold = example_run.font.bold
run.font.size = example_run.font.size
run.font.color.rgb = example_run.font.color.rgb
# 复制段落对齐格式
if cell.paragraphs:
paragraph_format = cell.paragraphs[0].paragraph_format
paragraph.alignment = paragraph_format.alignment
# 自动填入第1列的行号
new_row.cells[0].text = str(row_number) # 第1列
new_row.cells[1].text = evidence_name # 第2列
new_row.cells[5].text = evidence_source # 第6列
new_row.cells[6].text = evidence_object # 第7列
row_number += 1
return doc
①但使用上述代码中
②填入信息
③生成的表格的问题是
二、原因
原因:在 Word 表格中,单元格的合并信息可能没有正确复制。当使用 docx
库新增行时,它会按照默认的表格结构创建新行,而不会自动复制行中的合并信息(例如单元格的合并)。因此,如果第三行的第二列原本是多个单元格合并而成的,而在新创建的行中没有合并这些单元格,就会导致额外的单元格出现。
再还有一个迹象:索引需要填写6、7才能填入真正的6、7列。
三、解决方法
使用 docx
库提供的合并方法来合并新行中的单元格,使其与第三行的布局一致。
from docx import Document
def generate_ELdocx(evidence_name, evidence_source, evidence_object, all_names_sources_objects, template_docx):
doc = Document(template_docx)
table = doc.tables[0]
# 从第三行开始填入内容,因此索引从2开始
start_row_index = 2
# 填写第三行的内容
table.cell(start_row_index, 0).text = '1' # 第1列
table.cell(start_row_index, 1).text = evidence_name # 第2列
table.cell(start_row_index, 6).text = evidence_source # 第6列
table.cell(start_row_index, 7).text = evidence_object # 第7列
# 假设复制第三行的格式
copy_row_index = start_row_index
copy_row = table.rows[copy_row_index]
copy_row_height = copy_row.height # 获取要复制的行的高度
if all_names_sources_objects:
row_number = 2 # 从第二行开始的行号
for names_sources_objects in all_names_sources_objects:
evidence_name = names_sources_objects['evidence_name']
evidence_source = names_sources_objects['evidence_source']
evidence_object = names_sources_objects['evidence_object']
# 添加新行并复制高度
new_row = table.add_row()
new_row.height = copy_row_height # 设置新行的高度
# 复制第三行中的单元格合并信息
for index, cell in enumerate(copy_row.cells):
if index in [1]: # 假设第二列(index = 1)在第三行是合并单元格
if len(copy_row.cells) > 1: # 检查是否存在需要合并的单元格
# 合并单元格
new_row.cells[1].merge(new_row.cells[2]) # 合并第二列的单元格
# 复制第三行格式并设置新行的单元格内容
for index, cell in enumerate(copy_row.cells):
new_cell = new_row.cells[index]
paragraph = new_cell.paragraphs[0]
run = paragraph.add_run()
# 复制字体大小、粗体、斜体等格式
if cell.paragraphs[0].runs:
example_run = cell.paragraphs[0].runs[0]
run.font.bold = example_run.font.bold
run.font.size = example_run.font.size
run.font.color.rgb = example_run.font.color.rgb
# 复制段落对齐格式
if cell.paragraphs:
paragraph_format = cell.paragraphs[0].paragraph_format
paragraph.alignment = paragraph_format.alignment
# 自动填入第1列的行号
new_row.cells[0].text = str(row_number) # 第1列
new_row.cells[1].text = evidence_name # 第2列
new_row.cells[6].text = evidence_source # 第6列
new_row.cells[7].text = evidence_object # 第7列
row_number += 1
return doc