使用python-docx如何单独修改指定表格单元格的左边框格式
python-docx 指定表格单元格左边框修改实现方案
核心逻辑
python-docx 未提供公开的单元格边框操作接口,你可以直接操作单元格底层XML属性节点完成配置,无需额外依赖。
具体实现步骤
- 构造左边框的XML配置节点,可自定义边框线型、宽度、颜色参数
- 若单元格原有边框配置,先清除旧配置避免冲突
- 将新的边框配置追加到目标单元格的属性节点中
代码示例
你可以在原有设置单元格底纹的代码后追加以下内容,即可修改htab_cells[2]的左边框:
# 获取目标单元格的属性节点 tc_pr = htab_cells[2]._tc.get_or_add_tcPr() # 清除原有边框配置,避免冲突 for existing_border in tc_pr.xpath('./w:tcBorders'): tc_pr.remove(existing_border) # 构造左边框配置:线型为实线、宽度1磅(sz=8,单位1/8磅)、颜色为黑色 border_xml = r'<w:tcBorders {}><w:left w:val="single" w:sz="8" w:color="000000"/></w:tcBorders>'.format(nsdecls('w')) border_elm = parse_xml(border_xml) # 追加边框配置到单元格属性 tc_pr.append(border_elm)
参数说明
w:val:边框线型,可选值包括single(实线)、dashed(虚线)、dotted(点线)、none(无边框)w:sz:边框宽度,单位为1/8磅,例如设置为16即代表2磅宽w:color:边框颜色,填写十六进制颜色值,无需加#前缀
整合后完整业务代码
def index(request, pk): detailmodel100 = DocModelWord.objects.filter(code_docmodel=100) company=Company.objects.get(pk=pk) document = Document() header = document.sections[0].header htable=header.add_table(1, 3, Inches(10)) htab_cells=htable.rows[0].cells ht0=htab_cells[0].add_paragraph() kh=ht0.add_run() kh.add_picture('media/'+str(company.file), width=Inches(2)) htab_cells[2].add_paragraph(str(company.name)).alignment=WD_ALIGN_PARAGRAPH.LEFT htab_cells[2].add_paragraph(str(company.adresse)).alignment=WD_ALIGN_PARAGRAPH.LEFT htab_cells[2].add_paragraph(str(company.city)).alignment=WD_ALIGN_PARAGRAPH.LEFT # 设置单元格底纹 shading_elm = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w'))) tc_pr = htab_cells[2]._tc.get_or_add_tcPr() tc_pr.append(shading_elm) # 设置单元格左边框 for existing_border in tc_pr.xpath('./w:tcBorders'): tc_pr.remove(existing_border) border_xml = r'<w:tcBorders {}><w:left w:val="single" w:sz="8" w:color="000000"/></w:tcBorders>'.format(nsdecls('w')) border_elm = parse_xml(border_xml) tc_pr.append(border_elm) response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') response['Content-Disposition'] = 'attachment; filename='+str(company.name)+'_Lettre.docx' document.save(response) return response
内容的提问来源于stack exchange,提问作者AZOUARDI
相关产品推荐
相关产品推荐

