插入Open XML时抛出Range.InsertXML

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

我正在为Word编写VSTO加载项。我正在操纵一些内容控件并拥有他们的Range对象。

我正在尝试使用Open XML SDK来创建XML元素对象(OpenXmlElement),例如Run(Run / w:r)及其属性。这是XML:

<w:r xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:rPr>
    <w:b />
  </w:rPr>
  <w:t>Hello world this should be bold</w:t>
</w:r>

当我把它传给Range.InsertXML时,我明白了

无法在指定位置插入XML标记。

从我所看到的可能是我的XML格式不正确。我还包含了一个XML声明但没有成功。

我应该使用什么格式将Open XML字符串传递给InsertXml

编辑我正在以这种方式创建文档以使用下面讨论的平面XML模型:

using (MemoryStream stream = new MemoryStream())
using (Wordprocessing document = WordprocessingDocument.Create(stream, WordprocessingDocumentType.Document))
{
    MainDocumentPart part = document.AddMainDocumentPart();
    Body body = new Body(new Paragraph(new Run(new RunProperties(new Bold()),
        new Text("Hello world this should be bold"))));
    mainDocumentPart.Document = new Document(body);
    document.Save();

    string xml = document.ToFlatOpcString();
    range.InsertXml(xml);
}

现在我使用OpenXML SDK获得了一个例外。

根元素缺失。

at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlReader.MoveToContent()
at System.Xml.Linq.XElement.Load(XmlReader reader, LoadOptions options)
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.GetContentsAsXml(PackagePart part)
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.<>c.<ToFlatOpcDocument>b__109_0(PackagePart part)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content)
at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content)
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.ToFlatOpcDocument(XProcessingInstruction instruction)
at DocumentFormat.OpenXml.Packaging.WordprocessingDocument.ToFlatOpcDocument()
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.ToFlatOpcString()
... my stack
.net ms-word vsto office-interop openxml-sdk
1个回答
0
投票

关键部分是你需要有效的WordOpenXML OPC平面文件格式(如果你谷歌那么多技术ECMA信息,并且还阅读由Eric White编写的信息)用于格式化的Word内容。您可以通过从Range获取WordOpenXML来查看其中涉及的内容,然后将其写出来。例如,变量x在此VBA代码中包含的内容:

Sub WriteWordOpenXML()
    Dim docSource As word.Document
    Dim docTarget As word.Document
    Dim x As String

    Set docSource = ActiveDocument
    x = docSource.content.Text
    Set docTarget = Documents.Add
    docTarget.content.InsertXML x
End Sub

结果非常冗长,你不需要全部。棘手的部分是确切地知道你需要多少。您需要多少取决于您想要插入的内容。根据经验,您不需要与插入内容无关的部件或命名空间。例如,如果没有涉及图形,可以安全地省略与图形有关的所有内容。

This article简单地解释了Word Open XML对于某些内容以及如何使用OPC平面文件格式的最小要求。内容太长,无法包含在Stack Overflow帖子中。

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