3

これは非常に単純なことで、適切なテクニックを見つけることができません。私が欲しいのは、.dotxテンプレートを開き、いくつかの変更を加えて、同じ名前で.docx拡張子として保存することです。WordprocessingDocumentを保存できますが、ロード元の場所にのみ保存できます。変更を加えたWordprocessingDocumentを使用して新しいドキュメントを手動で作成しようとしましたが、これまでのところ何も機能していません。試しMainDocumentPart.Document.WriteTo(XmlWriter.Create(targetPath));たところ、空のファイルが取得されました。

ここで正しい方法は何ですか?SDKに関する限り、.dotxファイルは特別なものですか、それとも別のドキュメントですか?テンプレートをコピー先にコピーし、それを開い変更を加えて保存する必要がありますか?私のアプリが2つのクライアントから同時に呼び出された場合、同じ.dotxファイルを2回開くことができる場合、私はいくつかの懸念を抱いていました...この場合、コピーを作成することはとにかく賢明です...しかし、私自身の好奇心のために私はまだ欲しいです「名前を付けて保存」を行う方法を知るため。

4

2 に答える 2

6

状況に応じて、File.IOを使用してdotxファイルをdocxファイルにコピーし、そこで変更を加えることをお勧めします。新しいdocxファイルのエラーを防ぐために呼び出す必要のあるChangeDocumentType関数もあります。

            File.Copy(@"\path\to\template.dotx", @"\path\to\template.docx");

            using(WordprocessingDocument newdoc = WordprocessingDocument.Open(@"\path\to\template.docx", true))
            {
                newdoc.ChangeDocumentType(WordprocessingDocumentType.Document);
                //manipulate document....
            }
于 2010-07-28T19:52:11.373 に答える
0

M_R_Hの答えは正しいですが、より高速でIOの負荷が少ない方法があります。

  1. テンプレートまたはドキュメントをに読み込みMemoryStreamます。
  2. usingステートメント内:
    • でテンプレートまたはドキュメントを開きますMemoryStream
    • テンプレート(.dotx)を開き、それをドキュメント(.docx)として保存する場合は、ドキュメントタイプをに変更する必要がありますWordprocessingDocumentType.Document。そうしないと、ドキュメントを開こうとしたときにWordが文句を言います。
    • ドキュメントを操作します。
  3. MemoryStreamの内容をファイルに書き込みます。

MemoryStream最初のステップでは、次のメソッドを使用できます。このメソッドは、ファイルを:に読み込みます。

public static MemoryStream ReadAllBytesToMemoryStream(string path)
{
    byte[] buffer = File.ReadAllBytes(path);
    var destStream = new MemoryStream(buffer.Length);
    destStream.Write(buffer, 0, buffer.Length);
    destStream.Seek(0, SeekOrigin.Begin);
    return destStream;
}

次に、それを次のように使用できます(M_R_Hのコードを可能な限り複製します)。

// Step #1 (note the using declaration)
using MemoryStream stream = ReadAllBytesToMemoryStream(@"\path\to\template.dotx");

// Step #2
using (WordprocessingDocument newdoc = WordprocessingDocument.Open(stream, true)
{
    // You must do the following to turn a template into a document.
    newdoc.ChangeDocumentType(WordprocessingDocumentType.Document);

    // Manipulate document (completely in memory now) ...
}

// Step #3
File.WriteAllBytes(@"\path\to\template.docx", stream.GetBuffer());

Word文書またはテンプレートの複製(または複製)の方法の比較については、この投稿を参照してください。

于 2019-11-28T17:26:01.217 に答える