如何知道为什么phpSpreadsheet生成的.xls文件损坏?

时间:2019-01-28 21:33:15

标签: php excel phpspreadsheet

我编写了一个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');
    }        

?>

1 个答案:

答案 0 :(得分:0)

罗曼·杜布(Romain Dub), 我遇到了几乎相同的问题。 矿山被略微颠倒了。我想要一个xlsx,但仍然像往常一样出现错误。创建电子表格后,我将扩展名更改为xls,并打开了电子表格,当打开电子表格时,我在电子表格中发现了有关几个未定义变量的行。如果您需要解决错误,可以检查代码中是否有未定义的变量插入到电子表格中。 只是一个想法可能会或可能不会解决您的问题。