我正在尝试将数据从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中)它不应该给我文件扩展名错误... 你能否告诉我我应该在代码中做出哪些改变?
答案 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使用以下扩展名:
您的偏好是 MSOffice 2003,2007或2010
所以你必须选择
Response.AddHeader("content-disposition", "attachment;filename=Complaint_Details.xlsx")
代替
Complaint_Details.xls"
答案 2 :(得分:0)
我一直有同样的问题。我终于打开了RenderControl输出的记事本,看到它实际上是一个网页,无论扩展名是什么。这就是你收到警告信息的原因。用户实际上必须从Excel保存为Excel文件。
另一个缺点是网格中的内容也会呈现所有代码。因此,列标题将链接回doPostBack函数,超链接仍将具有无效的引用。
我已经看过很多次这种方法,但它并不是一个完美的解决方案。