在不引用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类实际上是如何将其作为参数传递的?为什么流没有更改最初打开的文档?

在不引用SDK的情况下将流转换为WordDoc

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();