2011-06-30 11 views
0

Word文書を操作して編集するC#ライブラリを作成しました。これはもちろん、OpenXML SDKを参照しています。しかし私がライブラリを使用する場所では、.dllも参照する必要はありません。私は他のプロジェクトの内部WordprocessingDocumentを作成しなければならないのは勿論であるだけではなく渡すここSDKを参照せずにWordDocにストリームを変換する

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

問題:私は別のプロジェクトから使用することがあります

一つの方法は、WordprocessingDocumentパラメータを持っており、このプロファイルを持っていますストリーム。

[OK]を、私は最も簡単な解決策は、法上の異なるプロファイルだろうと思います。

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パッケージ/ラッパーを使用しているという考え方について、少し懐疑的です。

何が最適な解決策になるので、私はずいぶん問題にはならないでしょうか?どのように実際に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

このようなパッケージネームスペースについては、わかりませんでした。私はそれを少し良く理解するためにそれについて読むべきだと思います。ありがとうございました。 –

+0

ようこそ。 –

+0

うん、 'system.io.packaging'はそれです。 –

関連する問題