从C#WinForms应用程序嘿,我自动化PowerPoint和Excel;我所做的是从PowerPoint中读取幻灯片并将它们保存在Excel中,然后退出这两个应用程序。 Excel成功退出,但PowerPoint不会退出。问题是当我第一次转换它不退出时,但是当我再次转换它时。PowerPoint中通过C#推出不退出
这里是我的代码
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();
}
嘿迈克感谢,但这个没有一件事我想告诉你的是,当我关闭自己的WinForm应用程序时,PowerPoint也会关闭。 – akif 2009-06-11 16:32:59
是的,关闭WinForm时关闭它是正常的,因为任何你释放的对象都是终于发布d当运行时间被拆除时。 你可以尝试调用GC.Collect()和GC.WaitForPending()终结器TWICE。如果你不使用VSTO,这应该不重要,但它不会受到伤害。 您需要考虑其他变量在这里玩什么......(请参阅下一条评论。) – 2009-06-11 17:41:26
您需要考虑其他变量在此处播放的内容,并释放它们。例如: (1)有没有其他的静态变量在任何地方? (2)你的InitializeCompany(ref comp,ppPres.Slides [slide])调用是做什么的?如果它在公司对象中存储对PowerPoint幻灯片的引用,则此调用将与companies.Add(comp)一起创建对PowerPoint引用的永久引用。这些必须通过调用Marshal.FinalReleaseComObject()来切断,否则PowerPoint将挂起。我不知道这是发生了什么,但是您需要释放*所有*您的PowerPoint引用。 – 2009-06-11 17:44:53