2017-02-07 14 views
1

Я хочу обрабатывать объекты в том порядке, в котором они записаны в документе Word. Объекты, с которыми я столкнулся, - это абзацы, текст в параграфах, выполняется в параграфах, в текстах, таблицах и параграфах в ячейках таблицы. Пока у меня есть две полезные программы. Один, который проходит через абзацы документа и приобретает текст абзаца; хранится в списке, индексированном по [абзац #]. Эта же программа имеет возможность собирать текст из прогонов, храниться в 2D-списке, индексированном по [абзац #] [выполнить #], но я не нашел, что прогоны более полезны, чем весь текст абзаца. Моя вторая программа проходит весь документ и находит таблицы. Когда он имеет таблицу, он проходит через таблицу за строкой, ячейкой и абзацем в ячейке.Обработка объектов по заказу в docx

Теперь они кажутся отличными строительными блоками для моей цели. Я хотел бы привести текст в порядок. Абсолютно, как будто мигающему текстовому курсору приказали двигаться человеком, удерживающим стрелку вправо на клавиатуре. Когда текстовый курсор перемещается по объектам, он хранит их несколькими индексами, обозначающими # объекта и тип объекта.

Скажем, у меня есть вспомогательные функции paragraph_read и table_read. Скажем, у документа есть этот порядок объектов:. Я хотел бы пройти через эти и выполнить мои вспомогательные функции в следующем порядке: paragraph_read, paragraph_read, table_read, paragraph_read

Я хотел бы знать, может ли моя программа перемещаться по объекту документа по объекту, как курсор, прокручивающий вправо.

С помощь очень быстро. Благодарю.

-Крис

+0

Там какая-то дискуссия и здесь код, который описывает что: https://github.com/python-openxml/python-docx/issues/40. Обязательно посмотрите до конца, где были сделаны некоторые обновления для размещения последней версии. – scanny

+0

Это именно то, что я пытаюсь сделать. Спасибо за указатель. -Chris – Chris

+0

@scanny У меня возникли проблемы с пониманием кода на этой странице. Не могли бы вы мне рассказать? Или дать мне подсказку о том, как с этим что-то сделать? – Chris

ответ

3

Вам нужно добавить эту функцию в код где-то удобно:

from docx.document import Document 
from docx.oxml.table import CT_Tbl 
from docx.oxml.text.paragraph import CT_P 
from docx.table import _Cell, Table 
from docx.text.paragraph import Paragraph 


def iter_block_items(parent): 
    """ 
    Yield each paragraph and table child within *parent*, in document 
    order. Each returned value is an instance of either Table or 
    Paragraph. *parent* would most commonly be a reference to a main 
    Document object, but also works for a _Cell object, which itself can 
    contain paragraphs and tables. 
    """ 
    if isinstance(parent, Document): 
     parent_elm = parent.element.body 
    elif isinstance(parent, _Cell): 
     parent_elm = parent._tc 
    else: 
     raise ValueError("something's not right") 

    for child in parent_elm.iterchildren(): 
     if isinstance(child, CT_P): 
      yield Paragraph(child, parent) 
     elif isinstance(child, CT_Tbl): 
      yield Table(child, parent) 

Тогда вы используете его как это:

document = Document('my_document.docx') 

for block_item in iter_block_items(document): 
    if isinstance(block_item, Paragraph): 
     do_paragraph_thing(paragraph=block_item) 
    elif isinstance(block_item, Table): 
     do_table_thing(table=block_item) 
    else: 
     # raise an exception or do nothing or whatever. This branch would 
     # only be reached on an unforeseen error. 
+0

Я получаю ошибку атрибута: объект «CT_Document» не имеет атрибута «_body» – Chris

+0

@ Крис жаль, должен быть «телом» без подчеркивания подчеркивания. Я обновил код. – scanny

+0

вы очень помогаете. Он наверняка работал с этой модификацией. Я понял, что do_paragraph_thing (block_item, Paragraph) является владельцем места для моей функции и тем, что хранится в block_item. Я все еще работаю над пошивом программы в целом, но эта жизненно важная часть программы застегнута. Проблемное тело почти приспособлено! :) – Chris

 Смежные вопросы

  • Нет связанных вопросов^_^