python-docx复制的行格式多出一个单元格

目录

一、问题

二、原因

三、解决方法


一、问题

我需要在下述表格中第三行的编号、证件名称、来源、证明对象一列的第三行填入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

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
python-docx中,要合并单元格可以使用merge()方法。该方法接受一个参数,即要合并的目标单元格。合并后会返回一个新的合并后的单元格对象。下面是一个示例代码: ```python from docx import Document doc = Document() table = doc.add_table(5, 3, style="Table Grid") # 获取要合并的单元格 cell1 = table.cell(0, 0) cell2 = table.cell(0, 1) # 合并单元格 merged_cell = cell1.merge(cell2) # 修改合并后的单元格文本 merged_cell.text = "合并后的单元格" # 保存文档 doc.save("merged_table.docx") ``` 在这个示例中,我们首先创建了一个包含53列的表格。然后,我们获取了要合并的两个单元格cell1和cell2。接下来,我们使用merge()方法将这两个单元格合并成一个新的单元格merged_cell。最后,我们修改了合并后的单元格的文本内容为"合并后的单元格"。最后,我们保存了文档。 请注意,合并单元格的操作会改变表格的结构,因此在合并单元格之前,请确保你已经理解了表格的结构和要合并的单元格的位置。 #### 引用[.reference_title] - *1* [【python-docx】添加表格、合并单元格、设置样式](https://blog.csdn.net/qq_39147299/article/details/125414499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python docx处理word文档中表格合并问题](https://blog.csdn.net/u013546508/article/details/88687661)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python-docx 合并单元格](https://blog.csdn.net/qq1261275789/article/details/126380020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值