2017-04-10 1 views
1

Ich entwickle eine Website auf VisualStudio mit VB. In einem Abschnitt meiner Site mache ich eine DataBase-Abfrage, speichere das Ergebnis in einer DataTable und zeige es an. Ich gebe dem Benutzer die Option, die Informationen herunterzuladen, was ich tun möchte, ist, eine XLS-Datei mit den Informationen in der Datentabelle auf die Seite des Clients herunterzuladen, ohne die xls auf der Serverseite zu erzeugen.Download XLS-Datei zum Client von Datatable

Im Moment habe ich den folgenden Code-Abschnitt, die Datei an den Benutzer

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) 

Aber es erfordert einen Pfad zu einer lokalen Datei, um sie zu senden zu senden.

Zuerst möchte ich wissen, wie man eine xls-Datei von der Datentabelle (nur im Speicher) erstellt und dann dieses Objekt als Datei an den Computer des Kunden sendet. Wenn es nicht möglich ist, können Sie mir sagen, wie ich die xls-Datei auf meinem Server schreibe, damit ich sie dann mit dem obigen Code senden kann? Ich habe noch nicht wirklich herausgefunden, wie es geht.

Ich dachte darüber nach, denn ich möchte keine Dateien auf dem Server behalten, wenn ich diese Informationen bereits in der Datenbank habe, und ich gebe nicht vor, diese Datei zu speichern.

Danke

Antwort

0

I-Daten zu xls-Datei mit dem folgenden Code exportieren, mein Backend ist eine Oracle-Datenbank und das ist, wo ich die Daten erhalten:

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 

ich kopiert und diese eingefügt von einer meine Projekte, es ist ungetestet und kann Fehler enthalten, aber sollte Sie beginnen.

0

Sie können MemoryStream verwenden oder die Datei in den Antwortstream unter Verwendung der Methode Response.Write schreiben.

0

Das Erstellen einer Excel-Datei aus einer Datentabelle ist ziemlich einfach, da Sie einfach eine GridView erstellen und die Tabelle an sie binden können.

Hier ist ein Code-Snippet, das tut, was Sie brauchen.

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 

Es gibt ein paar Probleme mit dieser Methode:

  1. Dies keine Ausgabe eine native Excel-Datei. Stattdessen gibt es den HTML-Code für eine GridView aus, den Excel erkennt, und benachrichtigt den Benutzer, dass der Inhalt nicht mit der Erweiterung übereinstimmt. Es wird jedoch korrekt in Excel angezeigt, wenn der Benutzer "Ja" aus dem Dialogfeld auswählt.

  2. Frühere Versionen von Firefox und Chrome haben diese Methode nicht gefallen und laden stattdessen die Datei mit der Erweiterung .html herunter. Ich habe es gerade in beiden Browsern getestet und es funktionierte mit den aktuellsten Versionen.

Idealerweise sollten Sie wahrscheinlich verwenden Excel auf Ihrem Webserver nativen Tabellen zu erstellen, aber das wird funktionieren, wenn Sie (wie ich) nicht über die Mittel, dies zu tun.