Creare file excel con PHP

Mattepuffo's logo
Creare file excel con PHP

Creare file excel con PHP

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

Include molte funzionalità, è semplice da usare ed è in grado di creare file xls, xlsx, pdf, ecc.

Qui vi mostro come creare un file excel interrogando una tabella MySQL usando PDO, e non è stato affatto semplice arrivarci e per questo ringrazio l'utente bstefano79 del forum HTML.it.

Prima di tutto la connessione con PDO.

Non ve la spiego passo per passo in quanto spiegata qua.

Sappiate solo che ho una cartella moduli con dentro un file config.php che contiene la classe Config dove dentro ho la conessione al db con varie funzioni.

Vi riporto la parte che ci interessa:

<?php

class Config {

    private $pdo;

    public function __construct() {
        try {
            $this->pdo = new PDO('mysql:host=localhost;dbname=db', "user", "pass", array(
                        PDO::ATTR_PERSISTENT => TRUE
                    ));
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
    }

    public function selectEx() {
        $result = array();
        try {
            $stmt = $this->pdo->prepare("CALL getBookEx()");
            $stmt->execute();
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $result;
        } catch (PDOException $e) {
            return "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
    }
    ...................

}

A noi interessa la funzione selectEx().

Scaricate PHPExcel da qua, estraete la sottodirectory Classes e mettetela nel sito.

Io l'ho rinominata lib.

A questo punto io nella pagina ho messo un form con un pulsante:

<table>
    <form method="post" action="">
        <tr>
            <td>
                Excel:
            </td>
            <td>
                <input type="submit" value="Create excel file" name="excel" />
            </td>
        </tr>
    </form>
</table>

Sotto alla tabella ho messo tutta questa roba qua:

<?php

include_once 'moduli/config.php';
$exp_tpl = new Config();
if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['excel'])) {
    include_once 'lib/PHPExcel.php';
    include_once 'lib/PHPExcel/Writer/Excel5.php';

    $objPHPExcel = new PHPExcel();
    $objPHPExcel->getProperties()->setCreator("Matteo");
    $objPHPExcel->getProperties()->setLastModifiedBy("Matteo");
    $objPHPExcel->getProperties()->setTitle("My library");
    $objPHPExcel->getProperties()->setSubject("My library");
    $objPHPExcel->getProperties()->setDescription("My library.");

    $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Title');
    $objPHPExcel->getActiveSheet()->SetCellValue('B1', 'Author');
    $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Editor');
    $objPHPExcel->getActiveSheet()->SetCellValue('D1', 'Price');
    $objPHPExcel->getActiveSheet()->SetCellValue('E1', 'Isbn');
    $objPHPExcel->getActiveSheet()->SetCellValue('F1', 'Note');

    $row = 2;
    $col = 0;
    $objPHPExcel->setActiveSheetIndex(0);
    $field = $exp_tpl->selectEx();
    foreach ($field as $data) {
        foreach ($data as $key => $value) {
            $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value);
            $col++;
        }
        $row++;
        $col = 0;
    }

    $objPHPExcel->getActiveSheet()->setTitle('Book');

    $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
    $objWriter->save("book.xls");

    echo '<br/><a href="http://localhost/book/book.xls">Download</a>';
}

Ho incluso config.php e creato un'istanza di quella classe.

Quando il form invia il submit includo due librerie di PHPExcel:

  • quella base
  • e quella per creare normali file xls

PHPExcel è totlamente Object Oreinted, e quindi per usarla ho istanziato una classe PHPExcel.

Su quella istanza imposto un pò di proprietà, e imposto la prima riga del file excel.

Finora niente di particolare.

Subito sotto imposto $row e $col che corrispondo al numero di riga e colonna.

Badate che la riga deve inziare almeno da 1; da me inzia da 2 in quanto la prima è occupata dalle celle impostate sopra.

Poi imposto lo sheet da usare (se ne possono impostare diversi).

A questo punto richiamo il metodo selectEx() che fa la query sul db; usando PDO fetchAll() eseguo due foreach per scandagliare righe e colonne dalla tabella.

Nel secondo ciclo, per ogni valore trovato imposto il valore della cella con setCellValueByColumnAndRow, che richiede il numero di colonna, di riga e il valore.

Come vedete $row e $col sono autoincrementati ad ogni ciclo.

E state anche attenti che per ogni primo ciclo $col deve essere reimpostato a 0; fate una prova per vedere la differenza.

Impostiamo il titolo e salviamo il file usando il metodo save() di PHPExcel_Writer_Excel5.

Il file viene salvato sul server; quindi io ho aggiunto un link per poterlo scaricare.

Come vedete usare la libreria è abbastanza facile; l'unico problema avuto è stato sui cicli e il fetchAll di PDO.


    Condividi

    1 Commenti

    • Aligattor Aligate

      Thx a Lot Brother

      04/11/2014

    Commentami!