Hey Ich automatisiere PowerPoint und Excel aus einer C# WinForms-Anwendung; Ich lese Folien aus PowerPoint und speichere sie in Excel und dann beide Apps. Excel wird erfolgreich beendet, PowerPoints wird jedoch nicht beendet. Das Problem ist, wenn ich das erste Mal konvertiere, wird es nicht beendet, aber wenn ich es wieder konvertiere, tut es das.PowerPoint gestartet über C# beendet nicht
Hier ist mein Code
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 Dank, aber dieses didn 't hat funktioniert. Eine Sache, die ich dir sagen will, ist, dass, wenn ich meine eigene WinForm-Anwendung schließe, auch die PowerPoint-Datei schließt. – akif
Ja, es ist normal, dass es heruntergefahren wird, wenn Sie WinForm schließen, weil alle Objekte, die Sie nicht freigeben konnten endlich freilassen d wenn die Laufzeit heruntergefahren wird. Sie könnten versuchen, GC.Collect() und GC.WaitForPending() Finalizer TWICE aufzurufen. Dies ist nicht wichtig, wenn Sie nicht VSTO verwenden, aber es kann nicht weh tun. Sie müssen darüber nachdenken, welche anderen Variablen hier spielen ... (Siehe nächsten Kommentar.) –
Sie müssen darüber nachdenken, welche anderen Variablen hier spielen, und sie freigeben. Zum Beispiel: (1) Gibt es irgendwo andere statische Variablen? (2) Was bewirkt Ihr Aufruf InitializeCompany (ref comp, ppPres.Slides [slide])? Wenn Sie einen Verweis auf eine PowerPoint-Folie innerhalb Ihres Unternehmensobjekts speichern, wird dieser Aufruf zusammen mit companies.Add (comp) einen permanenten Verweis auf eine PowerPoint-Referenz erstellen. Diese müssen durch einen Aufruf von Marshal.FinalReleaseComObject() getrennt werden, da sonst PowerPoint hängen bleibt. Ich weiß nicht, ob das so ist, aber Sie müssen * ALLE * Ihre PowerPoint-Referenzen veröffentlichen. –