【问题标题】:Exporting a Gridview to Excel using VB.NET使用 VB.NET 将 Gridview 导出到 Excel
【发布时间】:2015-07-14 07:19:11
【问题描述】:
【问题讨论】:
标签:
asp.net
vb.net
excel
gridview
【解决方案1】:
我一直在寻找解决方案已经有一段时间了。我之前看过你的代码,但我似乎无法让它工作 - 但这是因为缺乏知识。因此,对于可能遇到同样问题的其他人,这是我的方案和解决方案,请注意这是在 VB 中,可以使用任何在线转换工具进行转换:
场景:我有一个带有导出按钮的母版页,它使用母版页从页面上的 gridview 导出数据。
在带有 Gridview 的页面的 Page_Load 事件中,我使用了以下代码:
Dim myMasterPage As MasterPageName = Page.Master
Dim exportButton As System.Web.UI.WebControls.Button = myMasterPage.FindControl("ButExportExcel")
If (exportButton IsNot Nothing) Then
AddHandler exportButton.Click, AddressOf Me.ButExportExcel_Click
End If
然后我创建了公共子:
Private Sub ButExportExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim sMethod = "ButExportExcel_Click"
Dim sErrorMessage = ""
Dim sExportFileName As String = ""
Try
sExportFileName = Path.GetFileName(Request.PhysicalPath)
sExportFileName = sExportFileName.Substring(0, sExportFileName.Length - 5) & ".xls"
Response.Clear()
Response.AddHeader("content-disposition", "attachment; filename=" & sExportFileName)
Response.ContentType = "application/vnd.xls"
Dim WriteItem As System.IO.StringWriter = New System.IO.StringWriter()
Dim htmlText As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(WriteItem)
SummaryGridView.AllowPaging = False
'Dim dtSupplier As DataTable = CType(ViewState("dtSupplier"), DataTable)
'SummaryGridView.DataSource = dtSupplier
SummaryGridView.DataBind()
SummaryGridView.RenderControl(htmlText)
Response.Write(WriteItem.ToString())
Response.End()
Catch ex As Exception
End Try
End Sub
然后添加以下内容:
Public Overrides Sub VerifyRenderingInServerForm(control As Control)
End Sub
不幸的是,这意味着它需要进入您希望从中导出网格视图的每个页面,但它为我完成了这项工作。这只会导出gridview中的数据。
我希望这对遇到同样问题的人有所帮助。
【解决方案2】:
其实我找到了另一种方式,不影响页面本身,只需要在masterpage上做即可。
Public Overrides Sub VerifyRenderingInServerForm(control As Control) 不是必需的:
'在 Masterpage 中导出 Click 事件:
Public Sub ButExportExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButExportExcel.Click
'*** take the paging and sorting out of the excel spreadsheet
Try
Dim sgv As GridView = CType(ContentPlaceHolder_body.FindControl("SummaryGridView"), GridView)
If (sgv IsNot Nothing) Then
sgv.AllowPaging = False
sgv.AllowSorting = False
sgv.DataBind()
End If
Dim sExportFileName As String = ""
sExportFileName = Path.GetFileName(Request.PhysicalPath)
sExportFileName = sExportFileName.Substring(0, sExportFileName.Length - 5) & ".xls"
Export2(sExportFileName, sgv)
Catch ex As Exception
End Try
End Sub
'Export Sub
Public Sub Export2(ByVal fileName As String, ByVal gv As GridView)
Dim sExportFileName As String = ""
Dim sStringToReplace As String = ""
gv.HeaderStyle.ForeColor = Drawing.Color.Black
gv.HeaderStyle.BackColor = Drawing.Color.White
gv.RowStyle.BackColor = Drawing.Color.White
gv.HeaderStyle.Font.Bold = True
gv.HeaderStyle.Font.Size = 10
sExportFileName = Path.GetFileName(Request.PhysicalPath)
sExportFileName = sExportFileName.Substring(0, sExportFileName.Length - 5) & ".xls"
Dim attachment As String = "attachment; filename=" & sExportFileName
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.AddHeader("content-disposition", attachment)
HttpContext.Current.Response.ContentType = "application/ms-excel"
Dim stw As New StringWriter()
Dim htextw As New HtmlTextWriter(stw)
Dim parent As Control = gv.Parent
Dim GridIndex As Integer = 0
If parent IsNot Nothing Then
GridIndex = parent.Controls.IndexOf(gv)
parent.Controls.Remove(gv)
End If
gv.RenderControl(htextw)
If parent IsNot Nothing Then
parent.Controls.AddAt(GridIndex, gv)
End If
'gv.RenderControl(htextw)
HttpContext.Current.Response.Write(stw.ToString())
Dim fi As New FileInfo(Server.MapPath("../JumpStart.css"))
Dim sb As New System.Text.StringBuilder()
Dim sr As StreamReader = fi.OpenText()
'sStringToReplace = "class=""generalheader"""
While sr.Peek() >= 0
sb.Append(sr.ReadLine())
End While
sr.Close()
Dim outputHtml = "<html><head><style type='text/css'>" + sb.ToString() + "</style></head>" + stw.ToString() + "</html>"
Response.Write(outputHtml.ToString)
'Response.Write("<html><head><style type='text/css'>" + sb.ToString() + "</style></head>" + stw.ToString() + "</html>")
stw = Nothing
htextw = Nothing
Response.Flush()
Response.[End]()
End Sub
【解决方案3】:
ACA LES DEJO UNA FUNCION MENOS COMPLICADA Y FUNCIONAL PROBADA AL 2019
PARA VB.NET
私有子 GenerarExcel()
Dim excel As Microsoft.Office.Interop.Excel.Application = New Microsoft.Office.Interop.Excel.Application()
excel.Application.Workbooks.Add(True)
Dim ColumnIndex As Integer = 0
For Each col As DataGridViewColumn In GrillaReporte.Columns
ColumnIndex += 1
excel.Cells(1, ColumnIndex) = col.Name
Next
Dim rowIndex As Integer = 0
For Each row As DataGridViewRow In GrillaReporte.Rows
rowIndex += 1
ColumnIndex = 0
For Each col As DataGridViewColumn In GrillaReporte.Columns
ColumnIndex += 1
excel.Cells(rowIndex + 1, ColumnIndex) = row.Cells(col.Name).Value
Next
Next
excel.Visible = True
End Sub
PARA C#
私有 void GenerarExcel()
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
int ColumnIndex = 0;
foreach (DataGridViewColumn col in GrillaArticulos.Columns)
{
ColumnIndex++;
excel.Cells[1, ColumnIndex] = col.Name;
}
int rowIndex = 0;
foreach (DataGridViewRow row in GrillaArticulos.Rows)
{
rowIndex++;
ColumnIndex = 0;
foreach (DataGridViewColumn col in GrillaArticulos.Columns)
{
ColumnIndex++;
excel.Cells[rowIndex + 1, ColumnIndex] = row.Cells[col.Name].Value;
}
}
excel.Visible = true;
}