2012-10-23 12 views
1

我有一个C#程序使用Excel Interop创建,写入和保存Excel文件。问题是,如果我没有应用程序在保存并关闭excel文件后立即退出,那么c#应用程序会得到未处理的异常并崩溃。有没有人找到办法做到这一点,而能够保持主机C#应用程序打开并运行。从Microsoft Excel Interop断开连接而不会崩溃主机C#程序

这里是处理一切涉及Excel的互操作

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); 
     } 

    } 
} 
+1

这当然有可能,我已经做了好几次了。你可以发布你的代码吗? – mfeingold

+0

你有什么异常? – RBarryYoung

+0

我也做了很多很多次。不幸的是,Excel不会返回有用的错误代码(只是隐藏所有其他代码的一个大的通用错误代码)。这个问题很可能与Excel本身,但几乎不可能诊断确切的问题。 – JDB

回答

1

我发现用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);