将流转换为WordDoc而不引用SDK

时间:2011-06-30 11:02:53

标签: c# stream extension-methods openxml openxml-sdk

所以我创建了一个C#库来操作和编辑Word文档。这当然引用了OpenXML SDK。我在哪里使用该库,但我也不必参考.dll。

我可能在其他项目中使用的一种方法有一个WordprocessingDocument参数,并且具有以下配置文件:

public bool FillTemplate(ref WordprocessingDocument document, XElement data)
{
    //EDIT the document and return True if succesful.
}

这里的问题当然是我必须在另一个项目中创建一个WordprocessingDocument,而不是只传递一个流。

好吧我想最简单的解决方案是该方法的不同配置文件:

public bool FillTemplate(Stream document, XElement data)
{
    WordprocessingDocument doc = WordprocessingDocument.Open(document, true);
    return FillTemplate(doc, data);
}

但是我得到了我认为仅为Stream创建扩展方法的好主意:

public static WordprocessingDocument ConvertToWordDocument(this Stream stream, bool isEditable)
{
    return WordprocessingDocument.Open(stream, isEditable);
}

并像这样使用它:

FileStream fStream = new FileStream(@"C:\Users\Me\Desktop\SomeDoc.docx", FileMode.Open);
var doc = fStream.ConvertToWordDocument(true);
filler.FillTemplate(ref doc, getXmlDataFor(42));

fStream.Flush();
fStream.Close();

然而,由于某些原因这不起作用(Doc更改但似乎没有返回到流)并且我对我如何使用Streams和{{1}的整个想法持怀疑态度package / wrapper thingy。

什么是最佳解决方案,所以我不会遇到很多麻烦? WordprocessingDocument类实际上如何将它作为参数传递给它?为什么流不会更改最初打开的文档?

1 个答案:

答案 0 :(得分:2)

System.IO.Packaging.Package

似乎是处理opc包时的方法。 以下代码行对我来说很好看。 Package.Open有许多构造函数可以用于路径字符串,流等......

System.IO.Packaging.Package package = System.IO.Packaging.Package.Open(@"C:\Users\Me\Desktop\SomeDoc.docx");
DocumentFormat.OpenXml.Packaging.WordprocessingDocument document = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Create(package, DocumentFormat.OpenXml.WordprocessingDocumentType.Document);

// edit document                
package.Flush();
package.Close();