2017-01-13 1 views
0

Ich habe eine Reporting-Website, die ich DataTables Server Side Processing auf verwenden. Alles funktioniert gut, außer dass ich den gesamten Datensatz exportieren muss und nicht nur den Teil, der auf dem Bildschirm angezeigt wird. Ich habe Berichte, die mehr als 10.000 Zeilen und mehr als 65 Spalten haben, so dass der gesamte Bericht auf der Seite nicht in Frage kommt (würde mehr als 5 Minuten dauern und dann eine Auszeit nehmen). Ich bin einer Antwort sehr nahe gekommen, denke ich, aber ich brauche Hilfe, um den Rest des Weges zu bekommen. Hier ist, was ich habe:Senden von Daten an die URL per Post zum Exportieren nach Excel mit JavaScript

Ich sammle die Daten, die ich brauche, um es in eine Datei zu senden, die PHPExcel-Bibliotheken verwendet, um eine Excel-Datei zu exportieren.

Wenn ich zu der Datei (ExportAllToExcel.php) navigieren, funktioniert es gut, aber wenn ich eine Schaltfläche verwenden, um die Daten an die Datei zu senden, gibt es keinen Download. Hier ist, was ich habe gerade gehen:

$.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 OrderData = dt.order(); 
     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("%%"); 

     //var SendPageData = new XMLHttpRequest(); 
     //SendPageData.open("POST", "./ExportAllToExcel.php", true); 
     //SendPageData.send('{NumRow=' + NumRow + '},{SearchData=' + SearchData2 + '}'); 
     $.post('./ExportAllToExcel.php',{SearchData: SearchData2,NumRow: NumRow}); 
     window.location.href = './ExportAllToExcel.php'; 
    } 
}; 

Dies funktioniert nicht. Die $.POST sendet die Daten und erhält eine Antwort, exportiert die Datei jedoch nicht.

Die Window.location geht in die Datei und exportiert nach Excel, aber hat nicht die Daten von $_POST, so dass die Datei nur Header hat.

Und die SendPageData tut das gleiche wie die $.POST sendet die Daten und erhält eine Antwort, aber erstellt die Datei nicht.

Und hier ist der ExportAllToExcel.php:

<?php 
require $_SERVER['DOCUMENT_ROOT'].'/dev/Location/Helper/PageName.php';    //Pulls the Page name and Table name and returns the $SQLTableName, $TableName, $Title, $Page and $HeadingDesc 
include $_SERVER['DOCUMENT_ROOT'].'/dev/Location/DBConn.php';      //DB connection info 

$headings = array();      //Create the empty array for use later and so that it won't throw an error if not assinged later 
$hsql = "select Headings from TableHeadings where TableName = '$TableName' order by Id"; //Get all the column headers from the TableHeadings table in SQL 

$getHeadings = $conn->query($hsql); 
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC); 
$CountHeadings = count($rHeadings);   //Count how many columns that there will be 
$tsqlHeadings = ''; 
$ColumnHeader = array(); 
for ($row = 0; $row < $CountHeadings; $row++) 
{ 
    $headings[$row] = $rHeadings[$row]["Headings"];  //fill the array of column headings for use in creating the DataTable 
} 
print_r($headings); 

// Error reporting 
error_reporting(E_ALL); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 

if (PHP_SAPI == 'cli') 
    die('This example should only be run from a Web Browser'); 

// Add some data 
$ColumnArray = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'); 
//$HeadingArray = array('Year','Quater','Country','Sales'); 
$HeadingArray = $headings; 

$primaryKey = 'id'; 
$table = $SQLTableName;     
$request = $_POST; 
$dataArray = array(); 
$dataArraystr = explode('%%',$_POST['SearchData']); 

foreach($dataArraystr as $ArrayStr) 
{ 
    $dataArray[] = explode('::',$ArrayStr); 
} 

// Include PHPExcel 
require_once dirname(__FILE__) . './Classes/PHPExcel.php'; 


// Create new PHPExcel object 
$objPHPExcel = new PHPExcel(); 

// Set document properties 
$objPHPExcel->getProperties()->setCreator("Michael McNair") 
          ->setLastModifiedBy("Michael McNair") 
          ->setTitle($TableName) 
          ->setSubject($TableName) 
          ->setDescription("Report for " .$TableName. " using PHPExcel, generated using PHP classes.") 
          ->setKeywords("office PHPExcel php " . $TableName) 
          ->setCategory("Report Export File"); 

$objPHPExcel->getActiveSheet()->fromArray($HeadingArray, NULL, 'A1'); 
$objPHPExcel->getActiveSheet()->fromArray($dataArray, NULL, 'A2'); 

$CountOfArray = count($HeadingArray); 
// Set title row bold 
$objPHPExcel->getActiveSheet()->getStyle('A1:' .$ColumnArray[$CountOfArray-1]. '1')->getFont()->setBold(true); 

// Set autofilter 
// Always include the complete filter range! 
// Excel does support setting only the caption 
// row, but that's not a best practise... 
$objPHPExcel->getActiveSheet()->setAutoFilter($objPHPExcel->getActiveSheet()->calculateWorksheetDimension()); 

// Rename worksheet 
$objPHPExcel->getActiveSheet()->setTitle('SimpleTest'); 

// Add a second sheet, but infront of the existing sheet 
//$myWorkSheet = new PHPExcel_Worksheet($objPHPExcel,'New Worksheet'); 
//$objPHPExcel->addSheet($myWorkSheet,0); 


// Set active sheet index to the first sheet, so Excel opens this as the first sheet 
$objPHPExcel->setActiveSheetIndex(0); 


// Redirect output to a client’s web browser (Excel2007) 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="ExportAllToExcelTest.xlsx"'); 
header('Cache-Control: max-age=0'); 
// If you're serving to IE 9, then the following may be needed 
header('Cache-Control: max-age=1'); 

// If you're serving to IE over SSL, then the following may be needed 
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified 
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 
header ('Pragma: public'); // HTTP/1.0 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
///$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
ob_clean(); 
$objWriter->save('php://output'); 
?> 

Antwort

0

ich das Problem behoben haben. Dies ist der Knopf jetzt:

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

Ich benutze nur die eine $_GET und dass ServerSide.php Datei, die gleiche Datei, die die Daten für den Browser bekommt, mit zu beginnen, um meine zu senden. Es jetzt ich dafür zu prüfen und nutzen meine KeepPost.php Datei, um die Filterung zu halten und das Sortieren, dass der Benutzer auf den Bericht gelegt hat:

<?php 

    if(isset($_POST['draw'])) 
     { 
      include 'DBConn.php'; 
      //echo "Here"; 
      //print_r($_POST); 
      $KeepPost = $_POST;  
      $KeepPost['length'] = -1; 
      $PostKept = serialize($KeepPost); 
      $TSQL = "UPDATE PostKept set Value = '" .$PostKept. "'"; 
      $sth = $conn->prepare($TSQL); 
      //print_r($sth); 
      $sth->execute(); 
     } 
?> 

Dann in ServerSide.php ich für die $_GET['ExportToExcel'] überprüfen:

if (isset($_GET['ExportToExcel']) && $_GET['ExportToExcel'] == 'Yes') 
{ 
    $GetSQL = "Select Value from PostKept"; 
    $KeepResult = $conn->query($GetSQL); 
    $KeepResults = $KeepResult->fetchALL(PDO::FETCH_ASSOC); 

    //print_r($KeepResults); 
    error_log(date("Y/m/d h:i:sa")." KeepResults: " .$KeepResults[0]['Value']. "\n",3,"C:\Temp\LogPHP.txt"); 
    //findSerializeError($_COOKIE['KeepPost']); 
    //print_r($_COOKIE); 
    $request = unserialize($KeepResults[0]['Value']); 
    //echo "<br>Request: "; print_r($request); 

    $DataReturn = json_encode(FilterSort::complex($request,$sqlConnect,$table,$primaryKey,$ColumnHeader,1)); 
    //echo "DataReturn:<br>"; print_r($DataReturn); 
    require './ExportAllToExcel.php'; 
} 

Dieser sendet dann die richtigen Daten an die ExportAllToExcel.php Datei und exportiert die Daten der Nutzer will.

Verwandte Themen