2013-06-10 2 views
0

Мне удалось создать документ excel с использованием php, но я получаю сообщение об ошибке при каждом открытии документа, хотя все остальное в порядке. ошибка the file you are trying to open is in different format than specified by the file extension ...Открытие документа excel, созданного php

Мой код для экспорта в Excel:

public function actionExportToExcel() { 

     //header('Content-type: text/csv'); 
     header('Content-Disposition: attachment; filename="project-report-' . date('YmdHi') .'.xls"'); 
     header("Content-Type: application/ms-excel"); 

     $model=new ViewWebprojectreport('search'); 
     $model->unsetAttributes(); // clear any default values 

     if(Yii::app()->user->getState('exportModel')) 
      $model=Yii::app()->user->getState('exportModel'); 


     $dataProvider = $model->search(false); 
     $dataProvider->pagination->pageSize = $model->count(); 
     // csv header 
     echo ViewWebprojectreport::model()->getAttributeLabel("StartDATE")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("PROJECT")."\t". 
       "Survey Number\t". 
       ViewWebprojectreport::model()->getAttributeLabel("ActualEndDate")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("OFFICE")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("PERCENT")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("PERCENTPlanned")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("KM")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("KMPlanned")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("COUNTRY")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("AREA")."\t". 
       ViewWebprojectreport::model()->getAttributeLabel("ASAAREA"). 
       " \r\n"; 
     // csv data 
     foreach ($dataProvider->getData() as $data) { 
      //if you want all data use this looop 
      /*foreach ($data as $key => $value) { 
       echo $value.","; 
      } 
      echo "\r\n";*/ 
      echo "$data->StartDATE\t$data->PROJECT\t".$data->PROJCODE . $data->PROJID ."\t$data->ActualEndDate\t$data->OFFICE\t$data->PERCENT\t$data->PERCENTPlanned\t$data->KM\t$data->KMPlanned\t$data->COUNTRY\t$data->AREA\t$data->ASAAREA\t\r\n"; 
     } 


    } 

Я не хочу, чтобы экспортировать в CSV, но прямо в файл формата Excel. Что мне не хватает?

+1

Одним из вариантов является использование одного из многих библиотек Excel для PHP, чтобы написать реальный Биф формат .xls или формат OfficeOpenXML .xlsx файл - http://stackoverflow.com/questions/3930975/alternative-for-php-excel –

ответ

1

Это потому, что файл на самом деле в основном представляет собой файл CSV с расширением XLS, чтобы открыть его в Excel. Дополнительную информацию см. В этом документе Microsoft: http://support.microsoft.com/kb/948615 - это происходит в новых версиях Excel. Старшие будут счастливо экспортировать их.

Причина этого в том, что гораздо проще экспортировать CSV-файл, чем в Excel. Я хотел бы написать подходящего экспортера Excel, но это займет время, чтобы прочитать и понять формат файла Excel, и у меня еще не было возможности это сделать.

Один из вариантов - просто переименовать имя файла в .csv и сохранить пользовательский интерфейс, говоря, что это файл Excel (Excel с удовольствием читает файлы csv). Учитывая, что Windows имеет тенденцию скрывать расширение файла, это кажется довольно привлекательным вариантом.

Было бы полезным решением для решения разнообразных видов проблем первенствовать - link

дайте мне знать, если я могу помочь вам больше.

+0

'Я бы хотел написать подходящий экспортер Excel, но это займет время, чтобы прочитать и понять формат файла Excel, и у меня еще не было возможности сделать это .' - удачи –

+0

спасибо за ваш комментарий @MarkBaker – liyakat

+0

сделал выбор, перекрещивая мой разум, но мои пользователи тупые. поскольку они будут применять фильтры и форматировать его данные при сохранении, отобразится другое предупреждение, которое смутит всех пользователей. – shorif2000

0

Я использовал PHPExcel

$objPHPExcel = new PHPExcel(); 
    spl_autoload_register(array('YiiBase', 'autoload')); 

    $objPHPExcel->getProperties()->setCreator(Yii::app()->user->__userInfo['name']) 
     ->setLastModifiedBy(Yii::app()->user->__userInfo['name']) 
     ->setTitle("Weekly Status") 
     ->setSubject("Weekly Status"); 

    $sheet = $objPHPExcel->setActiveSheetIndex(0); 
    $highestRow = $sheet->getHighestRow(); 
    $highestColumn = $sheet->getHighestColumn(); 

    $model=new ViewWebprojectreport('search'); 
    $model->unsetAttributes(); // clear any default values 

    if(Yii::app()->user->getState('exportModel')) 
     $model=Yii::app()->user->getState('exportModel'); 


    $dataProvider = $model->weeklystatus(array(),true,false); 
    $dataProvider->pagination->pageSize = $model->count(); 

    //data 
    foreach ($dataProvider->getData() as $data) { 
     //if you want all data use this looop 
     $highestColumn = "A"; 
     foreach ($data as $key => $value) { 
      if(! in_array($key,array("id","PROCESSOR","DEPTCODE","PERCENTPlanned","MCSALE"))){ 
       if($key == "name") 
        $key = "Client"; 
       else 
        $key = ViewWebprojectreport::model()->getAttributeLabel("$key"); 
       if($highestRow == 1){ 
        $sheet->setCellValue($highestColumn.$highestRow,$key); 
        //Yii::log($key,"ERROR"); 
       } 
       //echo $value.","; 
       if($highestRow == 1){ 
        $highestRow++; 
        $sheet->setCellValue($highestColumn.$highestRow,$value); 
        $highestRow--; 
       }else 
        $sheet->setCellValue($highestColumn.$highestRow,$value); 

       $highestColumn++; 
      } 


     } 
     //Yii::log($highestRow,"ERROR"); 
     if($highestRow == 1) 
      $highestRow++; 

     $highestRow++; 
     //echo "\r\n";*/ 
     //echo "$data->StartDATE\t$data->ProjectEndDate\t$data->PROJECT\t".$data->PROJCODE . $data->PROJID ."\t$data->ActualEndDate\t$data->PROCESSOR\t$data->OFFICE\t$data->DEPTCODE\t$data->PERCENT\t$data->PERCENTPlanned\t$data->KM\t$data->KMPlanned\t$data->MC\t$data->MCSALE\t$data->CATEGORY\t$data->COUNTRY\t$data->AREA\t$data->PROJINFO\t$data->REGION\t$data->ASAAREA\t\r\n"; 
    } 


    $filename = $_GET['type'].'statusreport_'.date('Y-m-d_H-i-s_T').'.xls'; 

    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(Yii::app()->params['exportToDir'].$filename); 
    $objWriter->save('php://output'); 
    Yii::app()->end(); 
Смежные вопросы