2013-03-27 53 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'を宣言しましたが、(コメントされたビットを無視して)コードでは使用されていません。あなたはそれをある場所に保存するようにエクセルパッケージにどのように伝えていますか? –

+0

パス変数は現在使用されていません。 ExcelPackageパッケージオブジェクトはsaveメソッドを使用しています。次に、Response.BinaryWrite(byte [] arr)を使用してコードビハインドファイルでExcelPackageを呼び出しています。それはとにかく試した最後の方法でした。これを使用すると、パスは必要ありません。 – Rahlord

+0

また、ファイルをパスに保存してそこから開こうとしましたが、今問題が発生しました。ファイルは決して作成されず、私のコードは爆弾やエラーではありませんでした。 – Rahlord

答えて

22

EPPlusで提供されたサンプルを見ましたか?

この1つは、あなたがどのようにこの1つはあなたが私たちがファイルを生成するためにパッケージを使用する方法これは、ファイル 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

使用ブロックの目的は、かっこ内に作成されたオブジェクトのdisposeメソッドを呼び出すためです。xlPackage.Dispose()を使用ブロックの前に呼び出す必要はありません。 –

+0

真実ですが、例からはずされました。 – Dreaddan

+1

'SaveAs(FileInfo)'メソッドを使用して、新しい場所に保存します。スローする 'Save'メソッドとは異なり、ファイル名が既に存在する場合は上書きします。例:http://stackoverflow.com/a/38036089 – nawfal

10

あなたはDataSet sおよび/またはDataTable秒で働いていた場合には最適です。

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

...素敵なテーブルと美しいexcelsheetが生成されます:あなたは理想的なストレートヘッダの適切な列名を使用してストアドプロシージャから、ということをしたら、以下の方法を使用することができます!あなたは、あなたがまた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(); 
} 
関連する問題