從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