2012-05-16 3 views
7

Microsoft Office Excel INTEROPを使用してC#DataTableをExcelファイルにエクスポートしようとしていますasp.net WebページからResponseオブジェクト。私はライブラリを使用してmemorystreamを生成することができますしかし、何とかファイルがメモリストリームを介して保存されていません。参照コードを以下に示します。 DocumentFormat.OpenXml.dll & WindowsBase.DLL(マイクロソフトのサイトからダウンロードできます)を参照する必要があります。サーバー上の物理ファイルを生成せずにASP.NETページからEXCELファイルをダウンロードする(オンザフライ)

問題を解決する方法を教えてください。 ? ?すべての

Private void DownloadFile() 
{ 
       DataSet objTable = ReadTableFromViewstate(); 
      if (objTable != null && objTable.Rows.Count > 0) 
      { 

       string strDownloadableFilename = "TestExcelFileName.xls"; 
       MemoryStream fs1 = new MemoryStream(); 
       if (CreateExcelFile.CreateExcelDocument(objTable, fs1)) 
       { 
        Response.Clear(); 
         byte[] data1 = new byte[fs1.Length]; 
         fs1.Read(data1, 0, data1.Length); 
         fs1.Close(); 

        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
        Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", strDownloadableFilename)); 
        Response.BinaryWrite(data1); ; 
        Response.End(); 

       } 
       else 
       { 
        LblErrorMessage.Text = "Error Exporting File."; 
       } 
      } 

     } 

..

public static bool CreateExcelDocument(DataSet ds, System.IO.Stream excelFileStream) 
    { 
     try 
     { 
      using (SpreadsheetDocument document = SpreadsheetDocument.Create(excelFileStream, SpreadsheetDocumentType.Workbook)) 
      { 
       CreateParts(ds, document); 
      } 

      Trace.WriteLine("Successfully created: " + excelFileStream); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine("Failed, exception thrown: " + ex.Message); 
      return false; 
     } 
    } 
.. 




private static void CreateParts(DataSet ds, SpreadsheetDocument document) 
     { 
      WorkbookPart workbookPart = document.AddWorkbookPart(); 
      Workbook workbook = new Workbook(); 
      workbookPart.Workbook = workbook; 

      // If we don't add a "WorkbookStylesPart", OLEDB will refuse to connect to this .xlsx file ! 

       WorkbookStylesPart workbookStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>("rIdStyles"); 
      Stylesheet stylesheet = new Stylesheet(); 

      workbookStylesPart.Stylesheet = stylesheet; 

      Sheets sheets = new Sheets(); 

      // Loop through each of the DataTables in our DataSet, and create a new Excel Worksheet for each. 
     uint worksheetNumber = 1; 
     foreach (DataTable dt in ds.Tables) 
     { 
      // For each worksheet you want to create 
      string workSheetID = "rId" + worksheetNumber.ToString(); 
      string worksheetName = dt.TableName; 

      WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(workSheetID); 
      WriteDataTableToExcelWorksheet(dt, worksheetPart); 

      Sheet sheet = new Sheet() { Name = worksheetName, SheetId = (UInt32Value)worksheetNumber, Id = workSheetID }; 
      sheets.Append(sheet); 

      worksheetNumber++; 
     } 

     workbook.Append(sheets); 
    } 
+0

タブ区切りにしてからユーザーに送信してみませんか? Excelで開きます。 –

+1

答えは実際にはありませんが、Excelファイルをすぐに作成するには[EPPLus](http://epplus.codeplex.com/releases/view/42439)をお勧めします。 http://stackoverflow.com/a/10547727/284240必要なのは 'Response.BinaryWrite(pck.GetAsByteArray());' –

+0

です。@James:提案をありがとう。しかし、私はその方法をしたくない、そうでなければ.csvファイルを生成することができた。 INTEROPを使用したいのですが、将来は、画像/グラフをExcelシートに追加する必要があります。 – Sankalp

答えて

3

おかげで、最後に、私は私の問題の解決策を手に入れました。このライン

    byte[] data1 = fs1.ToArray(); 

    byte[] data1 = new byte[fs1.Length]; 
        fs1.Read(data1, 0, data1.Length); 
        fs1.Close(); 

と私の問題は解決しました:私は次のコード行を置き換えます。

1

メモリストリームへの書き込みが終了したら、ポインタを元に戻してから読み込みます。

fs1.Seek(0, SeekOrigin.Begin);