CodeIgniter 3: Export Excel Dari HTML

Cara export atau membuat file Excel dari HTML menggunakan library PhpSpreadsheet di CodeIgniter 3

Hasil export nya rapi dan sesuai dengan format. Bisa di open, di edit isinya, di save, semuanya lancar. Bahkan bisa dibuka juga di WPS Office.

Download library menggunakan composer

composer require phpoffice/phpspreadsheet

Set autoload composer di file application/config/config.php

$config['composer_autoload'] = 'vendor/autoload.php';

Buat file view application/views/excel.php sebagai template yang akan di export ke Excel nantinya

<h3>LAPORAN DATA REGISTRASI</h3>

<table>
    <thead>
        <tr>
            <th>No</th>
            <th>Tanggal</th>
            <th>Nama Siswa</th>
            <th>Nomor WA</th>
        </tr>
    </thead>
    <tbody>
        <?php $no = 1 ?>
        <?php foreach ($registrasi as $row) : ?>
            <tr>
                <td><?= $no++ ?></td>
                <td><?= $row['tanggal'] ?></td>
                <td><?= $row['nama_siswa'] ?></td>
                <td><?= $row['nomor_wa'] ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

Di controller bikin method untuk export excel, contoh URL laporan/excel

application/controllers/Laporan.php

use PhpOffice\PhpSpreadsheet\Reader\Html;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class Laporan extends CI_Controller
{
    // ...

    public function excel()
    {
        // load data dari model
        $data['registrasi'] = $this->registrasi_model->findAll();

        // view template
        $html = $this->load->view('excel', $data, TRUE);

        $reader = new Html();
        $spreadsheet = $reader->loadFromString($html);

        $worksheet = $spreadsheet->getActiveSheet();

        // merge cell A1 sampai D1
        // karena tabel yang digunakan 4 kolom
        // maka header nya di merge 4 cell
        $worksheet->mergeCells('A1:D1');

        // setelah di merge lalu di center horizontal
        $worksheet->getStyle('A1:D1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

        // tambahkan baris kosong di row ke-2
        // supaya setelah header gak langsung ke tabel
        $worksheet->insertNewRowBefore(2, 1);

        // set style untuk semua cell
        $style = [
            'font' => ['size' => 12],
            'alignment' => ['vertical' => Alignment::VERTICAL_TOP],
        ];
        $worksheet->getStyle($worksheet->calculateWorksheetDimension())->applyFromArray($style);

        // set lebar kolom auto size, jadi lebih rapi
        foreach ($worksheet->getColumnIterator() as $column) {
            $worksheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
        }

        // tambahkan border tapi hanya untuk tabel/datanya
        // A3 berarti baris ketiga, karena yang pertama header, kedua baris kosong
        // range sampai cell D karena empat kolom datanya
        $worksheet->getStyle('A3:D' . $worksheet->getHighestRow())->applyFromArray([
            'borders' => [
                'allBorders' => [
                    'borderStyle' => Border::BORDER_THIN
                ]
            ]
        ]);

        // header untuk auto download, filename bisa diganti untuk nama file hasil export
        header("Content-Type: application/vnd.ms-excel");
        header("Content-Disposition: attachment; filename=laporan-registrasi.xlsx");
        header("Cache-Control: max-age=0");

        $writer = new Xlsx($spreadsheet);
        $writer->save("php://output");

        exit();
    }
}

Selesai. Jika URL laporan/excel diakses, maka akan langsung mengunduh file excel nya.

Referensi