是否可以调试和/或验证python-docx生成的Microsoft Word文档XML?

问题描述 投票:2回答:1

我正在构建一个简单的框架,用于使用python-docx库生成Microsoft Word文档报告。有时,当我生成文档时,我遇到了一个问题,其中python-docx成功生成了docx文件,但是docx文件将无法在Microsoft Word中打开,并显示如下错误消息:Microsoft Word 'Unspecified Error' Message

通过逐步执行我的代码-逐步将越来越多的内容插入python-docx文档中,然后在每次添加内容后尝试打开生成的docx文件-我能够识别出导致错误的代码。事实证明,该错误是当我尝试使用以下代码插入空的熊猫数据框时引起的:

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...

虽然这可行,但错误搜寻过程引出了我的问题:是否有一种方法可以调试和/或验证python-docx生成的Microsoft Word XML代码?关于验证,有没有一种方法可以验证python-docx生成的docx文件是否有效,并且可以由Microsoft Word打开(实际上不必使用Word打开它)?关于调试,有没有一种方法可以查看和调试docx XML代码以标识问题所在(并可能获取有关在Python代码中生成问题的位置的一些线索)?这样的工具或方法很可能为我节省了我在上文中描述的错误查找过程中的大量时间,并且也许将来还会为我节省时间。非常感谢您的时间和想法。

python-3.x xml ms-word docx python-docx
1个回答
1
投票

您可能知道,.docx文件是符合Open Packaging Convention(OPC)的Zip存档。用OPC的话来说,这样的归档文件表示一个package,其中的(主)文件每个都表示一个part

图像之类的文件是binary部分,但是大多数部分是XML文档。这些XML部分的有效内容由规范随附的一个或多个XML模式(.xsd)文件指定。这些位于python-docx GitHub存储库/ref/xsd/https://github.com/python-openxml/python-docx/tree/master/ref/xsd文件夹中。

这些可用于分别验证零件。由于典型的Word文件主要是document.xml部分,因此,最多的花费可能来自验证该文件。

lxml使用的相同python-docx库可用于验证。您应该参考该程序的lxml documentation

这肯定会捕获架构无效的程序包部分,但是我希望它无法捕获所有可能的XML文档,这些XML文档在加载到Word中时会导致所谓的“修复错误”。

仍然,可能值得尝试。我很想听听它是否捕获了您上面遇到的错误,我希望这是一个零行零列的表格。

© www.soinside.com 2019 - 2024. All rights reserved.