Tutorial CodeIgniter 4 Membuat fitur export excel menggunakan PhpSpreadsheet

Fitur export ke dalam format excel itu merupakan salah satu fitur yang biasa terdapat pada program yang kita buat. Biasanya fitur ini digunakan dalam modul reporting atau pembuatan laporan. Meski program kita sudah bisa mencetak laporan langsung, adakalanya pengguna itu memerlukan laporan dalam format yang berbeda, misalnya dalam format excel maupun pdf. Untuk memenuhi kebutuhan tersebut, edisi tutorial CodeIgniter 4 ini akan membahas tentang membuat fitur export excel di framework CodeIgniter 4 menggunakan salah satu library yang sering digunakan untuk menangani export excel yaitu library PhpSpreadsheet.

PhpSpreadsheet adalah sebuah library yang ditulis menggunakan bahasa pemrograman PHP dan menyediakan beberapa class yang memudahkan kita untuk menulis dan membaca file spreasheet dalam format seperti excel dan LibreOffice Calc. Di tutorial ini kita akan coba class untuk menuliskan file excel.

Selain format excel, ada beberapa format file yang disupport library ini. Untuk menulis, library ini mendukung format Open Document/OASIS (.ods), Office Open Xml (.xlsx) Excel 2007 ke atas, BIFF 8 (.xls) Excel 97 ke atas dan lain-lain. Karena di tutorial export to excel CodeIgniter sebelumnya itu tanpa library apapun dan tampaknya banyak yang tidak bisa buka file excel hasil generate dari codingannya, di tutorial ini saya mencoba menggunakan cara yang berbeda untuk membuat fitur export dalam format excel.

Web App Overview

Project studi kasus untuk fitur export excel ini kita buat sederhana. Pada project ini nanti hanya tampil halaman yang menampilkan button untuk memulai proses export ke format excel dengan menggunakan library PhpSpreadsheet.

Alur prosesnya pun cukup sederhana, ketika kita uji coba atau running di browser, tampil halaman awal, lalu kita klik button yang ada dan setelah itu ada proses export excel dan output akhirnya kita download file hasil export ke format excel.

Output dari project sederhana ini berupa file dengan format excel.

Persiapan

Untuk proses export data tentu kita perlu ada data terlebih dahulu. Untuk itu kita akan coba memanfaatkan hasil dari tutorial sebelumnya tentang generate dummy data menggunakan database seeder.

Untuk teman-teman yang sudah selesai project tersebut dapat langsung mengikuti tutorial export excel ini. Dan untuk yang belum ada hasil project tersebut, boleh mengikuti tutorial sebelumnya untuk persiapan.

Step 1 - Install library PHPSpreadSheet

Kawan, hal pertama yang akan kita lakukan adalah menginstall library. Seperti proses instalasi CodeIgniter 4, kita pakai composer untuk menginstall library PHPSpreadsheet. Buka terminal lalu run command ini ya..

composer require phpoffice/phpspreadsheet

Selanjutnya kita tunggu sampai proses instalasi selesai.

Step 2 - Membuat fitur export ke excel

Library PhpSpreadsheet sudah kita install, langkah selanjutnya adalah membuat fitur export ke excel.

Kita buat dulu model class sesuai dengan sample data yang kita punya. Buka kembali terminal, lalu run command berikut ini untuk generate model dengan nama UsersModel.

php spark make:model UsersModel

Output:

CodeIgniter v4.5.1 Command Line Tool - Server Time: 2024-05-08 13:57:36 UTC+00:00

File created: APPPATH/Models/UsersModel.php

Selanjutnya kita buat controller yang akan menangani proses export. Buka kembali terminal, lalu kita generate controller menggunakan spark command:

php spark make:controller User

Buka file yang baru saja kita generate menggunakan spark, yaitu file User.php. di direktori app/Controllers/. Kemudian kita modifikasi class controller User di dalam file User.php. Kita import terlebih dahulu library yang akan kita gunakan menggunakan statement use.

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\UsersModel;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class User extends BaseController
{
  // isi class User
}

Selanjutnya kita buat method baru untuk menghandle proses export ke excel.

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\UsersModel;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class User extends BaseController
{

    public function export()
    {
        $userModel = new UsersModel();
        $users = $userModel->findAll();

        $spreadsheet = new Spreadsheet();

        $spreadsheet->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Nama')
            ->setCellValue('B1', 'Email')
            ->setCellValue('C1', 'Tanggal dibuat');

        $column = 2;

        foreach ($users as $user) {
            $spreadsheet->setActiveSheetIndex(0)
                ->setCellValue('A' . $column, $user['name'])
                ->setCellValue('B' . $column, $user['email'])
                ->setCellValue('C' . $column, $user['created_at']);

            $column++;
        }

        $writer = new Xlsx($spreadsheet);
        $filename = date('Y-m-d-His'). '-Data-User';

        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename=' . $filename . '.xlsx');
        header('Cache-Control: max-age=0');

        $writer->save('php://output');
    }
}

Save kembali file User.php.

Pada tahapan ini kita sudah bisa melakukan proses export ke excel. Hanya saja kita mesti menuliskan urlnya langsung di address bar browser untuk mengaksesnya. Supaya lebih mudah untuk proses uji coba, kita buat user interfacenya.

Step 3 - Membuat halaman untuk download hasil export

Buka kembali file controller User.php, kita tambahkan method index() untuk menampilkan halaman untuk export ke excel.

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\UsersModel;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class User extends BaseController
{
    public function index()
    {
        return view('index');

    }

    // baris kode selanjutnya..

}

Sehingga keseluruhan class controller User menjadi seperti berikut ini.

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\UsersModel;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class User extends BaseController
{
    public function index()
    {
        return view('index');

    }

    public function export()
    {
        $userModel = new UsersModel();
        $users = $userModel->findAll();

        $spreadsheet = new Spreadsheet();

        $spreadsheet->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Nama')
            ->setCellValue('B1', 'Email')
            ->setCellValue('C1', 'Tanggal dibuat');

        $column = 2;

        foreach ($users as $user) {
            $spreadsheet->setActiveSheetIndex(0)
                ->setCellValue('A' . $column, $user['name'])
                ->setCellValue('B' . $column, $user['email'])
                ->setCellValue('C' . $column, $user['created_at']);

            $column++;
        }

        $writer = new Xlsx($spreadsheet);
        $filename = date('Y-m-d-His'). '-Data-User';

        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename=' . $filename . '.xlsx');
        header('Cache-Control: max-age=0');

        $writer->save('php://output');
    }
}

Selanjutnya kita buat file view index.php di folder app/Views, lalu kita tambahkan baris kode berikut ini.

<!DOCTYPE html>  
<html lang="en">  

<head>  
    <meta charset="UTF-8">  
    <meta http-equiv="X-UA-Compatible" content="IE=edge">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>Tutorial CodeIgniter 4 Export excel menggunakan PhpSpreadsheet at qadrLabs</title>  
</head>  

<body>  
<h2>Tutorial CodeIgniter 4 Export excel menggunakan PhpSpreadsheet at qadrLabs</h2>  
<form action="<?php echo site_url('user/export'); ?>" method="post">  
    <button type="submit">Export Excel</button>  
</form>  

</body>  

</html>

Seperti yang terlihat di baris kode di atas, tampilannya cukup sederhana. Pada halaman ini hanya menampilkan tulisan header dan button untuk memulai proses Export ke dalam format excel.

Step 4 - Definisikan route

Setelah update baru, codeigniter 4 secara default menonaktif-kan autoroute nya dan sebetulnya ini termasuk best practice. Jadi sekarang kita coba tambahkan route baru untuk halaman index dan proses export ke dalam format excel. Buka file app/Config/Routes.php, lalu temukan kode berikut ini.

$routes->get('/', 'Home::index');

Kita modifikasi supaya halaman untuk export yang pertama kali ditampilkan ketika project kita run.

$routes->get('/', 'User::index');

Selanjutnya kita tambahkan route untuk proses export.

$routes->post('/user/export', 'User::export');

Ya, kita arahkan ke method export() yang ada di dalam class User.

Uji Coba

Untuk uji coba, kita running dulu project kita. Kita buka terminal lalu run command berikut ini.

php spark serve

Selanjutnya buka browser, ketik url di addressbar.

http://localhost:8080

Project kita akan menampilkan halaman yang berisi tulisan dan juga button untuk proses export ke excel. Selanjutnya kita klik button Export excel untuk memulai proses export ke excel.

Ya kita bisa lihat file excelnya bisa kita download.

Penutup

Di edisi tutorial kali ini kita sudah coba membuat fitur untuk export ke dalam format excel menggunakan library PhpSpreadsheet. Kita coba untuk menuliskan file excel menggunakan class Writer dari library PhpSpreadsheet, yaitu class PhpOffice\PhpSpreadsheet\Writer\Xlsx. Dan setelah proses uji coba, berbeda dengan tutorial sebelumnya, di tutorial kali ini kita sudah bisa menuliskan dan menggenerate file excel (untuk saat ini) tanpa ada kendala.

Meski sample code yang dicontohkan masih sederhana, semoga memudahkan kamu untuk memahami dasar pengembangan fitur yang menggunakan library. Semoga bermanfaat dan sampai jumpa di edisi tutorial berikutnya.

Gun Gun Priatna
Software Engineer, Content Writer and Founder qadrlabs.com
Komentar

blog comments powered by Disqus