从Microsoft Excel Interop断开而不会崩溃主机C#程序

我有一个C#程序,使用Excel Interop创build,写入和保存Excel文件。 问题是,如果我没有应用程序保存并closuresExcel文件后立即退出,那么C#应用程序将得到一个未处理的exception并崩溃。 有没有人find办法做到这一点,而能够保持主机C#应用程序打开并运行。

以下是处理涉及Excel Interop的所有内容的代码

class CreateExcelDoc { string newFormString = trialReportForm.newFormString; string fileString=trialReportForm.fileString; int sheetCount; string trialString = trialReportForm.trialString; string dateString = trialReportForm.dateString; string saveString = trialReportForm.saveSting; System.Windows.Forms.Timer excelTimer = new System.Windows.Forms.Timer(); private Excel.Application app = null; private Excel.Workbook workbook = null; private Excel.Worksheet worksheet = null; private Excel.Range workSheet_range = null; public CreateExcelDoc() { createDoc(); } public void createDoc() { try { app = new Excel.Application(); //app.Visible = false; if (startForm.exportOwnerString == "Yes") { app.Visible = true; startForm.exportOwnerString = " "; } else { app.Visible = false; } if (startForm.excelActionFlag=="addNewTrialReport") { workbook = (Excel.Workbook) app.Workbooks.Add(1); //workbook.SaveAs(newFileForm.desktopPath + "\\" + "OB "+trialReportForm.otrClubNameString+" - "+trialReportForm.otrDateString); worksheet = (Excel.Worksheet)workbook.Worksheets[1]; //fileNameString = newFileForm.desktopPath + "\\OB " + trialReportForm.otrClubNameString + " " + trialReportForm.otrDateString; workbook.Worksheets[1].Name = trialReportForm.trialReportDate+" Trial "+trialReportForm.trialReportTrialNumber; } else if (startForm.excelActionFlag == "ownerContacts") { workbook = (Excel.Workbook)app.Workbooks.Add(1); worksheet = (Excel.Worksheet)workbook.Worksheets[1]; workbook.Worksheets[1].Name = "Owner Contacts"; } else if (startForm.excelActionFlag == "newExcelResults") { string testFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\test"; workbook = (Excel.Workbook)app.Workbooks.Add(1); worksheet = (Excel.Worksheet)workbook.Worksheets[1]; workbook.Worksheets[1].Name = "Event 1 Results"; //workbook.SaveAs(testFile, Missing.Value, Missing.Value, Missing.Value, false); //workbook.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"\\Results", Missing.Value, Missing.Value, Missing.Value, false); //workbook.SaveAs(startForm.excelFileLocation, Missing.Value, Missing.Value, Missing.Value, false); //fileNameString = registrationForm.regFileLocation + "\\OB " + registrationForm.regClubName + " " + registrationForm.regDateString; } else if (dogForm.dogRegistrationExcel == "Yes") { workbook = (Excel.Workbook)app.Workbooks.Add(1); workbook.SaveAs(dogForm.filePath, Missing.Value, Missing.Value, Missing.Value, false); } else if (newFormString == "No") { //workbook = app.Workbooks.Open(fileString, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); // workbook.Close(true,fileString,Missing.Value); workbook = (Excel.Workbook)app.Workbooks.Open(fileString, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); } if (newFormString=="Yes"&registrationForm.formString=="OTR") { //string sheetName = "Trial Report - " + dateString + " " + trialString; worksheet = (Excel.Worksheet)workbook.Worksheets[1]; workbook.Worksheets[1].Name =trialReportForm.otrDateString+" Trial " + trialReportForm.otrTrialString; //workbook.Worksheets[1].Name = "Trial Report - " + dateString + " " + trialString; //workbook.Worksheets[1].Name = "Hello"; //Excel.Name name1 = worksheet.Names.Add("Trial Report - " + dateString + " " + trialString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //worksheet.Name = "Trial Report - " + dateString + " " + trialString; } else if (newFormString == "Yes" & registrationForm.formString == "Registration") { //string sheetName = "Trial Report - " + dateString + " " + trialString; worksheet = (Excel.Worksheet)workbook.Worksheets[1]; workbook.Worksheets[1].Name = "Results: "+registrationForm.selectedEvent; //workbook.Worksheets[1].Name = "Trial Report - " + dateString + " " + trialString; //workbook.Worksheets[1].Name = "Hello"; //Excel.Name name1 = worksheet.Names.Add("Trial Report - " + dateString + " " + trialString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //worksheet.Name = "Trial Report - " + dateString + " " + trialString; } else if (startForm.excelActionFlag == "addExistingTrialReport") { workbook = (Excel.Workbook)app.Workbooks.Open(startForm.excelFileLocation, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); sheetCount = workbook.Worksheets.Count; int sheetCountPlusONe=sheetCount+1; worksheet = (Excel.Worksheet)workbook.Worksheets.Add(Missing.Value,workbook.Worksheets[sheetCount],Missing.Value,Missing.Value); workbook.Worksheets[sheetCountPlusONe].Name = trialReportForm.trialReportDate + " Trial " + trialReportForm.trialReportTrialNumber; //worksheet.Move(Missing.Value, workbook.Worksheets[sheetCount]); } else if (startForm.excelActionFlag == "existingExcelResults") { workbook = (Excel.Workbook)app.Workbooks.Open(startForm.excelFileLocation, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); sheetCount = workbook.Worksheets.Count; int sheetCountPlusONe = sheetCount + 1; worksheet = (Excel.Worksheet)workbook.Worksheets.Add(Missing.Value, workbook.Worksheets[sheetCount], Missing.Value, Missing.Value); workbook.Worksheets[sheetCountPlusONe].Name = "Event " + sheetCountPlusONe.ToString() + " Results"; //worksheet.Move(Missing.Value, workbook.Worksheets[sheetCount]); } else if (dogForm.dogRegistrationExcel == "Yes") { worksheet = (Excel.Worksheet)workbook.Worksheets[1]; workbook.Worksheets[1].Name = dogForm.dogUKCNumber; } } catch (Exception e) { Console.Write("Error"); } /* if (trialReportForm.saveMe=="Yes") { workbook.Save(); workbook.Close(); } */ } public void createHeaders(int row, int col, string htext, string cell1, string cell2, int mergeColumns, string b, bool font, int size, string fcolor) { worksheet.Cells[row, col] = htext; workSheet_range = worksheet.get_Range(cell1, cell2); workSheet_range.Merge(mergeColumns); switch (b) { case "BLUE": workSheet_range.Interior.Color = System.Drawing.Color.Red.ToArgb(); break; case "GAINSBORO": workSheet_range.Interior.Color = System.Drawing.Color.Gainsboro.ToArgb(); break; //case "Turquoise": // workSheet_range.Interior.Color = //System.Drawing.Color.Turquoise.ToArgb(); //break; case "PeachPuff": workSheet_range.Interior.Color = System.Drawing.Color.PeachPuff.ToArgb(); break; default: // workSheet_range.Interior.Color = System.Drawing.Color..ToArgb(); break; } //workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb(); //workSheet_range.Borders = null; workSheet_range.Font.Bold = font; workSheet_range.ColumnWidth = size; //workSheet_range.HorizontalAlignment = ContentAlignment.BottomCenter; if (startForm.excelActionFlag == "existingExcelResults" | startForm.excelActionFlag=="newExcelResults") { workSheet_range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter; } //workSheet_range.Cells.HorizontalAlignment = ContentAlignment.MiddleCenter; workSheet_range.Font.Color = System.Drawing.Color.FloralWhite.ToArgb(); } public void addData(int row, int col, string data, string cell1, string cell2, string format) { worksheet.Cells[row, col] = data; workSheet_range = worksheet.get_Range(cell1, cell2); //workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb(); workSheet_range.NumberFormat = format; workSheet_range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft; excelTimer.Tick += new EventHandler(excelTimer_Tick); excelTimer.Interval = 6000; excelTimer.Start(); } void excelTimer_Tick(object sender, EventArgs e) { if (startForm.excelActionFlag != "ownerContacts") { if (startForm.excelActionFlag == "existingExcelResults" | startForm.excelActionFlag == "newExcelResults") { /* Excel.Range sortRange; sortRange = worksheet.get_Range("A14", "K32"); Excel.Range scoreColumn; scoreColumn = worksheet.get_Range("C14", "C32"); sortRange.Sort(scoreColumn, Excel.XlSortOrder.xlDescending);*/ Excel.Range valueRange; Excel.Range placeRange; placeRange = worksheet.get_Range("A14", "A" + (14 + (registrationForm.numberofCompetitors - 1)).ToString()); valueRange = worksheet.get_Range("A14", "K"+(14+(registrationForm.numberofCompetitors-1)).ToString()); valueRange.Sort(valueRange.Columns[3, Type.Missing], Excel.XlSortOrder.xlDescending, Type.Missing, Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal); placeRange.Sort(placeRange.Columns[1, Type.Missing], Excel.XlSortOrder.xlAscending, Type.Missing, Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal); } // workbook.Close(true, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Results.xls", Missing.Value); workbook.Close(true, startForm.excelFileLocation, Missing.Value); app.Quit(); Application.Exit(); /* workSheet_range = null; worksheet = null; workbook = null; app = null;*/ //Thread.Sleep(5000); // File.Move(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Results.xls", startForm.excelFileLocation); } } } 

我发现当用excel保存时,使用SaveAs方法有更多的运气。 例如:

  private static Microsoft.Office.Interop.Excel.Application xlApp = null; private static Microsoft.Office.Interop.Excel.Workbook xlWb = null; private static Microsoft.Office.Interop.Excel.Worksheet xlWs = null; //Your code and operations xlWb.SaveAs(filePath, XlFileFormat.xlExcel8, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); xlApp.Quit(); Marshal.ReleaseComObject(xlWs); Marshal.ReleaseComObject(xlWb); Marshal.ReleaseComObject(xlApp); 

包括我的几个解决scheme介绍如何正确清理Excel互操作对象?

你可以select最严格的(杀灭Excel过程)更多的招标解决scheme(释放COM对象)