Membuat laporan Excel dari MySQL, menjadi mudah dengan PHP. Dulunya bernama PHPExcel sekarang berubah menjadi PhpSpreadsheet. Dari segi perintah banyak yang mirip, jadi migrasi dari PHPExcel ke PhpSpreadsheet tidak terlalu sulit.

Data yang akan kita export adalah Data Penduduk Indonesia, file sql nya bisa diimport dibawah ini

 
CREATE TABLE `datapenduduk` (
  `ID` int(11) NOT NULL,
  `provinsi` varchar(50) NOT NULL,
  `jumlah` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
--
-- Dumping data for table `datapenduduk`
--
 
INSERT INTO `datapenduduk` (`ID`, `provinsi`, `jumlah`) VALUES
(1, 'BANTEN', 10632166),
(2, 'BENGKULU', 1715518),
(3, 'DI YOGYAKARTA', 3457491),
(4, 'DKI JAKARTA', 1679163),
(5, 'GORONTALO', 1040164),
(6, 'JAMBI', 3092265),
(7, 'JAWA BARAT', 43053732),
(8, 'JAWA TENGAH', 32382657),
(9, 'JAWA TIMUR', 37476757),
(10, 'KALIMANTAN BARAT', 4395983),
(11, 'KALIMANTAN TENGAH', 2212089),
(12, 'KEPULAUAN RIAU', 1679163),
(13, 'LAMPUNG', 7608405),
(14, 'MALUKU', 1533506),
(15, 'MALUKU UTARA', 1038087),
(16, 'NANGGROE ACEH DARUSSALAM', 4494410),
(17, 'NUSA TENGGARA BARAT', 4500212),
(18, 'PAPUA', 2833381),
(19, 'RIAU', 5538367);
 
--
-- Indexes for dumped tables
--
 
--
-- Indexes for table `datapenduduk`
--
ALTER TABLE `datapenduduk`
  ADD PRIMARY KEY (`ID`);
COMMIT;

Buat satu folder baru untuk menyimpan file yang akan kita buat. Contoh beri nama php-mysql-excel

Install PhpSpreadsheet

Pindah ke folder php-mysql-excel, lalu install library PhpSpreadsheet dengan composer

composer require phpoffice/phpspreadsheet

Setelah terinstall, buat file index.php, copy paste script dibawah ini

<?php
// index.php
require 'vendor/autoload.php';
 
// login MySQL
$DB_SERVER = "localhost";
$DB_USER = "USER";
$DB_PASSWORD = "PASSWORD";
$DB_NAME = "tutorial";
$mysqli = new mysqli("$DB_SERVER","$DB_USER","$DB_PASSWORD","$DB_NAME");
 
if ($mysqli->connect_errno) {
  echo "Errno: " . $mysqli->connect_errno . "\n";
  echo "Error: " . $mysqli->connect_error . "\n";
  exit;
}
 
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
 
// buat nama sheetnya
$sheet->setTitle('Sheet 1');
// nama kolom dibaris pertama
$sheet->setCellValue('A1', 'Provinsi');
$sheet->setCellValue('B1', 'Jumlah Penduduk');
$sheet->setCellValue('C1', 'Diupdate');
 
// timestamp
$tz = 'Asia/Jakarta';
$dt = new DateTime("now", new DateTimeZone($tz));
$timestamp = $dt->format('Y-m-d G:i:s');
 
$formatTanggal = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($timestamp);
$data = mysqli_query($mysqli,"select provinsi,jumlah from datapenduduk");
// mulai dari baris kedua
// baris pertama untuk nama kolom
$row = 2;
while($record = mysqli_fetch_array($data))
{
    $sheet->setCellValue('A'.$row, $record['provinsi']);
    $sheet->setCellValue('B'.$row, $record['jumlah']);
    $sheet->setCellValue('C'.$row, $formatTanggal);
    $row++;
}
 
// format tanggal di kolom C 
$spreadsheet->getActiveSheet()->getStyle('C')
    ->getNumberFormat()
    ->setFormatCode(
        \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME
    );
 
$writer = new Xlsx($spreadsheet);
// set header agar file di download
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Transfer-Encoding: Binary");
header('Content-disposition: attachment; filename="Jumlah Penduduk Indonesia.xlsx"');
header('Cache-Control: max-age=0');
$writer->save("php://output");
?>

Script diatas berjalan lancar diatas PHP 7.x. Agar file Excel yang di konversi disimpan didalam folder php-mysql-excel ubah bagian

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Transfer-Encoding: Binary");
header('Content-disposition: attachment; filename="Jumlah Penduduk Indonesia.xlsx"');
header('Cache-Control: max-age=0');
$writer->save("php://output");

menjadi

$writer->download('jumlah penduduk indonesia.xlsx');

Leave a comment

Your email address will not be published. Required fields are marked *