2011-06-30 17 views
0

因此,我創建了一個C#庫,用於處理和編輯Word文檔。這當然引用了OpenXML SDK。但是,在我使用該庫的情況下,我不希望引用.dll。我可能會從其他項目中使用將流引入WordDoc而不引用SDK

一種方法有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); 
} 

但我得到了我認爲將是一個絕妙的主意只是爲了創建流的擴展方法:

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和包裝/包裝方面的整個想法持懷疑態度。

什麼是最佳解決方案,所以我不會遇到很多麻煩? WordprocessingDocument類實際上是如何工作的,並將其作爲參數傳遞給它?爲什麼流不改變最初打開的文檔?

回答

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

我不知道這個包裝namepsace這樣。我想我應該閱讀它以更好地理解它。謝謝。 –

+0

不客氣。 –

+0

是的,'system.io.packaging'就是它。 –