Oye estoy automatizando PowerPoint y Excel desde una aplicación C# WinForms; lo que hago es leer diapositivas de PowerPoint y guardarlas en Excel y luego salir de ambas aplicaciones. Excel se cierra con éxito pero PowerPoints no se cierra. El problema es que cuando convierto la primera vez, no se cierra, pero cuando la vuelvo a convertir, lo hace.PowerPoint Lanzado a través de C# no sale
Aquí está mi código
try
{
PowerPoint.Application ppApp;
PowerPoint.Presentation ppPres;
List<Company> companies = new List<Company>();
ppApp = new PowerPoint.Application();
ppApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
ppApp.WindowState = Microsoft.Office.Interop.PowerPoint.PpWindowState.ppWindowMinimized;
ppPres = ppApp.Presentations.Open(fileTxtBox.Text,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoTrue);
int slides = ppPres.Slides.Count;
for (int slide = 1; slide <= slides; slide++)
{
int rows = 1;
PowerPoint.Cell cell;
int shape = 1;
for (; shape < ppPres.Slides[slide].Shapes.Count; shape++)
{
if (ppPres.Slides[slide].Shapes[shape].HasTable == Microsoft.Office.Core.MsoTriState.msoTrue)
{
cell = ppPres.Slides[slide].Shapes[shape].Table.Cell(1, 1);
if (cell.Shape.TextFrame.TextRange.Text.Trim().ToLower().Contains("realized"))
{
rows = ppPres.Slides[slide].Shapes[shape].Table.Rows.Count;
break;
}
}
}
Company comp = new Company(rows);
InitializeCompany(ref comp, ppPres.Slides[slide]);
companies.Add(comp);
}
SaveInExcel(companies);
ppPres.Close();
ppPres = null;
ppApp.Quit();
ppApp = null;
return;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
Hey Mike gracias, pero este didn Funcionó. Una cosa que quiero decirte es que cuando cierro mi propia aplicación WinForm, también se cierra PowerPoint. – akif
Sí, es normal que se cierre cuando cierras tu WinForm porque cualquier objeto que no se pudo liberar es finalmente lanzamiento d cuando el tiempo de ejecución se derriba. Puede intentar llamar a los finalizadores GC.Collect() y GC.WaitForPending() DOS VECES. Esto no debería importar si no está usando VSTO, pero no puede doler. Tienes que pensar en qué otras variables están en juego aquí ... (Ver el siguiente comentario) –
Debes pensar en qué otras variables están en juego aquí y soltarlas. P. ej .: (1) ¿Hay alguna otra variable estática en alguna parte? (2) ¿Qué hace su llamada InitializeCompany (ref comp, ppPres.Slides [slide])? Si almacena una referencia a una diapositiva de PowerPoint dentro del objeto de su compañía, entonces esta llamada junto con companies.Add (comp) creará una referencia permanente a una referencia de PowerPoint. Estos se deben cortar usando una llamada a Marshal.FinalReleaseComObject() o de lo contrario, PowerPoint se bloqueará. No sé si esto es lo que está sucediendo, pero debe liberar * TODAS * sus referencias de PowerPoint. –