2014-09-02 60 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函数,并且超链接仍然具有无效的引用。

我已经看过这种方法发布多次,但它不是一个真正的完美解决方案。