如何使用VB在ASP.NET中使用DataGrid(NOT DataGridView)导出到csv或excel文件?

时间:2019-02-04 16:43:11

标签: asp.net vb.net datagrid

我正在尝试将数据从DataGrid导出到.csv文件(甚至是.xlsx或.xls文件),而且似乎找不到适合我的环境(VB.net)的方法。我在网上看到的所有内容似乎都引用了DataGridView,而不仅仅是普通的DataGrid。这样,否则它将使用C#代码而不是VB。不确定是否会有所作为,但我将Oracle用作数据库。

对于设置,我在页面上有一个按钮,单击该按钮时,我希望后面的代码将基于DataGrid创建一个.csv文件。不过,问题是我希望它提示用户保存文件,而不是仅将其专门保存在某个地方。现在,这是我的按钮代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim rpt_fy As String = Session("RPTFY")
    Dim strWHERE As String = " WHERE (FY LIKE '" & rpt_fy & "')"
    Dim strSELECT As String = "SELECT FY, BUDGET, CODE, DEPT, REV FROM DB_PROD"

    OracleSelectCommand1.CommandText = strSELECT & strWHERE

    Dim myDataReader As Data.Odbc.OdbcDataReader
    OracleConnection1.Open()
    myDataReader = OracleSelectCommand1.ExecuteReader

    ' Specify the DataReader as the source of the data for our DataGrid
    ' and then DataBind to display the data in our DataGrid.

    Dim dsConvert As New DataSet()
    dsConvert.Tables.Add("Convert")
    dsConvert.Tables(0).Load(myDataReader)
    DataGrid1.DataSource = dsConvert
    DataGrid1.DataBind()

    ' Close our DataReader and Connection
    myDataReader.Close()
    OracleConnection1.Close()

End Sub

对于文件,我的方法是使用Response.Write()函数为用户提供选择文件保存位置的选项:

Response.Clear()
Response.Buffer = True
Response.AddHeader("content-disposition", "attachment;filename=DataTable.csv")
Response.Charset = ""
Response.ContentType = "application/vnd.ms-excel"

我似乎看到很多东西是使用HtmlTextWriter编写它的想法,就像这样:

Dim stringWrite As New System.IO.StringWriter
Dim htmlWrite As New System.Web.UI.HtmlTextWriter(stringWrite)

Dim strStyle As String = "<style>.text { mso-number-format:\@; } </style>"
For intTemp As Integer = 0 To DataGrid1.Items.Count - 1
    DataGrid1.Items(intTemp).Cells(0).Attributes.Add("class", "text")
    DataGrid1.Items(intTemp).Cells(1).Attributes.Add("class", "text")
    DataGrid1.Items(intTemp).Cells(3).Attributes.Add("class", "text")
Next

DataGrid1.RenderControl(htmlWrite)
response.Write(strStyle & stringWrite.ToString)
response.End()

这个问题是,它实际上只是写一个html文件。我确实意识到Excel应该能够将.html文件转换为.xlsx / .xls文件,但是该程序附带的安全设置不再使这成为可能。因此,我宁愿将其写为.csv而不是html文件。

我还看到了一些使用IO.StreamWriter的示例,但是有了这个,我们将不得不首先将文件保存到服务器,由于安全设置,我们又不能这样做。

如何修改代码以允许从DataGrid导出到.csv文件?

1 个答案:

答案 0 :(得分:0)

这是csv表的现有解决方案。您可以从DataSet对象中获取表。

c# datatable to csv

Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Linq
Imports System.Collections
Imports System.Collections.Generic

        For Each tbl As System.Data.Table In dsConvert.Tables
            Dim sb As System.Text.StringBuilder
            Dim colNames = tbl.Columns.IEnumerable(Of DataColumn).Select(c >= c.ColumnName)
            sb.Append(String.Join(",", columnNames))
            For Each row As System.Data.DataRow In tbl.Rows
                Dim iEnumFields = row.ItemArray.Select(f >= f.ToString())
                sb.AppendLine(String.Join(",", iEnumFields))
            Next
            File.WriteAllText(tbl.TableName & ".csv", sb.ToString())
        Next