Home / Programmazione / PHP / Usare PHPExcel con CodeIgniter
Mattepuffo

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!!