5

既存の Excel 2003 テンプレート (xlt) を編集し、新しい *.xls ファイルに保存する単純な c# アプリケーションを実行しています。それは次のようなものです:

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open("\\my_template.xlt");
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[0];

次に、ファイル内のさまざまな数式で使用されるいくつかのセルを変更し、テンプレートを新しいファイルに保存します。

workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
workbook.Close(true, misValue, misValue);
app.Quit();

worksheet = null;
workbook = null;
app = null;

問題は、新しいファイルが正常に保存されたら、それを開いて、編集したセルを使用している数式の結果が「#NAME」などのようになっていることです。ファイルを再度開くと、すべてが正常になります。なぜそれが起こるのですか?

間違った方法でファイルを保存している可能性があります。そのため、最初に開いたときにエラーが表示されますか? この問題は 2003 オフィスでのみ発生します... 私が認めたように。

4

1 に答える 1

4

ここで説明したように、列挙をxlWorkbookNormalではなくxlExcel8に変更すると、正しい形式で保存されます。

第二に、参照値を null に設定しても、.Net では実際には何もしません。VB6 とは異なります。ガベージ コレクターは、参照が使用されなくなったときにそれを把握してクリーンアップするのに十分なほどスマートです。

第 3 に、.Net 4 以降を使用している場合は、Workbook Close メソッドのオプションの引数に値を指定する必要がないため、これでも同様に機能します。

workbook.Close(true);

最後に、ワークシートをワークシートとしてキャストする必要はありません。これを行うだけです。

Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0];

最後に 1 つの考えとして、完了したらマーシャルを使用してアプリケーション オブジェクトを解放します。そうしないと、Excel がタスク マネージャーに永久に残ります (おそらく、try ブロック内で必要なことを実行してから、finally ブロック内でこれを実行します)。

Marshal.ReleaseComObjct(app);

メソッドの更新バージョンは以下のとおりです。

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();

try
{
    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open(@"\my_template.xlt");
    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0];

    //Do stuff

    workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat..xlExcel8);
    workbook.Close(true);
    app.Quit();
}
finally
{
    Marshal.ReleaseComObject(app);
}
于 2012-10-04T15:25:35.920 に答える