Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 写入正在读取的同一OpenXmlPart_C#_Openxml_Openxml Sdk_Xmlreader_Xmlwriter - Fatal编程技术网

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`.