【问题标题】:Word cannot open DOCX file with a tableWord 无法使用表格打开 DOCX 文件
【发布时间】:2021-01-14 22:28:18
【问题描述】:

我正在尝试使用 Open XML API 对 DOCX 文件运行邮件合并 - 只需将 <w:t> 元素替换为表格(见下文)。即使是使用以下代码创建的最简单的表格也会导致 Word 在打开文件时出错。

如果我摆脱了这一行(这样我就只有<w:tbl> / <w:tblGrid> / <w:GridCol>)。没有错误,但是我当然不能有任何数据。

谁能看出我做错了什么?

Table table = new Table(new TableGrid(new GridColumn() { Width = "2000"}),
                        new TableRow(new TableCell(new Paragraph(new Run(new Text("test")))))
                                      );
TextNode.Parent.ReplaceChild<Text>(table, TextNode);

【问题讨论】:

    标签: ms-word openxml openxml-sdk


    【解决方案1】:

    您不能将&lt;w:t&gt; 替换为&lt;w:tbl&gt;。表格是块级元素,因此您可以将其放置在与段落相同的位置 (

    )。

    换句话说,您可以将其作为以下之一的子元素:body、comment、customXml、docPartBody、endnote、footnote、ftr、hdr、sdtContent、tc 和 txbxContent。

    所以,试试这样的:

    // TextNode (Text) -> Parent (Run) -> Parent (Paragraph)
    var paragraph = TextNode.Parent.Parent as Paragraph;
    paragraph.Parent.ReplaceChild(table, paragraph);
    

    编辑:

    如果父元素是&lt;w:tc&gt;,则应在其末尾添加一个空段落:

    // TextNode (Text) -> Parent (Run) -> Parent (Paragraph)
    var paragraph = TextNode.Parent.Parent as Paragraph;
    
    var parent = paragraph.Parent;
    parent.ReplaceChild(table, paragraph);
    
    if (parent is TableCell)
        parent.InsertAfter(new Paragraph(), table);
    

    【讨论】:

    • 只要我还在表格后面添加一个段落,就可以正常工作 - 在我的情况下,表格位于另一个表格单元格中,如果没有后续段落,Word 就会出现问题。 @Mario Z - 我在哪里可以找到任何讨论这种行为的文档?我没有看到任何讨论这个的东西。
    • @DmitryStreblechenko 根据WPtableCell 规范,唯一需要的是表格单元格必须包含至少一个块级元素。因此,这似乎是 Microsoft Word 特有的要求。我尝试使用不同的 Word 应用程序(如 LibreOffice Writer)打开这样的文档,他们并没有抱怨缺少段落(但我注意到其中一些在这种情况下会出现奇怪的单元格渲染)。
    • @DmitryStreblechenko 仅供参考,在进行一些试验时,我注意到单元格中的最后一个块也可以是包含段落的 SDT 元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-03-28
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多