我正在使用VB在VisualStudio上开发一个网站。在我的网站的一个部分中,我创建了一个DataBase查询,将结果存储在DataTable中并显示它。我给用户提供了下载信息的选项,我想做的是将数据表中的信息下载到客户端的XLS文件而不在服务器端创建xls。
我目前有以下代码部分将文件发送给用户
Dim fileToDownload = Server.MapPath("~/docs/QuejometroVF.pdf")
Response.ContentType = "application/octet-stream"
Dim cd = New ContentDisposition()
cd.Inline = False
cd.FileName = Path.GetFileName(fileToDownload)
Response.AppendHeader("Content-Disposition", cd.ToString())
Dim fileData = System.IO.File.ReadAllBytes(fileToDownload)
Response.OutputStream.Write(fileData, 0, fileData.Length)
但它需要一个本地文件的路径才能发送它。
首先,我想知道如何从数据表创建一个xls文件(仅在内存中),然后将该对象作为文件发送到客户端的计算机。如果不可能,你能告诉我如何在我的服务器中编写xls文件,然后我可以使用上面的代码发送它吗?我还没弄明白怎么做。
我正在考虑使用doint,因为当我已经在数据库上拥有该信息时我不想将文件保留在服务器中,并且我不会假装保存该文件。
谢谢
答案 0 :(得分:0)
我使用以下代码将数据导出到xls文件,我的后端是Oracle数据库,这是我获取数据的地方:
Dim MyConnection As OracleConnection = OpenConnection(Session("USERNAME"), Session("PASSWORD"))
Dim MyDataSet As New DataSet
MyDataSet = GetExportData(MyConnection, Session("UserDataKey"), Session("CompoundKey"), Session("LastOfCompoundKey"))
'I rename the dataset's table columns to what I want in the xls file
MyDataSet.Tables!data.Columns(0).ColumnName = "IDNumber"
MyDataSet.Tables!data.Columns(1).ColumnName = "FirstName"
MyDataSet.Tables!data.Columns(2).ColumnName = "LastName"
MyDataSet.Tables!data.Columns(3).ColumnName = "Address"
MyDataSet.Tables!data.Columns(4).ColumnName = "City"
MyDataSet.Tables!data.Columns(5).ColumnName = "State"
MyDataSet.Tables!data.Columns(6).ColumnName = "ZipCode"
MyDataSet.Tables!data.Columns(7).ColumnName = "Phone_Area"
MyDataSet.Tables!data.Columns(8).ColumnName = "Phone_Prefix"
MyDataSet.Tables!data.Columns(9).ColumnName = "Phone_Suffix"
MyDataSet.Tables!data.Columns(10).ColumnName = "Email"
MyDataSet.Tables!data.Columns(11).ColumnName = "BirthDay"
Response.ClearContent()
'I create the filename I want the data to be saved to and set up the response
Response.AddHeader("content-disposition", "attachment; filename=" & Replace(Session("Key0"), " ", "-") & "-" & Session("Key1") & "-" & Replace(Replace(Trim(Session("Key2")), ".", ""), " ", "-") & ".xls")
Response.ContentType = "application/excel"
Response.Charset = ""
EnableViewState = False
Dim tw As New System.IO.StringWriter
Dim hw As New System.Web.UI.HtmlTextWriter(tw)
'Create and bind table to a datagrid
Dim dgTableForExport As New DataGrid
If MyDataSet.Tables.Count > 0 Then
If MyDataSet.Tables(0).Rows.Count > 0 Then
dgTableForExport.DataSource = MyDataSet.Tables(0) ' .DefaultView
dgTableForExport.DataBind()
'Finish building response
Dim strStyle As String = "<style>.text { mso-number-format:\@; } </style>"
For intTemp As Integer = 0 To MyDataSet.Tables(0).Rows.Count - 1
For intTemp2 As Integer = 0 To MyDataSet.Tables(0).Columns.Count - 1
dgTableForExport.Items(intTemp).Cells(intTemp2).Attributes.Add("class", "text")
Next
Next
End If
End If
dgTableForExport.RenderControl(hw)
Response.Write(style)
' Write the HTML back to the browser.
Response.Write(tw.ToString())
Response.End()
'Close, clear and dispose
MyConnection.Close()
MyConnection.Dispose()
MyConnection = Nothing
我从我的某个项目中复制并粘贴了这个项目,未经测试,可能包含错误,但应该让您入门。
答案 1 :(得分:0)
您可以使用MemoryStream或使用 Response.Write 方法将文件写入Response流。
答案 2 :(得分:0)
从数据表创建excel文件非常简单,因为您可以创建一个GridView并将表绑定到它。
这是一个代码片段,可以满足您的需求。
Public Sub DownloadExcel(outputTable as System.Data.DataTable)
Dim gv As New GridView
Dim tw As New StringWriter
Dim hw As New HtmlTextWriter(tw)
Dim sheetName As String = "OutputFilenameHere"
gv.DataSource = outputTable
gv.DataBind()
gv.RenderControl(hw)
Response.AddHeader("content-disposition", "attachment; filename=" & sheetName & ".xls")
Response.ContentType = "application/octet-stream"
Response.Charset = ""
EnableViewState = False
Response.Write(tw.ToString)
Response.End()
End Sub
此方法存在一些问题:
这不会输出本机excel文件。相反,它输出GridView的HTML,Excel将检测并通知用户内容与扩展名不匹配。但是,如果用户从对话框中选择“是”,它将正确显示在Excel中。
早期版本的Firefox和Chrome不喜欢这种方法,而是下载扩展名为.html的文件。我刚刚在两个浏览器中对它进行了测试,并且它使用了最新版本。
理想情况下,您可能应该在您的网络服务器上使用Excel来创建原生电子表格,但如果您(像我一样)没有办法这样做,这将有效。