2013-03-27 3 views
13

저는 며칠 동안이 일에 매달 렸습니다. 모든 도움이 있었지만,이 솔루션들 중 아무 것도 저에게 효과가 없었습니다. 내가하고 싶은 일은 EPPlus 라이브러리를 사용하여 저장 프로 시저에서 가져 오는 몇 가지 기본 데이터가있는 Excel 파일을 만드는 것입니다.EPPlus에 Excel 파일 작성하기

public static ExcelPackage CreateExcelDocument(int [] arr) 
    { 
     String path = @"D:\temp\testsheet3.xlsx"; 
     //FileInfo newFile = null; 
     /*if (!File.Exists(path + "\\testsheet2.xlsx")) 
      newFile = new FileInfo(path + "\\testsheet2.xlsx"); 
     else 
      return newFile;*/ 
     using (ExcelPackage package = new ExcelPackage()) 
     { 
      ExcelWorksheet ws = package.Workbook.Worksheets.Add("testsheet"); 

      ws.Cells["B1"].Value = "Number of Used Agencies"; 
      ws.Cells["C1"].Value = "Active Agencies"; 
      ws.Cells["D1"].Value = "Inactive Agencies"; 
      ws.Cells["E1"].Value = "Total Hours Volunteered"; 
      ws.Cells["B1:E1"].Style.Font.Bold = true; 

      int x = 2; 
      char pos = 'B'; 
      foreach (object o in arr) 
      { 
       String str = pos + x.ToString(); 
       ws.Cells[str].Value = o.ToString(); 
       if (pos > 'E') 
       { 
        pos = 'B'; 
        x++; 
       } 

       pos++; 
      } 
      //newFile.Create(); 
      //newFile.MoveTo(@"C:/testSheet.xlsx"); 
      //package.SaveAs(newFile); 
      package.Save(); 
      /*Stream stream = File.Create(path); 
      package.SaveAs(stream); 
      stream.Close();*/ 

      //byte[] data = File.ReadAllBytes(path); 
      //byte[] bin = package.GetAsByteArray(); 
      //String path = Path.GetTempPath(); 
      //File.WriteAllBytes(path, bin); 
      //File.WriteAllBytes(path + "testsheet.xlsx", bin); 
      //HttpContext.Current.Response.Write("<script>alert('"+ temp + "');</script>"); 
      //System.Diagnostics.Process.Start(path + "\\testsheet.xlsx"); 

      return package; 
     } 

    } 

모든 주석 코드는 내가하려고 인터넷에서 발견 한 여러 가지이다 : 이것은 내 ExportDocument.cs 파일에있는 코드입니다. 이것은 학교 조직이며 MVC를 사용하지 않습니다. 나는 다음과 같이이 방법을 끌어 파일 뒤에 코드를 사용하고 있습니다 :

protected void GenerateReport(Object o, EventArgs e) 
    { 
     //NamingContainer.FindControl("ReportsControl").Visible = false; 
     //NamingContainer.FindControl("ReportsGenerateControl").Visible = true; 
     Session["reportSession"] = ddReport.SelectedItem.Value.ToString(); 


     int [] arr = new int [ReportRepository.GetAgencyCounts().Count]; 
     ReportRepository.GetAgencyCounts().CopyTo(arr, 0); 

     ExcelPackage pck = ExportDocument.CreateExcelDocument(arr); 
     /*try 
     { 
      byte [] data = ExportDocument.CreateExcelDocument(arr).GetAsByteArray(); 
      Response.Clear(); 
      Response.Buffer = true; 
      Response.BinaryWrite(data); 
      Response.AddHeader("content-length", data.Length.ToString()); 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

      Response.Flush(); 
      Response.Close(); 
      Response.End(); 
     } 
     catch (Exception ex) { }*/ 

     /*var stream = new MemoryStream(); 
     pck.SaveAs(stream); 

     String filename = "myfile.xlsx"; 
     String contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     var cd = new System.Net.Mime.ContentDisposition 
     { 
      Inline = false, 
      FileName = filename 
     }; 
     Response.AppendHeader("Content-Disposition", cd.ToString()); 
     stream.Position = 0; 

     return File(stream, contentType, filename);*/ 

     /*Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name); 
     Response.TransmitFile(Path.GetFullPath(file.Name)); 
     Response.Flush(); 
     Response.Close();*/ 

     /*Response.ClearHeaders(); 
     Response.BinaryWrite(pck.GetAsByteArray()); 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader("content-disposition", "attachment; filename=Sample2.xlsx"); 
     Response.Flush(); 
     Response.Close();*/ 
    } 

가 다시 모든 주석 코드가 내가 근무 한 적이없는 다양한 소스에서 발견 한 것들 있습니다.

그래서 오류가 발생하지 않지만 응용 프로그램에서 코드 숨김 메서드를 실행하기 위해 단추를 클릭해도 아무 일도 일어나지 않습니다. 로드 중이고 실행되지만 생성 된 파일이 없으며 아무것도 열리지 않습니다. EPPlus를 처음 사용하는 것은 이번이 처음이며 프로그래밍 방식으로 Excel을 내보내는 데 익숙하지 않아서 여기에서 길을 잃은 느낌이 듭니다.

의견이 있으십니까? 나는 내가 완전히 쳤지 않은 점을 분명히 밝혀 줄 것이다.

+0

당신은'path'를 선언했지만 코드에서 사용 된 것을 볼 수 없습니다 (주석 처리 된 비트는 무시함). 어떻게 그것을 excel 패키지에 저장하라는 말입니까? –

+0

경로 변수가 현재 사용되지 않습니다. 지금 작성되는 방식은 ExcelPackage 패키지 객체가 save 메서드를 사용하고 나서 Response.BinaryWrite (byte [] arr)를 사용하여 코드 비헤이비어 파일에서 ExcelPackage를 호출하는 것입니다. 그것은 어쨌든 시도한 마지막 방법이었습니다. 이를 사용하면 경로가 필요 없습니다. – Rahlord

+0

또한 경로에 파일을 저장 한 다음 거기에서 열어 보았지만 지금은 동일한 문제가 발생했습니다. 파일이 만들어지지 않았고 코드가 폭탄이나 오류가 없었습니다. – Rahlord

답변

22

EPPlus와 함께 제공되는 샘플을 보았습니까?

이 사람은 어떻게이 일이 우리가 파일을 생성하기 위해 패키지를 사용하는 방법이있는 파일 http://epplus.codeplex.com/wikipage?title=WebapplicationExample

을 다시 스트리밍을 사용하는 방법을 보여줍니다 파일 http://epplus.codeplex.com/wikipage?title=ContentSheetExample

를 만드는 방법을 보여줍니다.

var newFile = new FileInfo(ExportFileName); 
using (ExcelPackage xlPackage = new ExcelPackage(newFile)) 
{      
    // do work here        
    xlPackage.Save(); 
} 
+0

블록을 사용하기 전에 xlPackage.Dispose()를 호출 할 필요가 없습니다. 왜냐하면 사용중인 블록의 목적은 괄호로 작성된 객체에서 dispose 메소드를 호출하기 때문입니다. –

+0

사실, 그러나 그것은 예제에서 집어 넣었습니다. – Dreaddan

+1

'SaveAs (FileInfo)'메소드를 사용하여 새로운 위치에 저장하십시오. 또한 throw하는'Save' 메소드와 달리 파일 이름이 이미 존재한다면 덮어 씁니다. 예 : http://stackoverflow.com/a/38036089 – nawfal

10

당신이 DataSet의 및/또는 DataTable의 일한 경우가 가장 좋습니다. 당신은 헤더에 대한 적절한 열 이름과, ​​그 이상적으로 바로 저장 프로 시저에서 한 후에는 다음과 같은 방법을 사용할 수 있습니다 : 편안한 테이블과 아름다운 excelsheet를 생성합니다

ws.Cells.LoadFromDataTable(<DATATABLE HERE>, true, OfficeOpenXml.Table.TableStyles.Light8);

..! 당신은 당신이 또한 LoadFromCollection를 사용할 수있는 저장 프로 시저를 사용하여로드 개체의 컬렉션이있는 경우 지금

Response.Clear(); 

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
Response.AddHeader("Content-Disposition", "attachment;filename=" + sFilename); 

Response.BinaryWrite(pck.GetAsByteArray()); 
Response.End(); 
5

.. 위 pck라는 코드에서 같은 ExcelPackage 개체가 가정, 당신의 파일을 제공합니다 .

using (ExcelPackage package = new ExcelPackage(file)) 
{ 
    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("test"); 

    worksheet.Cells["A1"].LoadFromCollection(myColl, true, OfficeOpenXml.Table.TableStyles.Medium1); 

    package.Save(); 
}