2013-09-20 6 views
1

Я работаю над Cakephp 2.x .. Я использую this решение для экспорта данных в лист Excel. Проблема в том, что я не знаю, как добавить имена столбцов или заголовки а затем поместить данные по столбцам ..cakephp экспортирует данные в файл excel или Csv

, например, вот что я делаю в данный момент

$this->CSV->addRow(array_keys($line)); 
foreach ($Contacts as $contact) 
{ 
     $line = $contact['Contact']; 

     $this->CSV->addRow($line); 
} 

$filename='orders'; 
echo $this->CSV->render($filename); 

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

 <table> 

<tr> 

    <th>Title</th> 
    <th>Body</th> 
    <th>Actions</th> 
</tr> 
<?php foreach($contacts as $contacts){?> 
    <tr> 

     <td> hello</td> 
     <td> hello</td> 
     <td> hello</td> 
    </tr> 
} 
    ?> 
+1

Если это всего лишь CSV, созданный здесь, я рекомендую https://github.com/josegonzalez/cakephp-csvview – mark

ответ

6

Моя рекомендация - использовать PHPExcel.

Вот что я сделал:

Я скачал файлы PHPExcel в папку поставщика.

Моя структура теперь:

app 
    |---Vendor 
     |----- PHPExcel 
        |----PHPExcel 
        |----PHPExcel.php 

мне нужно, чтобы сделать свои собственные раздвоенные изменения в PHPExcel для моих собственных причин. Поэтому я загрузил копию вместо использования последнего из репозитория с решением для управления пакетами, например, с помощью подмодулей git или композитора. Не стесняйтесь использовать их.

Затем я написал свой собственный код Lib в своем приложении cakephp.

app 
    |---Lib 
     |----- Print 
        |----Excel 
          |----SomeExcel.php 
          |----AnotherExcel.php 

Я написал два класса SomeExcel и AnotherExcel потому что мне нужно для создания двух различных файлов Excel.

Внутри SomeExcel я написал что-то вроде этого:

require_once(APP . DS . 'Vendor' . DS . 'PHPExcel' . DS . 'PHPExcel.php'); 

class SomeExcel { 
    private $yourOwnPrivateProperty; 
    private $objPHPExcel; 

    public function __construct($data) { 
     $this->objPHPExcel = new PHPExcel(); 
     $this->objPHPExcel->writeDebugLog = true; 

     $this->_createFilename(); 

    } 

    public function create() { 
     // you have to study PHPExcel yourself and write this 
     $this->_setFileProperties(); 
     // you have to study PHPExcel and write whatever you want 
     $this->_createSheets(); 
     $result = $this->_save(); 

     if ($result) { 
      return $this->_getAttachmentFormat(); 
     } else { 
      return $result; 
     } 
    } 

    protected function _save() { 
     $objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007'); 
     /* I will create the folder inside the webroot outputfiles folder 
     * in case it does not exist. 
     * I am not going to provide it here as it is not relevant to the question. 
     * You need to write your own. 
     */ 
     $this->_createFolder(); 
     try { 
      $objWriter->save($this->outputPath . $this->filename); 
     } catch (Exception $e) { 
      return false; 
     } 
     return true; 
    } 

    protected function _getAttachmentFormat() { 
     return array(
      $this->filename => array(
       'file' => $this->outputPath . $this->filename, 
       'mimetype' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
       'contentId' => 'excelfile-for-something' 
      ) 
     ); 
    } 

AnotherExcel класс похож.

Обычно это действие контроллера, которое запускает генерацию файла Excel. Однако, чтобы подчиняться принципу FatModel-ThinController, у меня есть метод Model для этого.

Так что есть действия контроллера, который так:

/** 
* print_to_excel method (testing only) 
* 
* @return void 
*/ 
public function print_to_excel($id = null) { 
    set_time_limit(120); 
    $result = $this->SomeModel->printExcel($id); 

    if (is_array($result)){ 
     $filename = key($result); 
     $this->redirect('/outputfiles/Excel/' . $id . '/' . $filename); 
    } 
} 

Внутри моей SomeModel, у меня есть следующие:

/** 
* 
* print excel file for said Quotation 
* 
* @param $id Quotation id 
* @throws NotExistException 
* @return boolean Return true if successful 
*/ 
public function printExcel($id = null) { 
    if (!$this->exists($id)) { 
     throw new NotFoundException(__('Invalid whatever')); 
    } 


    $data = $this->find('first', array(
     'conditions' => array('SomeModel.id' => $id), 
    )); 

    // do whatever you need to get the data you want printed in the Excel 

    App::uses('SomeExcel', 'Lib/Print/Excel'); 

    $someExcel = new SomeExcel($data); 

    return $someExcel->create(); 
} 

Это мой способ использования Excel и CakePHP

Это один из способов, но не единственный способ.

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

Используется не менее чем 10 людьми в этой компании.

+0

благодарю так много .. я попробую ваш код ... – mynameisbutt

+0

Я пробовал ваш код .. но не может пройти к нему. В нем указано, что адрес print_to_excel не найден.Мне все еще нужно создать представление для этого? Как заполнить его с помощью mySQL-запроса? Поскольку я заметил, что он прошел только Id. Спасибо .. – Ikong

+1

@never Мой код не является полным. Я забыл те части, которые не важны, чтобы помочь оригинальному плакату mynameisbutt. Однако я считаю, что одного ответа должно быть достаточно. Вам нужно принимать собственные решения о вещах, таких как контроллер или модель. В моем случае у меня есть модель под названием Quotation, которую нужно распечатать как excel. Следовательно, мой код, связанный с контроллером, находится внутри контроллера котировок и кода, связанного с моделью внутри Quotation. Другими словами, вы НЕ МОЖЕТЕ использовать мою копию кода без изменений. Вам нужно внести изменения в контекст. –

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

  • Нет связанных вопросов^_^