2013-03-27 14 views
13

Utknąłem na tym przez wiele dni i pomimo całej pomocy tam, żadne z tych rozwiązań nie działa dla mnie. Chcę utworzyć plik Excel z biblioteki EPPlus z kilkoma podstawowymi danymi, które pobieram z procedury składowanej. Jest to kod, który mam w moim pliku ExportDocument.cs:Pisanie pliku Excel w 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; 
     } 

    } 

Wszystkie skomentował kod jest różne rzeczy, które znalazłem w internecie, aby spróbować. Zwróć uwagę, że jest to organizacja szkolna, a my nie używamy MVC. Mam następnie przy użyciu kodu za pliku ciągnąć tę metodę tak:

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

Znowu pamiętać, że wszystkie skomentował kod jest rzeczy, które znalazłem z różnych źródeł, które nie pracowały.

Nie otrzymuję żadnych błędów, ale gdy klikam przycisk na mojej aplikacji, aby wykonać kod za metodą, nic się nie dzieje. Trwa ładowanie i trwa, ale nie ma żadnych plików, nic się nie otwiera. Po raz pierwszy użyłem EPPlus i nie jestem w pełni zaznajomiony z eksportowaniem programów programistycznych, więc czuję się tutaj zagubiony.

Czy są jakieś sugestie, które macie? Byłbym szczęśliwy, mogąc wyjaśnić wszelkie punkty, których również nie dotknąłem w pełni.

+0

zadeklarowałeś 'ścieżkę', ale nie widzę, żeby była używana w kodzie (ignorując skomentowane bity). Jak mówisz pakiet excelpackage, aby zapisać go w lokalizacji? –

+0

zmienna ścieżki obecnie nie jest używana. Sposób, w jaki jest teraz napisany, to obiekt pakietu ExcelPackage używa jego metody zapisu, a następnie wywołuję ten pakiet ExcelPackage w pliku codebehind, w którym zapisuję go za pomocą Response.BinaryWrite (byte [] arr). To była ostatnia metoda, którą wypróbowałem. Dzięki temu nie ma potrzeby stosowania ścieżki. – Rahlord

+0

Ponadto próbowałem zapisać plik na ścieżce, a następnie otwierając go stamtąd, ale w końcu otrzymałem ten sam problem, który mam teraz. Plik nigdy nie został utworzony, a mój kod nie zbombardował ani nie pomógł. – Rahlord

Odpowiedz

22

Czy obejrzałeś próbki dostarczone z EPPlus?

Ten pokazuje jak utworzyć plik http://epplus.codeplex.com/wikipage?title=ContentSheetExample

Ten pokazuje, jak używać go do strumienia z powrotem plik http://epplus.codeplex.com/wikipage?title=WebapplicationExample

ten sposób możemy skorzystać z pakietu, aby wygenerować plik.

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

Nie trzeba wywoływać funkcji xlPackage.Dispose() przed zakończeniem używania bloku, ponieważ celem bloku używanego jest wywołanie metody dispose na obiekcie utworzonym w nawiasach. –

+0

To prawda, ale zostało to uszczypnięte od przykładów. – Dreaddan

+1

Użyj metody "SaveAs (FileInfo)", aby zapisać do nowej lokalizacji. Nadpisuje również, czy nazwa pliku już istnieje, w przeciwieństwie do metody "Save", która wyrzuca. Przykład: http://stackoverflow.com/a/38036089 – nawfal

10

Najlepiej gdybyś pracował z DataSet S i/lub DataTable s. Kiedy już, że idealnie prosto z procedury przechowywanej z imion dla nagłówków kolumn, można użyć następującej metody:

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

.. która będzie produkować piękny excelsheet z ładnym stole!

Teraz służyć plik, zakładając, że masz obiekt ExcelPackage jak w kodzie powyżej nazwie 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

Jeśli masz zbiór obiektów, które załadować za pomocą procedury przechowywanej można również użyć 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(); 
} 
Powiązane problemy