2016-12-27 3 views
3

Ich habe Tabellen, die DataTables Server Side-Verarbeitung auf meiner Website zeigen. Ich möchte in der Lage sein, "Alle exportieren" und alle Zeilen exportiert werden, nicht nur die Zeilen angezeigt werden. Es gibt 60000+ Zeilen und 65 + Spalten, also muss es mit serverseitiger Verarbeitung gemacht werden.Alles aus DataTables mit serverseitiger Verarbeitung exportieren?

Ich habe ein paar Dinge ausprobiert, aber bisher hat nichts funktioniert.

Ich habe dies versucht:

{ extend: 'excel', 
    text: 'Export Current Page', 
    exportOptions: { 
     modifier: { 
      page: 'current' 
     } 
    }, 
    customize: function (xlsx) 
    { 
     var sheet = xlsx.xl.worksheets['sheet1.xml']; 
     $('row:first c', sheet).attr('s', '7'); 
    } 
} 

, die nur die Zeilen exportiert, die auf der Seite zeigen, wurden.

Ich habe dies versucht:

{ 
    text: 'Export All to Excel', 
    action: function (e, dt, button, config) 
    { 
     dt.one('preXhr', function (e, s, data) 
     { 
      data.length = -1; 
     }).one('draw', function (e, settings, json, xhr) 
     { 
      var excelButtonConfig = $.fn.DataTable.ext.buttons.excelHtml5; 
      var addOptions = { exportOptions: { 'columns': ':all'} }; 

      $.extend(true, excelButtonConfig, addOptions); 
      excelButtonConfig.action(e, dt, button, excelButtonConfig); 
     }).draw(); 
    } 
} 

Dieser sendet die Daten der gesamten Tabelle auf dem Bildschirm statt der Paginierung der Verwendung und den gesamten Datensatz in eine Excel-Datei zu senden.

Ich habe auf Google und hier in SO gesucht, aber habe keine Lösung gefunden, die funktioniert.

Ich sollte auch erwähnen, dass ich alle auf der Grundlage der aktuellen Filter auf der Tabelle exportieren möchte. Damit der Endbenutzer nur die Zeilen exportiert, nach denen er sucht. Sie beschränken es typischerweise auf 30k - 40k Zeilen, immer noch mit den 65+ Spalten. Ich erlaube (noch) nicht, Spalten zu entfernen/auszublenden.

EDIT/UPDATE

Hier ist zweitrangig: Wenn ich nicht Alles aus einer Antwort vom Server exportieren kann, kann ich bauen die Excel-Datei auf dem Server? Auf meinen Servern ist Excel nicht installiert und ich möchte, dass mein Endbenutzer die Datei erhält. Ich bin mir sicher, dass ich einen Weg finden müsste, Excel auf meine Server zu bringen, aber wie würde ich irgendwelche erstellten Dateien an den Endbenutzer übertragen und wäre das sogar schneller als nur eine Antwort mit dem gesamten Datensatz zu senden und zu erstellen die Excel-Datei auf dem Computer des Benutzers?

EDIT

Es wurde empfohlen, dass ich jQuerys $.ajax() dazu zu arbeiten versuchen. Wenn jemand mir eine Idee geben könnte, wie ich das machen soll, werde ich das für einen dritten Knopf versuchen.

Ich kann bereits alle Daten mit den gleichen Filtern und Sortierungen, die vom Benutzer hinzugefügt werden, und dies mit einer Schaltfläche tun. Der zweite Versuch oben tut das aber sendet es an den Bildschirm. Ich habe PHPExcel und eine Datei, die ein Excel-Blatt erstellen kann. Wie nehme ich an, was ich in diesem zweiten Knopf bekomme und schicke es an die andere Datei, um das Excel-Blatt zu erstellen? Ich dachte, dass die Verwendung von JQuery $.ajax() funktionieren könnte, ich weiß einfach nicht, wie man es bekommt. Ich weiß, dass ich $_POST verwenden muss, da die Daten zu groß sein könnten, um $_GET zu verwenden, um die Daten an die PHPExcel-Datei zu senden.

Ich kann bereits in eine CSV exportieren, aber ich muss mit einigen Formatierungen exportieren, die CSV nicht hat. Deshalb werde ich PHPExcel benutzen.

EDIT III

ich dies versuche, obwohl es noch nicht funktioniert:

{ 
    text: 'Export all to Excel II', 
    action: function (e, dt, button, config) 
    { 
     dt.one('preXhr', function (e, s, data) 
     { 
      data.length = -1; 
     }).one('export', function (e, settings, json, xhr) 
     { 
      var excelButtonConfig = $.fn.DataTable.ext.buttons.excelHtml5; 
      var addOptions = { exportOptions: { 'columns': ':all'} }; 

      $.extend(true, excelButtonConfig, addOptions); 
      excelButtonConfig.action(e, dt, button, excelButtonConfig); 
     }) 
    } 
} 

EDIT 4

Hoffentlich wird die zuletzt.

Ich weiß, dass ich drei Dinge tun müssen, um diese Arbeit zu machen:

  1. Holen Sie sich aktuelle Sortieren und Filtern
  2. Get-Datensatz mit der Länge auf -1 gesetzt
  3. Senden Sie diese an PHPExcel Datei für Verarbeitung und Erstellung von Excel-Datei ich einen Knopf wie folgt erstellen:

    { Text: ‚alle Daten nach Excel exportieren‘, Aktion: }

Ich weiß einfach nicht, was die Aktion sein muss.

Mein zweiter Versuch oben zieht das gesamte Dataset, das ich brauche, aber sendet es an den Bildschirm statt an meine PHPExcel-Datei (ExportAllToExcel.php).

Ich habe versucht, diese, um herauszufinden, und nicht sehr weit gekommen. Mir wurde gesagt, dass ich $.ajax() verwenden muss, um dies zu tun, mir wurde gesagt, dass ich das nicht verwenden muss. Ich habe es mit und ohne versucht und bin nirgends hingekommen.

Ich habe auch versucht, diese Wirkung nicht mit:

$.fn.dataTable.ext.buttons.export = 
{ 
    className: 'buttons-alert', 
    "text": "Export All Test", 
    action: function (e, dt, node, config) 
    { 
     var SearchData = dt.search(); 
     var OrderData = dt.order(); 
     alert("Test Data for Searching: " + SearchData); 
     alert("Test Data for Ordering: " + OrderData); 
    } 
}; 
+0

Ihr Gedächtnis in der php.ini-Datei für Ihre Fehler erhöhen. Und warum machst du das oder exportierst auf diese Weise – webDev

+0

@ShaileshSingh Ich habe das in der Vergangenheit versucht. Es ist keine praktikable Lösung, da es keine Speicherkapazität gibt, die dies ermöglicht. Egal wie groß ich das Limit setze ist es immer erreicht. – Mike

+1

Ich bekomme nicht mehr den Fehler, das Speicherlimit zu erreichen. Ich denke, es war nur ein Zufall, dass es überhaupt auftauchte. – Mike

Antwort

0

ich diese Arbeit haben, meistens. Es ist jetzt Zeitüberschreitung, aber das ist ein separates Problem aufgrund der Datengröße nicht zu dieser Arbeit. Für kleine Datensätze funktioniert es perfekt. Diese

ist, wie ich die Schaltfläche zu erstellen (es ist die Export Taste, die ich hier bin mit):

"buttons": [{ 
       extend: 'collection', 
       text: 'Selection', 
       buttons: ['selectAll', 'selectNone'] 
      }, { 
       extend: 'collection', 
       text: 'Export', 
       buttons: ['export', 'excel', 'csv', 'pdf', { extend: 'excel', 
        text: 'Export Current Page', 
        exportOptions: { 
         modifier: { 
          page: 'current' 
         } 
        }, 
        customize: function (xlsx) 
        { 
         var sheet = xlsx.xl.worksheets['sheet1.xml']; 
         $('row:first c', sheet).attr('s', '7'); 
        } 
       }] 
      } 
      ] 

Dies ist die Initialisierung der Schaltfläche oben erstellt:

$.fn.dataTable.ext.buttons.export = 
{ 
    className: 'buttons-alert', 
    id: 'ExportButton', 
    text: "Export All Test III", 
    action: function (e, dt, node, config) 
    { 
     var SearchData = dt.rows({ filter: 'applied' }).data(); 
     var SearchData1 = dt.search(); 
     console.log(SearchData); 
     var OrderData = dt.order(); 
     console.log(SearchData1); 
     var NumCol = SearchData[0].length; 
     var NumRow = SearchData.length; 
     var SearchData2 = []; 
     for (j = 0; j < NumRow; j++) 
     { 
      var NewSearchData = SearchData[j]; 
      for (i = 0; i < NewSearchData.length; i++) 
      { 
       NewSearchData[i] = NewSearchData[i].replace("<div class='Scrollable'>", ""); 
       NewSearchData[i] = NewSearchData[i].replace("</div>", ""); 
      } 
      SearchData2.push([NewSearchData]); 
     } 

     for (i = 0; i < SearchData2.length; i++) 
     { 
      for (j = 0; j < SearchData2[i].length; j++) 
      { 
       SearchData2[i][j] = SearchData2[i][j].join('::'); 
      } 
     } 
     SearchData2 = SearchData2.join("%%"); 
     window.location.href = './ServerSide.php?ExportToExcel=Yes'; 
    } 
}; 

Und hier ist der Teil der ServerSide.php Datei, die die Daten erhält und zur Verarbeitung an den Server sendet:

require('FilterSort.class.php'); 

if (isset($_GET['ExportToExcel']) && $_GET['ExportToExcel'] == 'Yes') 
{ 
    $request = @unserialize($_COOKIE['KeepPost']); 
    $DataReturn = json_encode(FilterSort::complex($request,$sqlConnect,$table,$primaryKey,$ColumnHeader)); 
    require './ExportAllToExcel.php'; 
} 
else 
{ 
    echo json_encode(FilterSort::complex($request,$sqlConnect,$table,$primaryKey,$ColumnHeader)); 
} 

Dies ist, wie ich das Cookie gesetzt, dass ich die Suche zu halten verwenden und Sortierkriterien:

if(isset($_POST['draw'])) 
{ 
    $KeepPost = $_POST;  
    $KeepPost['length'] = -1; 
    $PostKept = serialize($KeepPost); 
    setcookie("KeepPost",$PostKept,time() + (60*60*24*7)); 
} 

All sendet kombiniert die richtigen Kriterien zu FilterSort.class.php, die die Kriterien verarbeiten soll und geben Sie das Dataset an ExportAllToExcell zurück.php, die dann die Excel-Datei erstellt. Im Moment sende ich ihm riesige Berichte und es läuft trotzdem.

UPDATE

ich leicht die Art und Weise verändert haben, dass ich dies tun:

Hier ist die neue Reihe von Schaltflächen:

"buttons": [{ 
    extend: 'collection', 
    text: 'Export', 
    buttons: ['export', { extend: 'csv', 
     text: 'Export All To CSV',    //Export all to CSV file 
     action: function (e, dt, node, config) 
     { 
      window.location.href = './ServerSide.php?ExportToCSV=Yes'; 
     } 
    }, 'csv', 'pdf', { extend: 'excel', 
     text: 'Export Current Page',   //Export to Excel only the current page and highlight the first row as headers 
     exportOptions: { 
      modifier: { 
       page: 'current' 
      } 
     }, 
     customize: function (xlsx) 
     { 
      var sheet = xlsx.xl.worksheets['sheet1.xml']; 
      $('row:first c', sheet).attr('s', '7'); 
     } 
    }] 
} 
] 

Hier ist, wie ich die Export Alle erstellen zu Excel Knopf:

$.fn.dataTable.ext.buttons.export = 
{ 
    className: 'buttons-alert',       //Adds the "Export all to Excel" button 
    id: 'ExportButton', 
    text: "Export All To Excel", 
    action: function (e, dt, node, config) 
    { 
     window.location.href = './ServerSide.php?ExportToExcel=Yes'; 
    } 
}; 

Diese nun die Daten auf die gleiche ServerSide.php Datei senden, die ich vor der Verwendung wurde:

require('FilterSort.class.php'); 
if (isset($_GET['ExportToExcel']) && $_GET['ExportToExcel'] == 'Yes') 
{ 
    include 'Helper/LogReport.php'; 
    $GetSQL = "Select Value from PostKept where UserName = '" .$_COOKIE['UserName']. "'"; 
    $KeepResult = $conn->query($GetSQL); 
    $KeepResults = $KeepResult->fetchALL(PDO::FETCH_ASSOC); 

    $request = unserialize($KeepResults[0]['Value']); 

    $DataReturn = json_encode(FilterSort::complex($request,$sqlConnect,$table,$primaryKey,$ColumnHeader,1)); 
    require './ExportAllToExcel.php'; 

Ich habe auch die Art und Weise, dass ich die Abfrage halte geändert, ich habe es jetzt auch die Tabelle zu halten name des und Username wie folgt aus:

include 'DBConn.php'; 
$KeepPost = $_POST;          //POST holds all the data for the search 
$KeepPost['length'] = -1;        //-1 means pulling the whole table 
$PostKept = serialize($KeepPost);      //This takes the array of data and turns it into a string for storage in SQL 
$SQLCheck = "select distinct UserName from PostKept"; //Gets all the distinct Usernames of users that have used the Report Dashboard. 
$sth = $conn->query($SQLCheck); 
$CheckedUser = $sth->fetchALL(PDO::FETCH_ASSOC); 
foreach($CheckedUser as $User) 
{ 
    foreach($User as $Index => $Who) 
    { 
     $FoundUsers[] = $Who;       //Taking all the found users and placing them into a simpler array for searching later 

    } 
} 

if(isset($_COOKIE['UserName']) && in_array($_COOKIE['UserName'],$FoundUsers)) //If the user already has an entry update it with new information 
{ 
    $TSQL = "UPDATE PostKept set Value = '" .$PostKept. "', TableName = '" .$TableName. "' where UserName = '" .$_COOKIE['UserName']. "'"; 
} 
else 
{ 
    if(isset($_COOKIE['UserName']))  //If this is a new user 
    { 
     $TSQL = "INSERT into PostKept(Value, TableName, UserName) select '" .$PostKept. "','" .$TableName. "','" .$_COOKIE['UserName']. "'"; 
    } 
    else  //If this is on the Prod site and the User info is not yet kept 
    { 
     $TSQL = "INSERT into PostKept(Value, TableName) select '" .$PostKept. "','" .$TableName. "'"; 
    } 
} 

$sth = $conn->prepare($TSQL); 
$sth->execute(); 

Dies ist nun, was alle verbindet die Daten an die ExportAllToExcel.php Datei t senden Hat ich und dann erstellt es wiederum die Datei.

1

in Tasten:

action: function (e, dt, node, config) { 

var formData = 'yourfilters'; 
formData.begin = '0'; 
formData.length = 'yourTotalSize'; 

$http({ 
    url: 'yourURL', 
    method: 'POST', 
    data: JSON.stringify(formData) 
}).then(function (ajaxReturnedData) { 

    dt.rows.add(ajaxReturnedData.data).draw(); 
    $.fn.dataTable.ext.buttons.excelHtml5.action.call(this, e, dt, node, config); 

});} 
Verwandte Themen