我编写了一个PHP脚本,该脚本使用PhpSpreadSheet从MariaDB上的SQL查询生成XLs文件。 在大多数情况下,它确实运行良好,但是最大的摘录却出现了问题: Excel告诉我(当我尝试打开文件时)它已“损坏”。如果我跳过警报并打开它,则所有预期的行都在文件中(我的Mac用户根本无法打开它)。
以下是我的调查和观察结果: -对于一个给定的查询,我可以将SQL“ LIMIT”(最大行数)设置为再次具有未损坏的文件。对于一个给定的查询,在ok与未损坏和损坏的文件之间的此LIMIT始终是相同的数字。 -对于一个给定的查询,无论ID是ASCendig还是DESCending排序(在SQL查询中),损坏文件和未损坏文件之间的“ LIMIT”将几乎相同(这样,假设它不是一行中的特定字符会中断)如果我排除此限制附近的行,这个问题就可以验证此结论。但是,如果我将要写入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');
}
?>
答案 0 :(得分:0)
罗曼·杜布(Romain Dub), 我遇到了几乎相同的问题。 矿山被略微颠倒了。我想要一个xlsx,但仍然像往常一样出现错误。创建电子表格后,我将扩展名更改为xls,并打开了电子表格,当打开电子表格时,我在电子表格中发现了有关几个未定义变量的行。如果您需要解决错误,可以检查代码中是否有未定义的变量插入到电子表格中。 只是一个想法可能会或可能不会解决您的问题。