4

メモリに System.IO.Packaging.Package があり (これは WordprocessingDocument です)、それをブラウザーにストリーミングして保存したいと考えています。word 文書は MVC ベースのアプリケーションによって変更されており、結果のファイルは現在の要求に対して変更されています。

私は、パッケージがいくつかのパーツを含む「zip」ファイルを表していることを理解しています。これらのパーツには、ヘッダー、フッター、および本文ドキュメントが含まれます。それぞれを個別に変更したので、パッケージをユーザーにストリーム配信したいと考えています。

個々のパーツ ストリームを取得できます... package.GetPart(new Uri("/word/document.xml", UriKind.Relative)).GetStream()

ただし、ファイル システムに書き込むことなく、ドキュメント (パッケージ) 全体で出力ストリームを取得する方法がありません。

前もって感謝します

いいえ、私が必要だと思うのはこのようなものです...私はすでにテンプレートドキュメントを読み込んで、メモリに変更を加えました。ここで、変更されたドキュメントを (テンプレートはそのままにして) ユーザーにストリーム配信したいと考えています。

        MemoryStream stream = new MemoryStream();
        WordprocessingDocument docOut =
            WordprocessingDocument.Create( stream, WordprocessingDocumentType.Document);

        foreach (var part in package.GetParts())
        {
            using (StreamReader streamReader = new StreamReader(part.GetStream()))
            {
                PackagePart newPart = docOut.Package.CreatePart(
                    part.Uri, part.ContentType );
                using (StreamWriter streamWriter = new StreamWriter(newPart.GetStream(FileMode.Create)))
                {
                    streamWriter.Write(streamReader.ReadToEnd());
                }
            }
        }

残念ながら、これにより「破損した」Word文書が生成されます...

4

1 に答える 1

0

OpenXmlPackage.Close メソッドは、すべてのパーツのすべての変更を基になるストアに保存します。ストリームからパッケージを開いた場合は、そのストリームを使用してください。

public Stream packageStream() {
    var ms = new MemoryStream();
    var wrdPk = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document);
    // Build the package ...
    var docPart = wrdPk.AddMainDocumentPart();
    docPart.Document = new Document(
        new Body(new Paragraph(new Run(new Text("Hello world.")))));
    // Flush all changes
    wrdPk.Close();
    return ms;
}
于 2012-06-28T14:58:40.520 に答える