Как узнать, почему файл .xls, созданный phpSpreadsheet, поврежден? - PullRequest
0 голосов
/ 29 января 2019

Я написал скрипт 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');
    }        

?>

1 Ответ

0 голосов
/ 10 февраля 2019

Ромен Дуб, у меня была почти такая же проблема.Мой был слегка изменен.Я хотел xlsx, но продолжал получать ошибку, как и вы.После того, как моя электронная таблица была создана, я изменил расширение на xls, и у меня открылась электронная таблица, и когда она открылась, я обнаружил в таблице строки о паре неопределенных переменных.Если вам нужно исправить ошибку, возможно, проверьте свой код на наличие неопределенных переменных, вставляемых в вашу электронную таблицу.Просто идея, которая может или не может быть решением вашей проблемы.

...