2012-10-23 3 views
1

Excel Interop을 사용하여 Excel 파일을 작성, 작성 및 저장하는 C# 프로그램이 있습니다. 문제는 응용 프로그램을 저장하고 Excel 파일을 닫은 직후 종료하지 않으면 C# 응용 프로그램에서 처리되지 않은 예외가 발생하고 충돌이 발생한다는 것입니다. 누구든지 호스트 C# 응용 프로그램을 열고 실행하는 동안이 작업을 수행하는 방법을 발견 했습니까? 여기 호스트 C# 프로그램을 중단하지 않고 Microsoft 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); 
     } 

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

여러 솔루션을 제시 엑셀 상호 운용성과 관련된 모든 것을 처리하는 코드입니다 How do I properly clean up Excel interop objects?

당신은 더 부드러운 솔루션에 가장 베르 (살인 엑셀 과정) 중에서 선택할 수 있습니다

(COM 개체 해제)

+0

+1 좋은 출발점을 Microsoft.Office.Interop.Excel._Workbook.Close에서 (개체 SaveChanges를 (objSrc, IntPtr입니다 pCPCMD, 부울 & pfNeedsRelease 객체). –

관련 문제