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');
?>