目录
一、问题
二、原因
三、解决方法
一、问题
我需要在下述表格中第三行的编号、证件名称、来源、证明对象一列的第三行填入1、1、1、1,之后复制第三行的格式,再填入2、2、2、2,再复制第三行的格式,填入3、3、3、3,以此类推。
from docx import Documentdef 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_indexcopy_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.boldrun.font.size = example_run.font.sizerun.font.color.rgb = example_run.font.color.rgb# 复制段落对齐格式if cell.paragraphs:paragraph_format = cell.paragraphs[0].paragraph_formatparagraph.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 += 1return doc
①但使用上述代码中
②填入信息
③生成的表格的问题是
二、原因
原因:在 Word 表格中,单元格的合并信息可能没有正确复制。当使用 docx
库新增行时,它会按照默认的表格结构创建新行,而不会自动复制行中的合并信息(例如单元格的合并)。因此,如果第三行的第二列原本是多个单元格合并而成的,而在新创建的行中没有合并这些单元格,就会导致额外的单元格出现。
再还有一个迹象:索引需要填写6、7才能填入真正的6、7列。
三、解决方法
使用 docx
库提供的合并方法来合并新行中的单元格,使其与第三行的布局一致。
from docx import Documentdef 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_indexcopy_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.boldrun.font.size = example_run.font.sizerun.font.color.rgb = example_run.font.color.rgb# 复制段落对齐格式if cell.paragraphs:paragraph_format = cell.paragraphs[0].paragraph_formatparagraph.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 += 1return doc