2014-02-23 2 views
2

다음 데이터를 Excel로 내보내려면 example을 사용하고 있습니다.Microsoft.Office.Interop.Excel 내보내기를 사용할 때 Excel이 닫힙니다.

&을 Excel 파일로 내보낼 수 있도록이 코드를 수정했지만 Excel 파일을 제대로 닫으면 잘 모르겠지만 두 번째 질문은 그와 같은 필요성이있는 경우입니다. 모든 가비지 수집 등을 처리하십시오. , 올바른지 또는 더 좋은 방법이 있는지 알려주십시오.

static void DisplayInExcel(DataSet ds) 
    { 
     var excelApp = new Excel.Application(); 
     // Make the object visible. 
     excelApp.Visible = true; 

     // Create a new, empty workbook and add it to the collection returned 
     // by property Workbooks. The new workbook becomes the active workbook. 
     // Add has an optional parameter for specifying a praticular template. 
     // Because no argument is sent in this example, Add creates a new workbook. 
     excelApp.Workbooks.Add(); 

     // This example uses a single workSheet. 
     // Excel._Worksheet workSheet = excelApp.ActiveSheet; 

     // Earlier versions of C# require explicit casting. 
     Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet; 

     // Establish column headings in cells A1 and B1. 
     workSheet.Cells[1, "B"] = "Date"; 
     workSheet.Cells[1, "C"] = "Title"; 
     workSheet.Cells[1, "D"] = "Details"; 

     DataTable dt = ds.Tables[0]; 
     var rowIndex = 2; // 1 = header row 
     foreach (DataRow row in dt.Rows) 
     { 
      // rowCount++; 
      workSheet.Cells[rowIndex, "B"] = row["Date"]; 
      workSheet.Cells[rowIndex, "C"] = row["Title"]; 
      workSheet.Cells[rowIndex, "D"] = row["Description"]; 
      rowIndex++; 
     } 


     workSheet.Range["A1", "D" + rowIndex + ""].AutoFormat(Excel.XlRangeAutoFormat.xlRangeAutoFormatColor2); 

     //Coloumn 1 
     workSheet.Range["A:A"].Cells.Font.Bold = true; 
     workSheet.Range["A:A"].ColumnWidth = 10; 
     workSheet.Range["A:A"].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; 
     //Column 2 
     workSheet.Range["B:B"].ColumnWidth = 14; 
     workSheet.Range["B:B"].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; 
     //workSheet.Range["A1", "A" + rowIndex + ""].Cells.Font.Bold = true; 


     ((Excel.Range)workSheet.Columns[3]).AutoFit(); 
     ((Excel.Range)workSheet.Columns[4]).AutoFit(); 

     string fileName = "Product_Excel.xls"; 
     excelApp.DisplayAlerts = false; 
     workSheet.SaveAs(HttpContext.Current.Server.MapPath("../"+fileName)); 


     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     excelApp.Quit(); 

    } 
+5

: 여기

try { //Use spreadsheet here. DisplayInExcel(ds) } catch { //Process errors } Close(); 

그리고 닫는 코드입니다 :

모든 예외를 잡을 후 당신이이 전화 확인 과학 기술. 이러한 API는 데스크톱 응용 프로그램 (Office 응용 프로그램 제품군)을 자동화하기 위해 작성되었습니다. 서버 응용 프로그램은 여러면에서 서로 다르므로 Office Interop을 사용하는 것이 매우 바람직하지 않습니다. 또한 Microsoft에서 지원하지 않으며 Office 라이선스를 위반할 수도 있습니다. [서버 측 서버 자동화 고려 사항] (http://support.microsoft.com/kb/257757) –

+0

@ JohnSaunders, 매우 잘 설명되어 있습니다. 나는 일을하는 전통적인 방식을 사용해야 할 것 같습니다. 나는 웹 서 버에서 시작한 것처럼 문제가 있다는 것에 동의한다. – Learning

+1

다른 방법이있다. 예를 들어, EPPPlus를보십시오. –

답변

0

여기 내 결론 문이 있습니다. ASP.NET 또는 다른 서버에서 Office 상호 운용성을 사용하는 끔찍한 생각이다

public void Close() 
{ 
    try 
    { 
     if (_workBook == null) 
     { 
      return; 
     } 
     _workBook.Save(); 
     _workBook.Close(false, FILENAME, null); 
     Marshal.ReleaseComObject(_workBook); 
     _excel.Quit(); 
     Marshal.ReleaseComObject(_excel); 
     _workBook = null; 
     _excel = null; 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     Logger("All done!"); 
    } 
    catch (Exception e) 
    { 
     Logger("Error in cleanup: " + e.ToString()); 
    } 
} 
관련 문제