Usare PHPExcel con CodeIgniter

Mattepuffo's logo
Usare PHPExcel con CodeIgniter

Usare PHPExcel con CodeIgniter

PHPExcel è un'ottima libreria per creare file excel con PHP.

Ne ho già parlato in passato, ed ora useremo questa libreria dentro al framework CodeIgniter.

Prima di tutto scaricate la libreria da qua.

Dentro al file zip identificate la cartella Classes; il suo contenuto mettetelo dentro application/third_party.

A questo punto create un file nominato excel.php dentro a application/libraries:

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

require_once APPPATH . '/third_party/PHPExcel.php';

class Excel extends PHPExcel {

    public function __construct() {
        parent::__construct();
    }

}

Questo sarà il file che noi richiameremo nel controller, e altro non fa che richiamare la classe PHPExcel.

A questo punto procediamo nella creazione del model che eseguirà la query su db, e che richiameremo nel controller; ad esempio:

<?php

class Excel_model extends CI_Model {

    public function getEntrate() {
        $this->db->select('entrata_valore, causale_nome, conto_nome, entrata_data, entrata_note');
        $this->db->from('entrate');
        $this->db->join('causali', 'entrate.causale_id = causali.causale_id');
        $this->db->join('conti', 'entrate.conto_id = conti.conto_id');
        $this->db->order_by('entrata_data', 'desc');
        $this->db->limit(50);
        $query = $this->db->get();
        return $query->result();
    }

}

Se non volete prendere tutte le colonne della tabella, dovete specificare quali volete, altrimenti ve le ritroverete tutte nel file excel.

A questo punto passiamo al controller:

<?php

class CreateExcel extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->library('excel');
        $this->load->model('excel_model');
    }

    public function index() {
        $this->excel->getProperties()->setCreator('Matteo');
        $this->excel->getProperties()->setLastModifiedBy('Matteo');
        $this->excel->getProperties()->setTitle('Entrate');
        $this->excel->getProperties()->setSubject('Entrate');
        $this->excel->getProperties()->setDescription('Entrate Matteo');
        $this->excel->getActiveSheet()->SetCellValue('A1', 'Valore');
        $this->excel->getActiveSheet()->SetCellValue('B1', 'Causale');
        $this->excel->getActiveSheet()->SetCellValue('C1', 'Conto');
        $this->excel->getActiveSheet()->SetCellValue('D1', 'Data');
        $this->excel->getActiveSheet()->SetCellValue('F1', 'Note');
        $row = 2;
        $col = 0;
        $this->excel->setActiveSheetIndex(0);
        foreach ($this->excel_model->getEntrate() as $data) {
            foreach ($data as $key => $value) {
                $this->excel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value);
                $col++;
            }
            $row++;
            $col = 0;
        }
        $this->excel->getActiveSheet()->setTitle('Book');
        $filename = 'entrate.xls';
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $filename . '"');
        header('Cache-Control: max-age=0');
        $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
        $objWriter->save('php://output');
        redirect($_SERVER['HTTP_REFERER'], 'refresh');
    }

}

Nel costruttore richiamiamo la nostra libreria e il model.

Poi settiamo vari attributi e i valori delle 5 celle della prima riga; queste celle corrispondono a quelle selezionate nella query.

Con la variabile $row diciamo alla query di riempire il file dalla seconda riga, in quanto nella prima ci sono le 5 celle che fungono da intestazione (ovviamente tutto ciò non è obbligatorio).

Nel ciclo foreach richiamiamo la funzione del model, esguiamo la query, cicliamo sui risultati e riempieamo il file.

Infine inviamo un header per salvare il file sul pc locale; qua ho impostato l'header per un file excel con formato XLS, ma volendo potete impostarlo anche per i file XLSX.

Non rimane altro che richiamare questo controller da qualche parte, ad esempio con un banale link:

<?php echo anchor('createexcel', 'Download Entrate'); ?>

Ciao!!


Condividi

2 Commenti

  • David

    Come non detto ;-) Ho trovato l'errore Tks

    22/04/2013
  • David

    Salve innanzitutto tks per il tutorial..<br />ma ho un problema mi da sempre il seguente errore:<br /><br />Fatal error: Cannot redeclare class Excel in /var/www/domain.ext/trunk/code/application/libraries/excel.php on line 7

    22/04/2013

Commentami!