Я написал скрипт PHP, который генерирует файлы XLs из запросов SQL на MariaDB с использованием PhpSpreadSheet.В большинстве случаев он работает очень хорошо, но у меня есть проблемы с моим самым большим извлечением: Excel говорит мне (когда я пытаюсь открыть файлы), что он «поврежден».Если я пропущу предупреждение и открою его, все ожидаемые строки будут в файле (мои пользователи Mac не смогут его открыть).
Вот результаты моих исследований и наблюдений: -для одного данного запроса я могу установить SQL «LIMIT» (максимальное количество строк), чтобы снова иметь не поврежденный файл.Для одного данного запроса этот ПРЕДЕЛ между ok и не поврежденными и поврежденными файлами всегда будет одинаковым числом.- для одного данного запроса это «ПРЕДЕЛ» между поврежденными и не поврежденными файлами будет в значительной степени одинаковым, независимо от того, являются ли идентификаторы сортировкой ASCendig или DESCending (в запросе SQL. Таким образом, предположим, что это не определенный символ в одной строке, который разбиваетфайл. Этот вывод подтверждается тем фактом, что, если я исключаю строки вокруг этого предела, проблема остается. Однако, если я заменю каждое значение, которое будет записано в ячейках файла XLs, большой случайной строкой ("abcdefghijklm", немного больше, чем средняя длина каждой ячейки из моего запроса), проблема исчезает.
Я использую PHP V7.0.33 (memory_limit 1024M) / Ubuntu16.04.1 / MariaDB. Предупреждение об ограничении памяти отсутствуетв Apache2 / log / error.log (без ошибок)
<?php
//Initialization
require '/var/www/html/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
ob_clean();
//Getting data from DB
$connect = mysqli_connect("localhost", "user", "pass", "base","port");
$query = "SELECT * FROM ... WHERE ...";
$result = mysqli_query($connect, $query);
$filename="...";
//If data exist
if(mysqli_num_rows($result) > 0){
$spreadsheet = new Spreadsheet(); /*----Spreadsheet object-----*/
$Excel_writer = new Xls($spreadsheet); /*----- Excel (Xls) Object*/
$spreadsheet->setActiveSheetIndex(0);
$activeSheet = $spreadsheet->getActiveSheet();
$first = true;
$irow=0;
//Loop on each row
while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)){
//Headers
if ($first) {
$irow++;
$icol=0;
foreach (array_keys($row) as &$value) {
$icol++;
$activeSheet->setCellValueByColumnAndRow( $icol,$irow, $value );
}
$first = false;
}
//DataBodyRange
$irow++;
$icol=0;
foreach (($row) as &$value) {
$icol++;
$activeSheet->setCellValueByColumnAndRow( $icol,$irow, $value );
}
}
//Finalizartion
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
$Excel_writer->save('php://output');
}
?>