PHPExcel Ошибка открытия файла xlsx после сохранения

Рейтинг: 5Ответов: 1Опубликовано: 21.01.2015

С помощью PHPExcel сохраняю файл в формате xlsx. Сохраняется нормально, а вот когда хочешь открыть Excel, выдает ошибку:

В книге "Отчет по резервам.xlsx" обнаружено содержимое, котрое не удалось прочитать. Попробовать восстановить содержимое книги? Если вы доверяете источнику этой книги, нажмите кнопку "Да".

Нажимаем Да - выводится сообщение:

Была выполнена проверка на уровне файла с последующим восстановлением файла. Некоторые фрагменты документа могли быть восстановлены либо удалены.

Генерируется XML с отчетом об ошибке:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>error048360_01.xml</logFileName>
    <summary>Обнаружены ошибки в файле
        "C:\Users\xxx\Downloads\Отчет по
        временным резервам с 01.01.2015
        (6).xlsx"
    </summary>
    <additionalInfo>

        <info>Была выполнена проверка на
            уровне файла с последующим
            восстановлением файла. Некоторые
            фрагменты документа могли быть
            восстановлены либо удалены.
        </info>
    </additionalInfo>
</recoveryLog>

Настройки PHPExcel:

<?
$outputFileType = 'Excel2007';
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $outputFileType);
$objWriter->setPreCalculateFormulas(false);

/*Сохраняем документ*/
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Disposition: attachment;filename=' . $nameXLS . '.xlsx');

Используется office 2010.

После всех сообщений отчет открывается, и всё с ним нормально, как и должно быть. Подскажите, как избавится от этих сообщений об ошибках?

Ответы

▲ 2

В общем, проблема решилась довольно-таки просто:

Оказалось, что нужно в коде указывать следующее сочетание:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
header('Content-Type: application/vnd.ms-excel');

либо

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

У меня же было так:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.ms-excel');

Что есть неправильно.