C# 写入正在读取的同一OpenXmlPart
是否有一种方法可以写入由C# 写入正在读取的同一OpenXmlPart,c#,openxml,openxml-sdk,xmlreader,xmlwriter,C#,Openxml,Openxml Sdk,Xmlreader,Xmlwriter,是否有一种方法可以写入由OpenXmlPartReader读取的同一OpenXmlPart?我将使用阅读器检测内容,并可能使用OpenXmlWriter就地编写内容。以下是一个不起作用的示例: var ms = new MemoryStream(); var doc = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document); MainDocumentPart part = doc.AddMainDocume
OpenXmlPartReader
读取的同一OpenXmlPart
?我将使用阅读器检测内容,并可能使用OpenXmlWriter
就地编写内容。以下是一个不起作用的示例:
var ms = new MemoryStream();
var doc = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document);
MainDocumentPart part = doc.AddMainDocumentPart();
part.Document = new Document(new Body(new Paragraph(), new Paragraph()));
doc.Save();
var stream = part.GetStream();
var reader = OpenXmlReader.Create(stream);
var writer = OpenXmlWriter.Create(stream);
reader.Read(); // read w:document
reader.ReadFirstChild(); // read w:body
reader.ReadFirstChild(); // read 1st w:p
writer.WriteElement(new Table()); // try to insert w:tbl
doc.Save(); // observe only the 2 paragraphs in the `w:body`.
看起来OpenXMLSDK在幕后使用了
XmlReader
和XmlWriter
,因此可能有一种方法可以同步它们?因此,似乎无法同步OpenXmlReader
和OpenXmlWriter
我最后做的是克隆原始文档,清除部分并有条件地写入它们,同时读取OpenXmlReader
以下是我所做工作的简化模型:
var ms = new MemoryStream();
var inputDoc = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document);
MainDocumentPart inputMainPart = inputDoc.AddMainDocumentPart();
inputMainPart.Document = new Document(new Body(new Paragraph(), new Paragraph()));
input.Save();
var outputDoc = input.Clone();
outputDoc.RemovePart(outputDoc.MainDocumentPart);
var outputMainPart = outputDoc.AddMainDocumentPart();
var reader = OpenXmlReader.Create(inputMainPart);
var writer = OpenXmlWriter.Create(outputMainPart);
// write body/document
reader.Read(); // read w:document
reader.ReadFirstChild(); // read w:body
reader.ReadFirstChild(); // read 1st w:p
do {
writer.WriteElement(new Table()); // insert w:tbl
writer.WriteElement(reader.LoadCurrentElement());
} while(reader.ReadNextSibling());
doc.Save(); // observe only the 2 paragraphs in the `w:body`.