在不引用SDK的情况下将流转换为WordDoc
本文关键字:转换 WordDoc 情况下 引用 SDK | 更新日期: 2023-09-27 18:00:58
所以我创建了一个C#库,用于操作和编辑Word文档。这当然引用了OpenXMLSDK。然而,在我使用库的地方,我不想也引用.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();
然而,由于某些原因,这不起作用(文档发生了更改,但似乎没有返回到流中(,我对如何使用Streams和WordprocessingDocument
包/包装器的整个想法有点怀疑。
什么是最佳解决方案,这样我就不会遇到很多麻烦了?WordprocessingDocument
类实际上是如何将其作为参数传递的?为什么流没有更改最初打开的文档?
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();