2015-03-18 5 views
0

Я пытаюсь экспортировать gridview в excel xls в Yii. Для этого я использовал расширение PHPExcel. Он работает на localhost, но не на реальном сервере.Экспорт в excel xls не работает на реальном сервере

Ниже моя модель функция:

public function downloadOrderReport($model){ 

     Yii::import('ext.phpexcel.XPHPExcel'); 

     $objPHPExcel= XPHPExcel::createPHPExcel(); 

     ini_set ('memory_limit', '150M'); 

     $fileName=DOWNLOADFILENAME.'.xls'; // download file name 

     // Add some data 
     $objPHPExcel->setActiveSheetIndex(0); 

     $columnName=array("ID"=>"Order Number","AddedOn"=>"Order Date","DealerID"=>"Dealer Name","SubmittedByUserID"=>"Executive Name","OrderStatusID"=>"Order Status","TotalAmount"=>"Order Amount"); 

     $col = 0; 
     $row = 1;  
     foreach($columnName as $key=>$value) { 
      $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value); 
      $col++; 
     } 

     $criteria=new CDbCriteria; 
     $criteria->with = array('dealer'=>array("select"=>"Name"),'submittedByUser'=>array("select"=>"Name"),'ApprovedOrRejectedByUser'=>array("select"=>"Name"),'orderStatus'=>array('select'=>'OrderStatus,ID')); 
     $criteria->condition = "t.IsDeleted <> '".DELETED."'"; 

     if((isset($model->from_date) && trim($model->from_date) != "") && (isset($model->to_date) && trim($model->to_date) != "")){ 
      $criteria->condition .= ' AND t.AddedOn >="'.date("Y-m-d",strtotime($model->from_date)).'" AND t.AddedOn <="'.date("Y-m-d",strtotime($model->to_date)).'"'; 
     } 

     $criteria->compare('t.ID',$model->ID); 
     $criteria->compare('dealer.Name',$model->DealerID,true); 
     $criteria->compare('submittedByUser.Name',$model->SubmittedByUserID,true); 
     $criteria->compare('OrderStatusID',$model->OrderStatusID,true); 
     $criteria->compare('ApprovedOrRejectedByUser.Name',$model->ApprovedOrRejectedByUserID,true); 
     $criteria->compare('Remarks',$model->Remarks,true); 
     $criteria->compare('TotalAmount',$model->TotalAmount); 
     $criteria->compare('IsDeleted',$model->IsDeleted); 
     $criteria->compare('AddedOn',$model->AddedOn,true); 

     $criteria->order = "t.ID ASC"; 

     $getOrderDetails = Orders::model()->findAll($criteria); 
     $row = 2; 
     $grandTotal = 0.0; 
     foreach($getOrderDetails as $details){ 
      $OrderID = $details->ID; 
      $DealerName = $details->dealer->Name; 
      $ExecutiveName = $details->submittedByUser->Name; 
      $OrderStatus = $details->orderStatus->OrderStatus; 
      $OrderDate = date('d-m-Y',strtotime($details->AddedOn)); 
      $OrderTotalAmount = $details->TotalAmount; 
      $grandTotal = $grandTotal + $OrderTotalAmount; 

      $columnValue=array($OrderID,$OrderDate,$DealerName,$ExecutiveName,$OrderStatus,$OrderTotalAmount);   


      for($col=0; $col<=ORDERREPORTCSVCOLUMNCOUNT; $col++){ 
       $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $columnValue[$col]); 
      } 
      $row++; 

     } 
     $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(LABELCOUNT, $row, "Grand Total(Rs.)"); 
     $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(GRANDTOTALCOLUMNCOUNT, $row, $grandTotal); 

     // Rename worksheet 
     $objPHPExcel->getActiveSheet()->setTitle('Order Report'); 


     // Set active sheet index to the first sheet, so Excel opens this as the first sheet 
     $objPHPExcel->setActiveSheetIndex(0); 

     // Redirect output to a client web browser (Excel5) 
     header('Content-Type: application/vnd.ms-excel'); 
     header('Content-Disposition: attachment;filename="'.$fileName.'"'); 
     header('Cache-Control: max-age=0'); 
     // If you're serving to IE 9, then the following may be needed 
     header('Cache-Control: max-age=1'); 

     // If you're serving to IE over SSL, then the following may be needed 
     header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
     header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified 
     header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 
     header ('Pragma: public'); // HTTP/1.0 


     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
     $objWriter->save('php://output'); 

     Yii::app()->end(); 
    } 

При попытке открыть файл XLS на сервере. В нем говорится: «Файл, который вы пытаетесь открыть,« XXXX.xls »находится в другом формате, чем указано расширением файла. Убедитесь, что файл не поврежден и находится из надежного источника, прежде чем открывать файл. файл сейчас? ».

Если я говорю «да», файл открывается, но содержит только специальные символы.

Уверен, что он имеет какое-то отношение к заголовку. Но не в состоянии выяснить точную причину. Пожалуйста помоги.

Скриншот: enter image description here

+0

Какая ошибка, которую вы получаете? –

+0

@DanyalSandeelo: Я не получаю никаких ошибок. Но файл содержит только специальные символы, которые не читаются. – Chinmay

+0

весь файл полон специальных символов? или некоторые из персонажей являются особенными? –

ответ

1

Понял работает :) Просто очистить выходной буфер перед заголовком, чтобы убедиться, что ничего не буферизацией.

Для тех, кто сталкивается с такой же проблемой, просто добавьте эти 2 строки перед заголовком в приведенном выше коде.

ob_end_clean(); 
ob_start(); 

Что он делает, сначала он стирает/очищает выходной буфер и отключает буферизацию вывода.

Затем мы снова включили выходную буферизацию. Так что никакой вывод не отправляется из сценария (кроме заголовков), вместо этого вывод сохраняется во внутреннем буфере.

+0

Я потратил почти 2 дня на исправление этой проблемы, спасибо большое :) –

Смежные вопросы