2017-02-02 23 views
0

Я использую PHPExcel для экспорта отчета.Ошибка PHPExcel при сохранении

Это дало мне ошибку, когда я запускаю его в Интернете (используя PHP 5.6) ..

Но, когда я тест на моем локальном хосте, это нормально. Работает отлично (с помощью PHP 5.4.31)

Вот мой код

function downloadExcelBrand($brand,$tglAwal,$tglAkhir) 
{ 

    $this->load->library('php_excel'); 

    $objPHPExcel = new PHPExcel(); 
    // print_r($objPHPExcel);die(); 
    $objPHPExcel->setActiveSheetIndex(0); 

    $objPHPExcel->getActiveSheet()->SetCellValue('A1', "Concept"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('B1', $brand); 

    $objPHPExcel->getActiveSheet()->SetCellValue('A2', "Period"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('B2', $tglAwal." to ".$tglAkhir); 

    $objPHPExcel->getActiveSheet()->SetCellValue('A5', "Boutique"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('B5', "Q1"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('C5', "Q2"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('D5', "Q3"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('E5', "Q4"); 
    $objPHPExcel->getActiveSheet()->SetCellValue('F5', "BBC Score"); 

    $data = $this->surveymodel->getDataLaporanBrand($brand,$tglAwal,$tglAkhir); 
    // print_r($data);die(); 
    $i = 5; 
    foreach ($data as $index=>$value) { 
     // print_r($data[$index+1]);die(); 
     if($index%4 == 0){ 
      $i++; 
      // print_r($value["Score"]);print_r($value['TotalData']);die(); 
      $AvgQ1 = $value["Score"]/$value['TotalData']; 
      // print_r($AvgQ1);die(); 
      $AvgQ2 = $data[$index+1]["Score"]/$data[$index+1]['TotalData']; 
      $AVGQ3 = $data[$index+2]["Score"]/$data[$index+2]['TotalData']; 
      $AvgQ4 = $data[$index+3]["Score"]/$data[$index+3]['TotalData']; 
      $BSC = $AvgQ1+$AvgQ2+$AVGQ3+$AvgQ4; 

      $objPHPExcel->getActiveSheet()->SetCellValue('A'.$i, $value["boutiqueID"]); 
      $objPHPExcel->getActiveSheet()->SetCellValue('B'.$i, $AvgQ1); 
      $objPHPExcel->getActiveSheet()->SetCellValue('C'.$i, $AvgQ2); 
      $objPHPExcel->getActiveSheet()->SetCellValue('D'.$i, $AVGQ3); 
      $objPHPExcel->getActiveSheet()->SetCellValue('E'.$i, $AvgQ4); 
      $objPHPExcel->getActiveSheet()->SetCellValue('F'.$i, $BSC); 
     } 
    } 

    // Instantiate a Writer to create an OfficeOpenXML Excel .xlsx file 
    $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
    // Write the Excel file to filename some_excel_file.xlsx in the current directory 
    header('Content-type: application/vnd.ms-excel'); 
    // It will be called file.xls 
    header('Content-Disposition: attachment; filename="Report_By_Brand.xlsx"'); 
    // Write file to the browser 
    $objWriter->save('php://output'); 
} 

странные вещи происходят, когда я удалить $objWriter->save('php://output'); код. Он просит о спасении первенствовать, но файл Excel не может быть открыт, так как он поврежден ..

* EDIT

  • Ошибка

    Этот сайт не может быть достигнуто веб-страница в http://my-link-in-here может быть временно недоступна или, возможно, переместилась на новый веб-адрес. ERR_INVALID_RESPONSE

* UPDATE

  • Я пытаюсь добавить ob_end_clean(); или ob_clean(); перед тем $objWriter->save('php://output'); и сохранения Excel, но я не могу открыть его, потому что Excel говорит «Формат файла или файла Удлинитель является недействительно".

  • Я стараюсь изменить расширение xlsx на xls на filename свойствах, и теперь Excel можно открыть. Но это показывает ошибку PHP Message: ob_end_clean(): failed to delete buffer. No buffer to delete

  • я стараюсь держать расширение, но я удалил ob_end_clean();, и ошибка приходит снова ..

* Решение:

  • Я изменил код Excel5

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
    header('Content-Type: application/vnd.ms-excel'); 
    header('Content-Disposition: attachment;filename="userList.xls"'); 
    

    И это работает как чемпион. Кто-нибудь может сделать объяснение? Я дам решение тот, кто может сделать Объяснение

+0

В чем ошибка? – Beginner

+0

вот ошибка @Beginner 'Этот сайт не может быть достигнут. Веб-страница по адресу http: // the-link-in-here может быть временно недоступна или, возможно, переместилась на новый веб-адрес. ERR_INVALID_RESPONSE' –

+0

Я не могу дать объяснения: но, возможно, если вы посмотрели в своих файлах журналов или открыли файл, сгенерированный в текстовом редакторе, чтобы увидеть, содержит ли оно какие-либо сообщения об ошибках, он может предоставить вам объяснение –

ответ

0

Добавить ob_end_clean()

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
    header('Content-Disposition: attachment;filename="Filename.xlsx"'); 
    header('Cache-Control: max-age=0'); 
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); 
    ob_end_clean(); 
    $objWriter->save('php://output'); 
    exit; 
+0

добавление 'ob_end_clean()' устраняет ошибку и разрешает загрузку файла. Но загруженный файл по-прежнему не может быть открыт. Говорят, формат или файл extenstion недействительны –

+0

Что делать, если вы меняете 'header ('Content-type: application/vnd.ms-excel');' to 'header ('Content-Type: application/vnd. openxmlformats-officedocument.spreadsheetml.sheet '); ' –

+0

По-прежнему не удается открыть файл. И он все еще говорит ту же ошибку @Jordan Sipahutar http://imgur.com/a/ehsT6 –

0

Я была такая же проблема с 4000 + строк. Проблема в увеличении как предела памяти, так и временного ограничения.

Причина для поведения ERR_INVALID_RESPONSE заключается в том, что вы отправляете заголовки xls/x, а затем http-ошибка 500 из-за нехватки памяти или времени.

set_time_limit(120); 
ini_set('memory_limit', '256M'); 
... 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
ob_end_clean(); 
$objWriter->save('php://output'); 
exit; 
0

Я нашел исправить, перейдите Classes/PHPExcel/Writer/Excel2007.php комментарий из следующих строк, PHP 7 имеет тип даты возврата странно так делает это позволит PHP первенствует работать в PHP 7 Pronto. любой способ

$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); 
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); 
PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); 

в

//$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); 
//PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); 
//PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); 

работал для меня.