2013-03-27 60 views
13

Tôi đã bị mắc kẹt trong điều này trong nhiều ngày và mặc dù tất cả các trợ giúp trên mạng, không có giải pháp nào trong số này đã làm việc cho tôi. Những gì tôi muốn làm là tạo ra một tập tin excel bằng cách sử dụng thư viện EPPlus với một số dữ liệu cơ bản trong nó mà tôi đang kéo từ một thủ tục được lưu trữ. Đây là mã mà tôi có trong tệp ExportDocument.cs của mình:Viết một tệp Excel trong EPPlus

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

    } 

Tất cả mã nhận xét là những thứ khác nhau mà tôi đã tìm thấy trên internet để thử. Lưu ý rằng đây là một tổ chức trường học và chúng tôi không sử dụng MVC. Sau đó tôi sử dụng mã phía sau tệp để kéo phương thức này như sau:

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();*/ 
    } 

Một lần nữa lưu ý rằng tất cả mã nhận xét là những thứ tôi đã tìm thấy từ nhiều nguồn khác nhau.

Vì vậy, tôi không nhận được bất kỳ lỗi nào nhưng khi tôi nhấp vào nút trên ứng dụng của tôi để thực thi mã đằng sau phương pháp, không có gì đang xảy ra. Nó đang tải và nó chạy qua nhưng không có tệp nào được tạo, không có gì đang mở ra. Đây là lần đầu tiên tôi sử dụng EPPlus và tôi không hoàn toàn quen thuộc với việc xuất khẩu những thứ để xuất sắc để tôi cảm thấy bị lạc ở đây.

Có đề xuất nào cho các bạn không? Tôi sẽ vui lòng làm rõ bất kỳ điểm nào mà tôi chưa đạt được.

+0

bạn đã khai báo một 'đường dẫn', nhưng tôi không thấy nó được sử dụng trong mã (bỏ qua các bit nhận xét). Làm thế nào bạn nói excelpackage để lưu nó vào một vị trí? –

+0

biến đường dẫn hiện không được sử dụng. Cách nó được viết bây giờ, nó là đối tượng gói ExcelPackage đang sử dụng phương pháp lưu của nó và sau đó tôi gọi ExcelPackage trong tệp codebehind nơi tôi đang viết nó ra bằng cách sử dụng Response.BinaryWrite (byte [] arr). Đó là phương pháp cuối cùng tôi đã thử anyway. Bằng cách đó, không cần một con đường. – Rahlord

+0

Ngoài ra, tôi cũng đã thử lưu tệp vào một đường dẫn và sau đó mở nó từ đó nhưng tôi đã nhận được cùng một vấn đề tôi đang có bây giờ. Tệp không bao giờ được tạo và mã của tôi không bị đánh bom hoặc lỗi ra – Rahlord

Trả lời

22

Bạn đã xem các mẫu được cung cấp với EPPlus chưa?

một này cho bạn thấy làm thế nào để tạo ra một tập tin http://epplus.codeplex.com/wikipage?title=ContentSheetExample

một này cho bạn thấy làm thế nào để sử dụng nó để truyền lại một tập tin http://epplus.codeplex.com/wikipage?title=WebapplicationExample

Đây là cách chúng ta sử dụng gói để tạo ra một tập tin.

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

Bạn không cần phải gọi xlPackage.Dispose() trước khi kết thúc sử dụng khối, vì toàn bộ mục đích của khối sử dụng là gọi phương thức vứt bỏ trên một đối tượng được tạo trong dấu ngoặc đơn. –

+0

Đúng, tuy nhiên nó đã bị chèn ép từ các ví dụ. – Dreaddan

+1

Sử dụng phương thức 'SaveAs (FileInfo)' để lưu vào một vị trí mới. Nó cũng ghi đè nếu tên tập tin đã tồn tại, không giống như phương thức 'Save' mà ném. Ví dụ: http://stackoverflow.com/a/38036089 – nawfal

10

Đó là tốt nhất nếu bạn làm việc với DataSet s và/hoặc DataTable s. Một khi bạn đã có, lý tưởng thẳng từ thủ tục lưu trữ của bạn với tên cột thích hợp cho tiêu đề, bạn có thể sử dụng các phương pháp sau đây:

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

.. mà sẽ tạo ra một excelsheet xinh đẹp với một bảng tốt đẹp!

Bây giờ để phục vụ tập tin của bạn, giả sử bạn có một đối tượng ExcelPackage như trong mã của bạn ở trên gọi là pck ..

Response.Clear(); 

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

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

Nếu bạn có một bộ sưu tập của các đối tượng mà bạn tải sử dụng thủ tục lưu trữ, bạn cũng có thể sử dụng LoadFromCollection .

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(); 
} 
Các vấn đề liên quan