如何知道PHPSReadSheet生成的.xls文件损坏的原因?

如何知道PHPSReadSheet生成的.xls文件损坏的原因?,php,excel,phpspreadsheet,Php,Excel,Phpspreadsheet,我编写了一个PHP脚本,该脚本使用PHPSReadSheet从MariaDB上的SQL查询生成XLs文件。 它在大多数情况下都工作得很好,但我的最大摘录有问题:Excel告诉我(当我试图打开文件时)它“已损坏”。如果我跳过警报并打开它,所有预期的行都在文件中(我的Mac用户根本无法打开它)。 以下是我的调查和观察结果: -对于一个给定的查询,我可以设置一个SQL“限制”(最大行数),以便再次拥有一个未损坏的文件。对于一个给定的查询,ok和not corrupted以及corrupted file

我编写了一个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,然后打开电子表格,当它打开时,我在电子表格中找到了关于几个未定义变量的行。如果你需要解决错误,可能需要检查你的代码中是否有未定义的变量将变量插入电子表格。
这只是一个可能是也可能不是问题解决方案的想法。

也许您正试图创建的行数超过
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');
    }        

?>