如何将数据从gridview导出到excel 2003,2007,2010而不显示警告消息

时间:2014-09-02 07:17:02

标签: asp.net vb.net excel gridview

我正在尝试将数据从gridview导出到excel。我在我的电脑上安装了Office 2010。当我尝试打开excel文件时,它给出了错误,即“您尝试打开的文件格式与文件扩展名c#指定的格式不同。”

我的导出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

我的问题是当我打开文件时(在MSOffice 2003,2007或2010中)它不应该给我文件扩展名错误... 你能否告诉我我应该在代码中做出哪些改变?

3 个答案:

答案 0 :(得分:0)

如果可以,请尝试将文件另存为.xlsx excel 2007 +

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

此外,我建议尝试使用此免费库来处理xlsx Excel文件。 EPPLUS 非常好。 epplus.codeplex.com

如果您需要专门的xls个文件( excel 2003 及更早版本),则EPPLUS不支持这些文件,但您可以使用此其他库 NPOI https://npoi.codeplex.com/支持他们

答案 1 :(得分:0)

microsoft的Article表示Excel使用以下扩展名:

  • .xls - 是Excel 97 - Excel 2003二进制文件格式(BIFF8)。
  • .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"

答案 2 :(得分:0)

我一直有同样的问题。我终于打开了RenderControl输出的记事本,看到它实际上是一个网页,无论扩展名是什么。这就是你收到警告信息的原因。用户实际上必须从Excel保存为Excel文件。

另一个缺点是网格中的内容也会呈现所有代码。因此,列标题将链接回doPostBack函数,超链接仍将具有无效的引用。

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