このサンプルは、クリーンアップ ルーチンが間違っていることを除けば、おおむね正しいものです...
一部
// Cleanup:
GC.Collect();
GC.WaitForPendingFinalizers();
このメソッドの最後に移動する必要があります..
Marshal.FinalReleaseComObject(range);
Marshal.FinalReleaseComObject(worksheet);
workbook.Close(false, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(workbook);
excelApp.Quit();
Marshal.FinalReleaseComObject(excelApp);
// move deterministic call to garbage collector to AFTER release
// of all COM objects.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
これは、ほとんどのオブジェクトがファイナライズ キューにプッシュされる前に、COM オブジェクトのキューをファイナライズしようとしても意味がないためです。同様に、先制的に GC.Collect を呼び出すと、メモリ内のオブジェクトの余分なトラバーサルが発生するだけで、パフォーマンスに悪影響を及ぼし、オブジェクトがクリーンアップされる保証はありません。
このサンプルのもう 1 つの問題は、なぜ Set_Value メソッドと get_Range メソッドを使用しているのですか? これは不要なようです。
質問に関しては、プレゼンテーション オブジェクトのスライドをループするためにいくつかの foreach ステートメントを追加する必要があると思います。それぞれから必要なデータを収集したら、現在のスライド反復の範囲内に新しいスライドを追加します。 .
すなわち
foreach slide in Presentation.Slides()
{
string data = getData(slide);
Excel.WorkSheet worksheet = workbook.Sheets.Add(Type.Missing);
worksheet.Range("A1").Value = data;
}
// you will need to write the getData method yourself...
VB.NETサイドの質問...上記のVB.Netサンプルについて質問する人のために...
セミコロンを削除します。
Type.Missing のすべてのインスタンスを BLANK に置き換えます (つまり、「スペースなし」)。
get_range()
と置き換えます.Range()
set_value()
と置き換えます.Value()
Imports Excel = Microsoft.Office.Interop.Excel
クラスの先頭にステートメントを追加します。