2017-01-10 5 views
9

В качестве примера, у меня есть общий скрипт, который выводит стили таблицы по умолчанию с помощью python-docx (этот код работает отлично):Как сохранить таблицы строк в 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') 

Далее, я открыл документ, выделил раздвоение таблицу и под формат абзаца, выбранный «отрывать ряд», который успешно предотвращена таблица из раскалываются через страницу:

enter image description here

Здесь является XML кодом ненарушенной таблицы:

enter image description here

Вы можете видеть, что выделенная строка показывает свойство абзаца, которое должно удерживать таблицу вместе. Поэтому я написал эту функцию, и воткнул его в коде выше 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 или что-то, что мешает этому работать должным образом?

+0

Я думаю, вам нужно будет более конкретно узнать, что такое «осиротевшая» строка. Следующий шаг будет состоять в том, чтобы увидеть, сможете ли вы выполнить результат после использования приложения Word/UI. Если вы можете сузить его таким образом, вы можете определить элемент XML/атрибут, который имеет значение. 'w: cantSplit' может определить, разделена ли ячейка на разных страницах (с ее строкой, конечно). – scanny

+0

@scanny все, что я имею в виду по оси сирот, это та часть таблицы, которая находится на одной странице, а другая часть таблицы находится на другом. – LMc

+0

Вопрос заключается в том, находится ли разрыв на четной границе строки или сломан внутри строки, как часть строки на одной странице, а остальная часть - в верхней части следующей страницы. Это разные (неправильные) поведения. – scanny

ответ

1

Вы можете проверить, будет ли срезана таблица с разрывом страницы и принудительно создать новую, прежде чем создавать новую таблицу.

import docx 

MAX_PAGE_SIZE = 80 

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) 

current_page_row = 0 

for stylenum,style in enumerate(styles,start=1): 
    # calc the last row for this new style 
    next_last_row = current_page_row + numrows + 1 

    # add page break if needed and reset the page row 
    if next_last_row > MAX_PAGE_SIZE: 
     d.add_page_break() 
     current_page_row = 0 

    label=d.add_paragraph('{}) {}'.format(stylenum,style.name)) 
    # update the current page row counter 
    current_page_row += 1 

    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 

    # update the current page row counter with the table size 
    current_page_row += numrows 

d.save('ctablestyles.docx') 
Смежные вопросы