2013-03-27 63 views
13

我一直坚持这几天,尽管有所有的帮助,但这些解决方案都没有为我工作。我想要做的是使用EPPlus库创建一个Excel文件,其中包含我从存储过程中提取的一些基本数据。这是我在我的ExportDocument.cs文件中的代码:在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; 
     } 

    } 

所有注释代码是,我发现在互联网上尝试不同的东西。请注意,这是一个学校组织,我们没有使用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,而且我并不完全熟悉以编程的方式导出出色的东西,所以我觉得迷失在这里。

你们有什么建议吗?我很乐意澄清我还没有完全达成的任何观点。

+0

你已经声明了一个'path',但我没有看到它在代码中使用(忽略注释的位)。你如何告诉excelpackage将其保存到某个位置? – 2013-03-27 03:19:08

+0

当前路径变量未被使用。现在写的方式是,ExcelPackage包对象正在使用其保存方法,然后我在使用Response.BinaryWrite(byte [] arr)将其写出的代码隐藏文件中调用该ExcelPackage。这是我试过的最后一种方法。使用它,不需要路径。 – Rahlord 2013-03-27 03:37:53

+0

此外,我还尝试将文件保存到路径,然后从那里打开它,但我最终得到了我现在遇到的相同问题。该文件从来没有创建,我的代码没有弹出或错误 – Rahlord 2013-03-27 03:38:36

回答

22

你看过EPPlus提供的样品吗?

这一次向您展示如何创建一个文件 http://epplus.codeplex.com/wikipage?title=ContentSheetExample

这一次向您展示如何使用它流回文件 http://epplus.codeplex.com/wikipage?title=WebapplicationExample

这是我们如何使用程序包生成一个文件。

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

在使用块结束之前,不需要调用xlPackage.Dispose(),因为使用块的全部用途是对在括号中创建的对象调用dispose方法。 – 2013-12-24 18:20:39

+0

确实如此,但是它是从示例中捏造的。 – Dreaddan 2013-12-27 13:46:15

+1

使用'SaveAs(FileInfo)'方法保存到新的位置。它也会覆盖如果文件名已经存在,不像'Save'方法抛出。示例:http://stackoverflow.com/a/38036089 – nawfal 2016-06-26 07:20:03

10

这是最好的,如果你有DataSet S和/或DataTable帮过。一旦你的,从您的存储过程非常直,页眉适当的列名,可以用下面的方法:

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

..这将产生一个美丽的excelsheet用一个漂亮的表!

现在提供给您的文件,假设你有一个ExcelPackage对象在上面的代码名为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

如果您加载使用存储过程,你也可以使用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(); 
}