Этот образец в основном правильный, за исключением процедуры очистки, которая неправильна ...
часть
// 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 просто вызовет дополнительный обход объектов в памяти, что окажет негативное влияние на производительность и не будет гарантировать очистку объектов.
Также другая проблема с этим примером, почему вы используете методы 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 на ПУСТО (то есть "без пробелов")
Заменить get_range()
на .Range()
Заменить set_value()
на .Value()
- Добавьте оператор
Imports Excel = Microsoft.Office.Interop.Excel
в начало вашего класса.