2017-04-10 75 views
1

我正在使用VB開發VisualStudio上的網站。在我的站點的一部分中,我創建一個DataBase Query,將結果存儲在DataTable中並顯示它。我向用戶提供下載信息的選項,我想要做的是使用數據表中的信息將XLS文件下載到客戶端,而無需在服務器端創建xls。從Datatable下載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

我出口使用下面的代碼數據到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 

我複製並從一個粘貼此我的項目,它沒有經過測試,可能包含錯誤,但應該讓你開始。

0

您可以使用MemoryStream或使用Response.Write方法將文件寫入Response流。

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 

有這種方法的幾個問題:

  1. 這不輸出本地Excel文件。相反,它會輸出一個GridView的HTML,Excel將檢測並通知用戶內容與擴展名不匹配。但是,如果用戶從對話框中選擇「是」,它將在Excel中正確顯示。

  2. 早期版本的Firefox和Chrome不喜歡這種方法,而是下載帶有.html擴展名的文件。我只是在兩個瀏覽器中進行了測試,並且使用了最新的版本。

理想情況下,你應該使用Excel您的網絡服務器創建原始電子表格,但如果你(像我)沒有能力這樣做會奏效。