Export Data MySQL ke File XLSX dengan Codeigniter 3
Export Data MySQL ke File XLSX dengan Codeigniter 3 Codeigniter [docs/kuhomi.id].

Export Data MySQL ke File XLSX dengan Codeigniter 3

Artikel sebelumnya, gua pernah berbagi tutorial mengenai bagaimana caranya import data dari file spreadsheet ke database MySQL. Untuk artikelnya, bisa kalian cek disini: Import Data dari File XLSX ke Database MySQL dengan Codeigniter 3.

Pada artikel ini, gua mau berbagi tutorial mengenai bagaimana caranya export data dari MySQL ke file spreadsheet dengan Codeigniter 3.

Adapun library package PHP yang gua gunakan pada tutorial ini masih sama dengan yang sebelumnya, yaitu PhpSpreadshheet.

Fitur export data ini dikembangkan ketika ada kebutuhan user ingin menarik kembali data yang telah disimpan pada database untuk diolah lebih lanjut.

Sebagai catatan, studi kasus dan data yang gua gunakan, hanya sebagai contoh ya..silahkan disesuaikan dengan studi kasus kalian.

Berikut langkah langkahnya:

Download dan Install Codeigniter 3

Download dan install Codeigniter 3 (pada artikel ini, gua tidak menjelaskan mengenai konfigurasi dasar Codeigniter 3 hingga sampai siap digunakan ya..)

Install PhpSpreadsheet

Silahkan install package PhpSpreadsheet melalui composer di dalam folder projek Codeigniter3 kalian ( [nama_projek_codeigniter]/ ) dengan command

composer require phpoffice/phpspreadsheet

Buat Database dan Table di MySQL

Selanjutnya adalah, membuat database serta data dummy yang nantinya data tersebut akan di export ke dalam file xlsx. Kalian bisa menggunakan data dummy yang gua buat. Berikut untuk syntax SQL nya

CREATE TABLE `nilai` (
  `id` int NOT NULL,
  `nama_lengkap` varchar(255) NOT NULL,
  `mtk` varchar(150) NOT NULL,
  `ipa` varchar(150) NOT NULL,
  `b_indonesia` varchar(150) NOT NULL,
  `b_inggris` varchar(150) NOT NULL,
  `biologi` varchar(150) NOT NULL,
  `added_date` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `nilai` (`id`, `nama_lengkap`, `mtk`, `ipa`, `b_indonesia`, `b_inggris`, `biologi`, `added_date`) VALUES
(1, 'SISWA A', '80', '75', '65', '77', '65', '2024-05-06 14:21:19'),
(2, 'SISWA B', '75', '75', '75', '75', '75', '2024-05-06 14:21:19'),
(3, 'SISWA C', '65', '85', '60', '77', '89', '2024-05-06 14:22:18'),
(4, 'SISWA D', '60', '56', '76', '94', '81', '2024-05-06 14:22:18'),
(5, 'SISWA E', '75', '67', '78', '96', '83', '2024-05-06 14:24:50');

Menyiapkan Template File Export

Sebelum memulai ngoding fungsi export data ke xlsx, ada baiknya kita membuat template tabel dan data yang kita butuhkan terlebih dahulu di excel atau aplikasi spreadsheet lainnya. Sehingga, lebih memudahkan proses ngoding, terutama untuk membuat desain tabelnya dalam bentuk kodingan.

Template File Excel untuk Export Data [docs/kuhomi.id].

Mulai Ngoding

Buat File Model

Silahkan buat file model dan ketikkan atau copy kode program seperti di bawah ini. Disini gua memberikan nama file modelnya adalah Manage_spreadsheet_model.php. Penamaan file ini tidak baku ya, jadi terserah kalian mau memberikan nama file apa, dengan syarat nama class nya sama dengan nama filenya ya..

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

class Manage_spreadsheet_model extends CI_Model{

  public function __construct() {
    parent::__construct();
    $this->db = $this->load->database('default',TRUE);
  }

  public function get_all() {
    $Q = $this->db->select("*")
                  ->from("nilai")
                  ->get(); 

    $res = $Q->result_array();
    return $res;
  }
}

Buat File View

Silahkan buat file view dan  ketikkan atau copy kode program seperti di bawah ini. File view ini berfungsi untuk menampilkan antarmuka untuk proses upload file dan tombol submit untuk proses export data

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Export a Table to Excel Template | PrepBootstrap</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</head>
<body>

    <div class="container">

        <div class="page-header">
            <h1>[Dummy] Nilai Siswa</h1>
        </div>

        <div class="container">
            <a href="/manage_spreadsheet/export" target="_blank">Export to Excel</a>

            <table id="exportTable" class="table table-hover">
                <thead>
                    <tr>
                        <th rowspan="2">Nama Lengkap</th>
                        <th colspan="5">Nilai</th>
                        <th rowspan="2">Rata-rata</th>
                    </tr>
                    <tr>
                        <th>MATEMATIKA</th>
                        <th>IPA</th>
                        <th>B. INDONESIA</th>
                        <th>B. INGGRIS</th>
                        <th>BIOLOGI</th>
                    </tr>
                </thead>
                <tbody>
                    <?php 
                            foreach ($nilai_siswa as $key => $v) { 
                                $rataan_nilai = 0;
                                $rataan_nilai = (floatval($v['mtk'])+floatval($v['ipa'])+floatval($v['b_indonesia'])+floatval($v['b_inggris'])+floatval($v['biologi']))/5;
                    ?>
                    <tr>
                        <td><?php echo $v['nama_lengkap'] ?></td>
                        <td><?php echo $v['mtk'] ?></td>
                        <td><?php echo $v['ipa'] ?></td>
                        <td><?php echo $v['b_indonesia'] ?></td>
                        <td><?php echo $v['b_inggris'] ?></td>
                        <td><?php echo $v['biologi'] ?></td>
                        <td><?php echo number_format($rataan_nilai,2) ?></td>
                    </tr>
                    <?php } ?>
                </tbody>
            </table>
        </div>

        <style>
            #exportButton {
                border-radius: 0;
            }

            table, th, td {
                border: 1px solid black;
                border-collapse: collapse;
            }
        </style>

    </div>

</body>
</html>

Buat File Controler

Silahkan buat file controller dan ketikkan atau copy kode program seperti di bawah ini. Untuk penjelasannya gua selipkan komentar di kode programnya. Disini gua memberikan nama file modelnya adalah Manage_spreadsheet.php. Penamaan file ini tidak baku ya, jadi terserah kalian mau memberikan nama file apa, dengan syarat nama class nya sama dengan nama filenya ya..

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
date_default_timezone_set('Asia/Jakarta');

//load package composer
require 'vendor/autoload.php';

//deklarasi package yang ingin digunakan
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class Manage_spreadsheet extends CI_Controller {
	
	public function __construct() {
		parent::__construct();
		// Load file model yang akan digunakan
		$this->load->model('manage_spreadsheet_model');
	}

	public function nilai_siswa() {
		// Load view table
		$data['nilai_siswa'] = $this->manage_spreadsheet_model->get_all();

	    $this->load->view("manage_spreadsheet/nilai_siswa", $data);
	}

	public function export()
	{
		//Get data siswa dari database
		$data_siswa = $this->manage_spreadsheet_model->get_all();
		
		//Lakukan proses export data siswa, jika data siswa tidak kosong
		if(!empty($data_siswa)){
			//inisialisasi object library php spreadsheet
			$spreadsheet = new Spreadsheet();
		    $sheet = $spreadsheet->getActiveSheet();
		    // Variabel untuk menampung pengaturan style title, row header, dan row data tabel

		    //Style title
		    $style_title = [
		    	// Set font bold
		      	'font' => ['bold' => true],
		      	//Set aligntment di middle
		      	'alignment' => [
		        	'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, // Set text jadi ditengah secara horizontal (center)
		        	'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER // Set text jadi di tengah secara vertical (middle)
		      	]
		    ];

		    // Style row header
		    $style_col = [
		    	// Set font bold
		      	'font' => ['bold' => true],
		      	//Set aligntment di middle
		      	'alignment' => [
		        	'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
		        	'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER
		      	],
		      	//Set border atas, bawah, kanan kiri cell dengan garis tipis
		      	'borders' => [
		        	'top' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
		        	'right' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
		        	'bottom' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
		        	'left' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN]
		      	]
		    ];

		    // Style row data
		    $style_row = [
		    	//Set aligntment di tengah
		      	'alignment' => [
		        	'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER
		      	],
		      	//Set border atas, bawah, kanan kiri cell dengan garis tipis
		      	'borders' => [
		        	'top' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
		        	'right' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
		        	'bottom' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
		        	'left' => ['borderStyle'  => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN]
		      ]
		    ];
		    // Set kolom A1 dengan tulisan "NILAI PERTENGAHAN SEMESTER" sebagai judul tabel
		    $sheet->setCellValue('A1', "NILAI PERTENGAHAN SEMESTER");
		    // Merge cell dari A1 s/d G1
		    $sheet->mergeCells('A1:G1');

		    // Set row header A3 dengan nama kolom "NAMA LENGKAP"
		    $sheet->setCellValue('A3', "NAMA LENGKAP");
		    // Merge cell dari A3 s/d A4
		    $sheet->mergeCells('A3:A4');

		    // Set row header B3 dengan nama kolom "NILAI"
		    $sheet->setCellValue('B3', "NILAI");
		    // Merge cell dari B3 s/d F3
		    $sheet->mergeCells('B3:F3');
		    
		    // Set row header B4 dengan nama kolom "MATEMATIKA"
		    $sheet->setCellValue('B4', "MATEMATIKA");
		    // Set row header C4 dengan nama kolom "IPA"
		    $sheet->setCellValue('C4', "IPA");
		    // Set row header D4 dengan nama kolom "B. INDONESIA"
		    $sheet->setCellValue('D4', "B. INDONESIA");
		    // Set row header E4 dengan nama kolom "B. INGGRIS"
		    $sheet->setCellValue('E4', "B. INGGRIS");
		    // Set row header F4 dengan nama kolom "BIOLOGI"
		    $sheet->setCellValue('F4', "BIOLOGI");
		    
		    // Set row header G3 dengan nama kolom "RATA RATA"
		    $sheet->setCellValue('G3', "RATA RATA");
		    // Merge cell dari G3 s/d G4
		    $sheet->mergeCells('G3:G4');
		    
		    // Apply style judul tabel dan row header 
		    $sheet->getStyle('A1:G1')->applyFromArray($style_title);
		    $sheet->getStyle('A3')->applyFromArray($style_col);
		    $sheet->getStyle('B3:F3')->applyFromArray($style_col);
		    $sheet->getStyle('B4')->applyFromArray($style_col);
		    $sheet->getStyle('C4')->applyFromArray($style_col);
		    $sheet->getStyle('D4')->applyFromArray($style_col);
		    $sheet->getStyle('E4')->applyFromArray($style_col);
		    $sheet->getStyle('F4')->applyFromArray($style_col);
		    $sheet->getStyle('G3:G4')->applyFromArray($style_col);
		 
		    // Set baris pertama untuk data tabel dimulai dari row cell 5
		    $numrow = 5;
		    foreach($data_siswa as $v){ // Lakukan looping pada variabel siswa

		    	//Proses menghitung rata rata nilai per siswa
		    	$rataan_nilai = 0;
		    	$rataan_nilai = (floatval($v['mtk'])+floatval($v['ipa'])+floatval($v['b_indonesia'])+floatval($v['b_inggris'])+floatval($v['biologi']))/5;

		    	// Set row data berdasarkan nama kolom masing-masing dimulai dari row cell 5
			    $sheet->setCellValue('A'.$numrow, $v['nama_lengkap']);
			    $sheet->setCellValue('B'.$numrow, $v['mtk']);
			    $sheet->setCellValue('C'.$numrow, $v['ipa']);
			    $sheet->setCellValue('D'.$numrow, $v['b_indonesia']);
			    $sheet->setCellValue('E'.$numrow, $v['b_inggris']);
			    $sheet->setCellValue('F'.$numrow, $v['biologi']);
			    $sheet->setCellValue('G'.$numrow, number_format($rataan_nilai,2));
			      
			    // Apply style row data
			    $sheet->getStyle('A'.$numrow)->applyFromArray($style_row);
			    $sheet->getStyle('B'.$numrow)->applyFromArray($style_row);
			    $sheet->getStyle('C'.$numrow)->applyFromArray($style_row);
			    $sheet->getStyle('D'.$numrow)->applyFromArray($style_row);
			    $sheet->getStyle('E'.$numrow)->applyFromArray($style_row);
			    $sheet->getStyle('F'.$numrow)->applyFromArray($style_row);
			    $sheet->getStyle('G'.$numrow)->applyFromArray($style_row);
			      
				// Tambah 1, sehingga data selanjutnya akan di set pada baris selanjutnya
			    $numrow++;
		    }
		    // Set width kolom
		    $sheet->getColumnDimension('A')->setWidth(25); // Set width kolom A
		    $sheet->getColumnDimension('B')->setWidth(15); // Set width kolom B
		    $sheet->getColumnDimension('C')->setWidth(15); // Set width kolom C
		    $sheet->getColumnDimension('D')->setWidth(15); // Set width kolom D
		    $sheet->getColumnDimension('E')->setWidth(15); // Set width kolom E
		    $sheet->getColumnDimension('F')->setWidth(15); // Set width kolom D
		    $sheet->getColumnDimension('G')->setWidth(18); // Set width kolom E
		    
		    // Set height semua kolom menjadi auto (mengikuti height isi dari kolommnya, jadi otomatis)
		    $sheet->getDefaultRowDimension()->setRowHeight(-1);
		    // Set orientasi kertas LANDSCAPE
		    $sheet->getPageSetup()->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);
		    // Set judul sheet
		    $sheet->setTitle("Nilai Siswa");
		    // Proses download file excel
		    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		    header('Content-Disposition: attachment; filename="Nilai Siswa.xlsx"'); // Set nama file excel nya
		    header('Cache-Control: max-age=0');
		    $writer = new Xlsx($spreadsheet);
		    $writer->save('php://output');
		}else{
			print_r("Mohon maaf, data tidak dapat di export");
			exit();
		}
	}

}

Proses Uji Coba

Silahkan akses fungsi controller “/manage_spreadsheet/nilai_siswa” melalui URL, selanjutnya klik tombol “Export Data” untuk proses export dan unduh file xlsx.

View Table dan Tombol Export Data ke Excel [docs/kuhomi.id].

Silahkan buka file tersebut menggunakan aplikasi excel. Jika tidak ada error dan data yang ditampilkan sesuai, maka bisa dikatakan proses export data telah berhasil.
 

Artikel Terkait