繁体   English   中英

在 Word 文档中找不到段落和表格(打开 XML)

[英]Paragraphs and table not found in a Word Document (open XML)

我使用 MS Word 创建了简单的打开 XML 文档 (.dotx)。 该文件包含简单的文本和一个表格。 我正在尝试用新文本替换文本中的几个自定义占位符,但是下面的代码片段在文档中找不到任何ParagraphTable 我尝试使用 MS Word 创建几个 new.dotx 文件,并尝试了文档类型的不同变体,即.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 文档中的以下代码段,它确实可以工作,但是目前尚不清楚如何向表中添加其他行。 因此,我宁愿使用第一种方法。 知道文件或上述代码可能有什么问题吗?

            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);
            }
        }

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

在里面你会发现这样的文件在此处输入图像描述

您将需要使用任何文本编辑器打开word/document.xml并查看是否存在<w:p>并且它是<w:body>的直接子级。 如果不是直接的,使用descendants方法。

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

Elements仅查找直接子级。

Descendants可以找到任何级别的孩子。

此外,最常见的问题是命名空间错误,因为Paragraph存在于OpenXml的命名空间中,您必须using DocumentFormat.OpenXml.Wordprocessing;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM