所以我创建了一个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
类实际上如何将它作为参数传递给它?为什么流不会更改最初打开的文档?
答案 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();