我正在为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
关键部分是你需要有效的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帖子中。