【问题标题】:Paragraphs and table not found in a Word Document (open XML)在 Word 文档中找不到段落和表格(打开 XML)
【发布时间】:2020-12-03 20:39:52
【问题描述】:

我使用 MS Word 创建了简单的开放 XML 文档 (.dotx)。该文件包含简单的文本和一个表格。我正在尝试用新文本替换文本中的几个自定义占位符,但是下面的 sn-p 在文档中找不到任何 ParagraphTable。我已经尝试创建几个新的 .dotx 文件,还尝试了文档类型的不同变体,即使用 MS Word 的.dotx(Strict Open XML) .docx,但问题仍然存在。

   using (WordprocessingDocument doc =
            WordprocessingDocument.Open(templatePath, true))
        {

            var body = doc.MainDocumentPart.Document.Body;
            var paras = body.Elements<Paragraph>(); // <-- always empty
            var tables = body.Descendants<Table>(); // <-- always empty

            foreach (Table t in tables)
            {
                t.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text("test"))))));
            }

            foreach (var para in paras)
            {
                foreach (var run in para.Elements<Run>())
                {
                    foreach (var text in run.Elements<Text>())
                    {
                        if (text.Text.Contains("###name###"))
                        {
                            text.Text = text.Text.Replace("###name###", "Sample");
                        }
                    }
                }
            }
            doc.SaveAs(resultPath);
        }

有趣的是,如果我使用 MS 文档中的以下 sn-p 它确实可以工作,但是目前尚不清楚如何向表中添加其他行。因此,我宁愿使用第一种方法。知道文件或上述代码可能有什么问题吗?

            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(templatePath, true))
        {
            string docText = null;
            using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }

            Regex regexText = new Regex("###name###");
            docText = regexText.Replace(docText, "My Text!");

            using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
            {
                sw.Write(docText);
            }
        }

【问题讨论】:

    标签: c# ms-word openxml


    【解决方案1】:

    当您使用 MS Word 等编辑器创建文档时,它可以添加一些容器来包装您的段落,我建议您检查生成的 xml。为此,您只需将 .docx 重命名为 .zip 并打开该存档。

    你会在里面找到类似的文件

    您需要使用任何文本编辑器打开word/document.xml,然后查看&lt;w:p&gt; 是否是&lt;w:body&gt; 的直接子代。如果不是直接的,使用descendants方法。

    var paras = body.Descendants<Paragraph>(); // <-- always empty
    

    Elements 仅查找直接子级。

    Descendants 查找任何级别的孩子。

    另外,最常见的问题是命名空间错误,因为Paragraph 存在于OpenXml 的多个命名空间中,你必须使用using DocumentFormat.OpenXml.Wordprocessing;

    【讨论】:

    • 嗨,我刚刚检查了这个,似乎-&lt;w:body&gt; &lt;w:p&gt; 是直接孩子,因为我处于测试模式,我可以使用任何编辑器..你能推荐一个吗?
    • 我指的是记事本、VS Code 或 Atom
    • 我已成功打开文件,并且顺序似乎是正确的,如上所述。我也尝试使用写字板重新创建文件,但问题似乎仍然存在..
    • 那么我在您的代码中看不到问题。你能检查你的 templatePath 是否有效,并且你的文件在正确的位置吗?你的代码中的resultPath 是什么?
    • 是的文件是有效的,因为我看到它是通过“使用”语句加载的......我稍后在代码中使用相同的路径......所以那里没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多