PhpExcel не будет создавать файл на IE10

Я использую PhpExcel для создания файлов, содержащих переменное количество данных. Вот как это работает:

  • Пользователь выбирает дату начала и дату окончания
  • Список профилей генерируется
  • Пользователь нажимает кнопку "To Excel", и создается файл, содержащий список событий между двумя выбранными датами для каждого профиля.
  • После создания каждого xlsx-файла создается zip-архив и появляется окно загрузки.

Я проверил это на FF, Chrome, Opera и IE9, и все, кажется, хорошо. Zip-архив действителен, и я могу извлечь все xlsx файлы, которые сгенерированы правильно.

К сожалению, в IE10 происходит нечто странное: это работает только половину времени (я пробовал один раз, это не работало. Я обновлял. Это работало. Я обновлял. Это не работало и так далее). Что происходит, что один или несколько файлов xlsx отсутствует. Например, я ожидал получить 16 файлов и получил только 15.

Поэтому я сделал что-то вроде этого: когда пользователь нажимает кнопку "В Excel", для каждого элемента списка выполняется запрос AJAX и вызывается "Сценарий Excel".

$.ajax({
   type: "GET",
   url: "rap_spec_excel_alt.php",
   data: "displayFacturation="+displayFacturation+"&startDateRapSpec="+startDate+"&endDateRapSpec="+endDate+"&codeEntSpec="+thisVal+"&delete=0&download=0&nbfiles="+nbFilesExpected,
   success: function(data) {       
   },
   error: function() {   
   }   
});

Я также проверяю, является ли текущий элемент первым или последним элементом списка. Если это первый элемент в моем "Сценарии Excel", я очищаю временную папку, содержащую старые файлы xlsx. Если это последний элемент, в случае успеха я называю "Zip Script" следующим образом:

window.open("download_xls_zip.php?nbfiles="+nbFilesExpected);

Таким образом, у меня есть "подтвердить загрузку". Мой "Сценарий Excel" огромен, поэтому я не буду публиковать его полностью, но вот проблеск:

//Delete old files
if ($_GET["delete"] == 1) {
    $files = glob('tempxls/*');
        foreach($files as $file){
          if(is_file($file)) {
              unlink($file);
          }
     }
}

//PHPExcel
include '../libs/pclzip/pclzip.lib.php';
error_reporting(E_ALL);
include '../libs/phpexcel/Classes/PHPExcel.php';
include '../libs/phpexcel/Classes/PHPExcel/Writer/Excel2007.php';

$objPHPExcel = new PHPExcel();

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

$objPHPExcel->getProperties()->setCreator("John Doe");
$objPHPExcel->getProperties()->setLastModifiedBy("John Doe");
$objPHPExcel->getProperties()->setTitle($year.$month."_".$_GET["codeEntSpec"]);
$objPHPExcel->getProperties()->setSubject("File for ".$_GET["codeEntSpec"]);
$objPHPExcel->getProperties()->setDescription("File for ".$_GET["codeEntSpec"]);

$objPHPExcel->getDefaultStyle()->getFont()->setName('Arial');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(8); 

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(7.33);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(8);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(9.33);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(22.67);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15.67);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(14.67);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(10.83);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(9);

$objPHPExcel->setActiveSheetIndex(0);

//... AND SO ON ...

$objPHPExcel->getActiveSheet()->setTitle("File for ".$_GET["codeEntSpec"]);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('tempxls/'.$year.$month.'_'.$_GET["codeEntSpec"].'.xlsx');

Когда вызывается "Zip Script", он знает, сколько файлов должно быть во временной папке. Таким образом, он ожидает, пока не будет получен каждый файл, а затем создается zip-архив.

//PCLZip
include '../libs/pclzip/pclzip.lib.php';

//Number of files expected  
$nbFilesExpected  = $_GET["nbfiles"];

$filecount = 0;

//Count the files in the folder 
while ($filecount != $nbFilesExpected) {
    $dir = 'tempxls';

    $i = 0; 
    if ($handle = opendir($dir)) {
    while (($file = readdir($handle)) !== false){
        if (!in_array($file, array('.', '..')) && !is_dir($dir.$file)) 
            $i++;
        }
    }

    $filecount = $i;
}

//Zip archive
if ($filecount == $nbFilesExpected) {

    $archive = new PclZip('tempzip/archive.zip');
    $archive->add('tempxls/');

    header("content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=archive.zip"); 
    readfile("tempzip/archive.zip"); 
    flush(); 
    unlink("tempzip/archive.zip");
}

Как я уже сказал, все хорошо с FF, Chrome, Opera и IE9. Здесь есть файлы, zip-архив и xlsx-файлы с правильными данными. Но не в IE10...

Что я заметил, так это то, что если я выберу большой интервал между каждой датой, у меня будет гораздо больше данных (конечно). Итак, некоторые файлы не создаются, потому что они слишком большие (у меня есть некоторые ограничения на моем сервере) и появляется фатальная ошибка. Таким образом, ZIP-архив не может быть создан, потому что некоторые файлы отсутствуют.

Я думал, что это может быть ответом, и я пытался решить проблему с "$cacheMethod", но это не сработало. Когда возникает проблема, я смотрю в консоли IE10, но там ничего нет (я даже установил Firebug в IE...).

Может кто-нибудь может мне помочь или просто объяснить, что я делаю не так? Было бы очень благодарно! Большое спасибо!

РЕДАКТИРОВАТЬ

Вот что я получаю, когда использую Firebug на IE10

Заголовки

ResponseHeaders
> Date Tue, 20 Aug 2013 09:06:37 GMT 
> Server Apache
> Expires Thu, 19 Nov 1981 08:52:00 GMT
> Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
> Pragma no-cache
> Connection close
> Content-Type text/html

RequestHeaders
> Accept */* 
> X-Requested-With XMLHttpRequest 

отклик

пустой

РЕДАКТИРОВАТЬ 2

Кажется, работает, если я установил:

async: false

Итак, файлы создаются один за другим. Затем в моем zip-архиве есть нужное количество файлов xlsx.

0 ответов

Другие вопросы по тегам