Есть ли способ отладки и / или проверки документа Microsoft Word XML, созданного с помощью python -docx? - PullRequest
2 голосов
/ 31 марта 2020

Я создаю простую инфраструктуру для создания отчетов документов Microsoft Word с использованием библиотеки python -docx. Иногда, когда я генерирую документ, я сталкиваюсь с проблемой, при которой файл docx успешно генерируется python -docx, но затем файл docx не открывается в Microsoft Word и появляется сообщение об ошибке, подобное этому: Сообщение «Неуказанная ошибка» в Microsoft Word

Прорабатывая мой код шаг за шагом - постепенно вставляя все больше и больше содержимого в документ python -docx, а затем пытаясь открывать сгенерированный файл docx после каждого добавление контента - я смог идентифицировать код, который вызывал ошибку. Как оказалось, ошибка была вызвана тем, что я попытался вставить пустой pandas кадр данных, используя следующий код:

def insert_as_table(df: pd.DataFrame, document: Document) -> Document:

    # compute parameters
    n_rows = len(df) + 1
    n_cols = len(df.columns)

    # create table object
    table = document.add_table(rows=n_rows, cols=n_cols)

    # fill header cells with text
    for header_cell, col in zip(table.rows[0].cells, df.columns):
        header_cell.text = str(col)

    # fill cells with strings
    for i, row in df.iterrows():
        for table_cell, (j, data) in zip(table.rows[i + 1].cells, row.iteritems()):
            table_cell.text = str(data)

    return document

Мое решение состояло в том, чтобы добавить проверку входных данных - проверить, что кадр данных не был пустым до при попытке вставить его:

def insert_as_table(df: pd.DataFrame, document: Document) -> Document:

    if df.empty:
        raise ValueError('df is empty. Cannot insert an empty dataframe as a table.')

    etc...

Хотя это сработало, процесс поиска ошибок приводит к моему вопросу: есть ли способ отладки и / или проверки кода Microsoft Word XML, сгенерированного python -docx? Что касается проверки, могу ли я проверить, что файл docx, сгенерированный python -docx, действителен и сможет быть открыт в Microsoft Word (без необходимости открывать его с помощью Word)? Что касается отладки, есть ли способ, которым я могу просмотреть и отладить код docx XML, чтобы определить, где находится проблема (и, возможно, получить некоторые подсказки относительно того, где проблема генерируется в коде Python)? Такой инструмент или метод, скорее всего, сэкономили бы мне значительное количество времени на поиске ошибок, которые я описал выше, и, возможно, сэкономят мне время и в будущем. Большое спасибо за ваше время и мысли.

1 Ответ

1 голос
/ 31 марта 2020

Как вы, возможно, знаете, файл .docx представляет собой Zip-архив, соответствующий Конвенции об открытой упаковке (OP C). На языке OP C такой архив представляет собой пакет , и каждый из (основных) файлов в нем представляет part .

Файлы, такие как изображения двоичных частей, но большинство частей XML документов. Допустимое содержимое этих XML частей определяется одним или несколькими файлами XML Schema (.xsd), сопровождающими spe c. Они доступны в папке /ref/xsd/ репозитория python -docx GitHub https://github.com/python-openxml/python-docx/tree/master/ref/xsd.

Они могут использоваться для индивидуальной проверки деталей. Поскольку типичный файл Word в основном состоит из document.xml, большая часть пробега, вероятно, будет получена при его проверке.

Та же самая библиотека lxml, которую использует python-docx, может использоваться для проверки. Вы должны обратиться к l xml документации для этой процедуры.

Это определенно отловит часть пакета с неверной схемой, но я ожидаю, что она не сможет перехватить все возможные XML документы это может вызвать так называемую «ошибку исправления» при загрузке в Word.

Тем не менее, возможно, стоит попробовать. Я хотел бы услышать, поймала ли она ошибку, которую вы имели выше, которая, как я ожидаю, была таблицей с нулевыми строками и с нулевыми колонками.

...