【问题标题】:Exporting a Gridview to Excel using VB.NET使用 VB.NET 将 Gridview 导出到 Excel
【发布时间】:2015-07-14 07:19:11
【问题描述】:

我有一个带有gridview 的页面,它正在使用母版页。导出按钮位于母版页上,我只需要从中导出实际页面上的 gridview 数据。

gridview 上有一些隐藏的列,这些列不能包含在导出到 Excel 的数据中。

如何在不获取网格视图周围的任何其他格式(即页面本身)的情况下做到这一点?

我基本上使用这个 URL 上的代码:Export Gridview Data to Excel - Change the header name(我转换为 VB.NET),但它似乎将网格上的所有数据导出到 Excel,包括隐藏的列。

【问题讨论】:

    标签: 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;
        
        
            }
        

        【讨论】:

        • 请用英文写下你的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 2014-12-20
        • 1970-01-01
        相关资源
        最近更新 更多