【发布时间】:2017-05-25 12:14:02
【问题描述】:
例如,我有一个通用脚本,它使用python-docx 输出默认表格样式(此代码运行良好):
import docx
d=docx.Document()
type_of_table=docx.enum.style.WD_STYLE_TYPE.TABLE
list_table=[['header1','header2'],['cell1','cell2'],['cell3','cell4']]
numcols=max(map(len,list_table))
numrows=len(list_table)
styles=(s for s in d.styles if s.type==type_of_table)
for stylenum,style in enumerate(styles,start=1):
label=d.add_paragraph('{}) {}'.format(stylenum,style.name))
label.paragraph_format.keep_with_next=True
label.paragraph_format.space_before=docx.shared.Pt(18)
label.paragraph_format.space_after=docx.shared.Pt(0)
table=d.add_table(numrows,numcols)
table.style=style
for r,row in enumerate(list_table):
for c,cell in enumerate(row):
table.row_cells(r)[c].text=cell
d.save('tablestyles.docx')
接下来,我打开了文档,突出显示了一个拆分表,在段落格式下,选择了“Keep with next”,这成功地防止了表格被拆分到一个页面:
这里是非断表的XML代码:
您可以看到突出显示的行显示了应该将表格保持在一起的段落属性。于是我写了这个函数,并把它卡在d.save('tablestyles.docx')这一行上面的代码中:
def no_table_break(document):
tags=document.element.xpath('//w:p')
for tag in tags:
ppr=tag.get_or_add_pPr()
ppr.keepNext_val=True
no_table_break(d)
当我检查 XML 代码时,段落属性标记设置正确,当我打开 Word 文档时,所有表格的“保留下一个”框都被选中,但表格仍然跨页拆分。我是否缺少 XML 标记或阻止其正常工作的东西?
【问题讨论】:
-
我认为您需要更具体地了解“孤立”行是什么。下一步将是查看您是否可以完成使用 Word 应用程序/UI 后的结果。如果您可以通过这种方式缩小范围,您可以确定产生差异的 XML 元素/属性。
w:cantSplit可以确定一个单元格是否跨页拆分(当然还有它的行)。 -
@scanny 我所说的孤立行是表的一部分在一个页面上,而表的另一部分在另一个页面上。
-
问题是中断是在偶数行边界上还是在行内中断,就像一页上一行的一部分,而其余部分在下一页的顶部。这些是不同的(错误)行为。
-
@scanny 在我的情况下,中断是在偶数行边界上,而不是环绕行。
-
您能否使用 Word 应用程序完成您正在寻找的结果?如果是这样,你做了什么有效的?喜欢什么对话框选项或其他什么?
标签: python xml pagination python-docx