2014-09-02 59 views
2

我想從gridview導出數據到excel。我的電腦上安裝了office 2010。當我試圖打開excel文件時,它給了我錯誤,即「您試圖打開的文件的格式不同於文件擴展名c#指定的格式」。如何將數據從gridview導出到excel 2003,2007,2010沒有警告信息

我對出口的GridView代碼:

Protected Sub btnexptoexcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnexptoexcel.Click 
    Try 
     Response.Clear() 
     Response.Buffer = True 
     Response.AddHeader("content-disposition", "attachment;filename=Complaint_Details.xls") 
     Response.Charset = "" 
     Response.ContentType = "application/ms-excel" 
     Using sw As New StringWriter() 
      Dim hw As New HtmlTextWriter(sw) 

      grd_ComplaintDetails.AllowPaging = False 


      grd_ComplaintDetails.HeaderRow.BackColor = Color.White 
      For Each cell As TableCell In grd_ComplaintDetails.HeaderRow.Cells 
       cell.BackColor = grd_ComplaintDetails.HeaderStyle.BackColor 
      Next 
      For Each row As GridViewRow In grd_ComplaintDetails.Rows 
       row.BackColor = Color.White 
       For Each cell As TableCell In row.Cells 
        If row.RowIndex Mod 2 = 0 Then 
         cell.BackColor = grd_ComplaintDetails.AlternatingRowStyle.BackColor 
        Else 
         cell.BackColor = grd_ComplaintDetails.RowStyle.BackColor 
        End If 
        cell.CssClass = "textmode" 
       Next 
      Next 

      grd_ComplaintDetails.RenderControl(hw) 
      Dim style As String = "<style> .textmode { } </style>" 
      Response.Write(style) 
      Response.Output.Write(sw.ToString()) 
      Response.Flush() 
      Response.[End]() 
     End Using 

    Catch ex As Exception 
     div_Msg.InnerText = "Can not generate Excel File" 
    End Try 

End Sub 

我的問題是,當我打開文件(在2003的MSOffice,2007或2010),它不應該給我的文件擴展名錯誤... 你能告訴我什麼是我應該在代碼中做出的更改嗎?

回答

0

如果你能做到這一點,儘量保存文件,而不是.xlsx的Excel 2007+

Response.AddHeader("content-disposition", "attachment;filename=Complaint_Details.xlsx") 

另外,我建議嘗試這種免費的圖書館應對xlsx Excel文件。 EPPLUS非常好。 epplus.codeplex.com

如果你特別需要xls文件(Excel 2003中及以上),他們不支持EPPLUS,但你可以使用支持他們

+0

感謝您的回覆...我根據您的評論替換我的代碼,但它給了我錯誤,即「excel無法打開文件,因爲文件格式無效。」..你能幫我嗎? – 2014-09-03 13:04:35

+0

@KishorRajendraKulkarni我不能,我不知道你在做什麼......我建議用EPPLUS重寫你的整個過程,然後根據提供的示例項目創建一個** valid **'xlsx'文件。 – Vland 2014-09-03 13:19:17

0

來自微軟的Article說,這個其他圖書館NPOIhttps://npoi.codeplex.com/ Excel使用以下擴展名:

  • 的.xls - 是的Excel 97 - Excel 2003中的二進制文件格式(BIFF 8)。
  • .xlsx - 默認的Office Excel 2007基於XML的文件格式。不能存儲Microsoft Visual Basic for Applications(VBA)宏代碼或Microsoft Office Excel 4.0宏表(.xlm)。
  • .xlt - 用於Excel模板的Excel 97 - Excel 2003二進制文件格式(BIFF8)。
  • .xlsm Office Excel 2007基於XML和啓用宏的文件格式。存儲VBA宏代碼或Excel 4.0宏表(.xlm)。
  • .xltx Excel模板的默認Office Excel 2007文件格式。無法存儲VBA宏代碼或Excel 4.0宏表(.xlm)。
  • .xla Excel 97-2003加載項,旨在運行其他代碼的補充程序。支持使用VBA項目。

你的偏好是的MSOffice 2003年,2007年或2010

所以,你必須選擇

Response.AddHeader("content-disposition", "attachment;filename=Complaint_Details.xlsx")而不是爲 Complaint_Details.xls"

+0

感謝您的回覆...我根據您的評論替換我的代碼,但它給了我錯誤,即「excel無法打開文件,因爲文件格式無效。」..你能幫我嗎? – 2014-09-03 13:04:17

0

我一直有同樣的問題。我終於用記事本打開了RenderControl輸出的內容,發現它實際上是一個網頁,不管擴展名是什麼。這就是爲什麼你會收到警告信息。用戶實際上必須從Excel保存爲Excel文件。

其他缺點之一是網格中的內容也會呈現所有代碼。所以,列標題將鏈接回doPostBack函數,並且超鏈接仍然具有無效的引用。

我已經看過這種方法發佈多次,但它不是一個真正的完美解決方案。