从Datatable下载xls文件到客户端

我正在使用VB开发VisualStudio上的网站。 在我的网站的一部分,我做了一个数据库查询,将结果存储在一个数据表中,并显示它。 我给用户下载信息的选项,我想要做的是用数据表中的信息下载XLS文件到客户端,而不用在服务器端创buildxls。

我目前有以下代码部分将文件发送给用户

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) 

但它需要一个path到本地文件才能发送它。

首先,我想知道如何从数据表(只在内存中)创build一个xls文件,然后将该对象作为文件发送到客户端的计算机。 如果这是不可能的,你能告诉我如何写在我的服务器x​​ls文件,所以我可以发送它使用上面的代码? 我还没有真正想出如何去做。

我正在考虑这样做,因为我不想在服务器上保留文件,因为我已经拥有数据库上的这些信息,而且我不会假装保留这个文件。

谢谢

我使用下面的代码将数据导出到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 

我从我的一个项目中复制并粘贴了这个项目,它没有经过testing,可能包含错误,但应该让你开始。

您可以使用MemoryStream或使用Response.Write方法将文件写入Responsestream。

从数据表创buildExcel文件相当容易,因为您可以创build一个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 

这个方法有几个问题:

  1. 这不会输出本机的Excel文件。 相反,它会输出一个GridView的HTML,Excel将检测到并通知用户内容与扩展名不匹配。 但是,如果用户从对话框中select“是”,它将在Excel中正确显示。

  2. 早期版本的Firefox和Chrome不喜欢这种方法,而是用.html扩展名下载文件。 我只是在两个浏览器中进行了testing,并且使用了最新的版本。

理想情况下,您应该使用Web服务器上的Excel来创build本地电子表格,但是如果您(像我一样)没有办法做到这一点,那么这个方法就行得通了。