如何知道PHPSReadSheet生成的.xls文件损坏的原因?
我编写了一个PHP脚本,该脚本使用PHPSReadSheet从MariaDB上的SQL查询生成XLs文件。 它在大多数情况下都工作得很好,但我的最大摘录有问题:Excel告诉我(当我试图打开文件时)它“已损坏”。如果我跳过警报并打开它,所有预期的行都在文件中(我的Mac用户根本无法打开它)。 以下是我的调查和观察结果: -对于一个给定的查询,我可以设置一个SQL“限制”(最大行数),以便再次拥有一个未损坏的文件。对于一个给定的查询,ok和not corrupted以及corrupted files之间的限制将始终是相同的数字。 -对于一个给定的查询,无论ID是递增排序还是递减排序,损坏和未损坏文件之间的“限制”都几乎相同(在SQL查询中。通过这种方式,假设不是一行中的某个特定字符破坏了文件。如果排除此限制周围的行,则问题仍然存在。但是,如果我用一个大的随机字符串(“abcdefghijklm”)替换要写入XLs文件单元格中的每个值,则可以验证此结论,略大于我请求中每个单元格的平均长度),问题消失 我使用的是PHPV7.0.33(内存限制1024M)/Ubuntu16.04.1/MariaDB。 Apache2/log/error.log中没有内存限制警告(完全没有错误) 罗曼·杜布, 我也有同样的问题。 我的是稍微颠倒过来的。我想要一个xlsx,但还是像你一样得到了错误。在我的电子表格创建之后,我将扩展名改为xls,然后打开电子表格,当它打开时,我在电子表格中找到了关于几个未定义变量的行。如果你需要解决错误,可能需要检查你的代码中是否有未定义的变量将变量插入电子表格。如何知道PHPSReadSheet生成的.xls文件损坏的原因?,php,excel,phpspreadsheet,Php,Excel,Phpspreadsheet,我编写了一个PHP脚本,该脚本使用PHPSReadSheet从MariaDB上的SQL查询生成XLs文件。 它在大多数情况下都工作得很好,但我的最大摘录有问题:Excel告诉我(当我试图打开文件时)它“已损坏”。如果我跳过警报并打开它,所有预期的行都在文件中(我的Mac用户根本无法打开它)。 以下是我的调查和观察结果: -对于一个给定的查询,我可以设置一个SQL“限制”(最大行数),以便再次拥有一个未损坏的文件。对于一个给定的查询,ok和not corrupted以及corrupted file
这只是一个可能是也可能不是问题解决方案的想法。也许您正试图创建的行数超过
XLS
所能处理的行数?65536谢谢Chris,但该文件有12400行,虽然不多。我已经找到了一个解决此问题的方法,使用.xlsx而不是.XLS,因此生成的文件要小5倍:它可能是一个缓存/输出大小问题,但即使我在服务器上更改了很多php参数,我也无法查看和修复读取问题。。。
<?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');
}
?>