2014-01-13 53 views
3

我目前正在編寫一個ASP.NET MVC 5控制器操作來將一些數據導出到Excel文件(使用我在這裏找到的一些代碼)。它工作...大多數。它輸出一個Excel文件,我可以打開它,但不能顯示以下錯誤消息之前:ASP.NET MVC Excel導出文件格式錯誤

「文件格式和'Export.xls'的擴展名不匹配。文件可能已損壞或不安全。除非你信任它的來源,不要打開它,你還想打開它嗎?「

我繼續選擇「是」,然後打開。我可以將它重新保存在我的機器上並打開該文件,但我沒有收到錯誤信息。它在其他方面工作正常,唯一的另一個奇怪之處在於,文件的網格線格式不同於Excel文件的格式,幾乎更像HTML表格而不是Excel表格。然而,奇怪的錯誤信息不是在這裏可以接受的,所以我必須解決它。

這裏是我的代碼:

public void ExportExcel() 
{ 
    // DataObject is a class that fetches the data for this method 
    DataObject dataObj = new DataObject(); 
    var grid = new GridView(); 

    // dataObj.GetDataList returns a List<T> of data model class objects 
    grid.DataSource = dataObj.GetDataList(); 
    grid.DataBind(); 

    Response.ClearContent(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition", "attachment; filename=Export.xls"); 
    Response.ContentType = "application/vnd.ms-excel"; 
    Response.Charset = ""; 

    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    grid.RenderControl(htw); 

    byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString()); 
    MemoryStream s = new MemoryStream(byteArray); 
    StreamReader sr = new StreamReader(s, Encoding.ASCII); 

    Response.Write(sr.ReadToEnd()); 
    Response.End(); 

} 

我已經嘗試設置Response.ContentType爲其他值( 「應用程序/ EXCEL」, 「應用程序/ MS-Excel的」),但沒有成功。一般來說,我對ASP.NET和C#有點新鮮,所以可能會有一些我在這裏丟失或做錯的地方;我更習慣於PHP和Zend。任何見解或幫助你可以給予不勝感激;謝謝!

+0

邊注:您的示例代碼看起來並不望其項背以如何ASP.MVC行動應該看起來像......內容或[文件](http://msdn.microsoft.com/en-us/library/dd470835%28v=vs.118%29.aspx)將使更有意義。 –

+0

File方法看起來很整潔,謝謝指出。 (就像我說我是C#的新手:)) – TrentD

回答

5

您正在將HTML表格編寫爲Excel文件。基本上,你正在做的文字與此:

<table> 
    <tr> 
     <td> 
      Stuff 
     </td> 
    </tr> 
</table> 

和寫作,猶如.xls擴展名的文件。 Excel是足夠「聰明」的(如果你可以這樣稱呼它的話)打開文件並正確顯示它,儘管它會提醒你文件實際上並不是xls文件。

您需要處理它(不是一個好的解決方案),將表中的數據轉換爲csv併發送CSV(更好的解決方案)或使用Excel庫創建實際的Excel文件併發送那。其中,CSV可能是最簡單的。

+3

+1。請注意,「使用Excel庫」並不意味着「使用Excel Interop」(它需要在服務器上運行Office應用程序 - 不支持),更像是使用OpenXml SDK或任何其他不需要安裝Excel的庫。 –

+1

你能推薦一個Excel庫嗎? –

+2

NPOI,OpenXML SDK,除了Excel Interop之外,就像@AlexeiLevenkov說的。 –

0

我得到了同樣的錯誤。所以,我開始(使用Microsoft.Office.Interop.Excel)從Nuget Manager獲取它。

Here is the code 

Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application(); 

Workbook wb = xla.Workbooks.Add(XlSheetType.xlWorksheet); 
       Worksheet ws = (Worksheet)xla.ActiveSheet;  

/*這裏頭*/

ws.Cells[1, 1] = "Header1"; 
      ws.Cells[1, 2] = "Header2"; ws.Cells[1, 3] = "Header3"; ws.Cells[1, 4] = "Header4"; ws.Cells[1, 5] = "Header5"; 

      int i = 2; 

/*使用你的名單這裏填寫數據行*/

  foreach (var a in pavmm.Funds) 
      { 
       ws.Cells[i, 1] = a.FilingID; 
       ws.Cells[i, 2] = a.Security_Name; ws.Cells[i, 3] = a.Filing_Type; ws.Cells[i, 4] = a.st_name; ws.Cells[i, 5] = a.Permit; 

       i = i + 1; 
      } 
      ws.Columns.AutoFit(); 
      ws.Rows.AutoFit(); 


     string folder = NewFolderName + "\\"; 
      if (!Directory.Exists(folder)) 
       Directory.CreateDirectory(folder); 


      string filename = ExcelsheetName + ".xlsx"; 
      filename = filename.Replace('/', '-'); 
      filename = filename.Replace('\\', '-'); 
      string path = Path.Combine(folder, filename); 
      wb.SaveCopyAs(path);