Golaneducation.com – Sahabat Golan, dalam dunia bisnis dan keuangan, laporan periode merupakan hal penting untuk memonitor dan menganalisis kinerja perusahaan. Laporan haruslah dengan rapi diuat dan sesuai keinginan pimpinan. Dalam artikel ini, kita akan belajar bagaimana cara membuat laporan periode menggunakan PHP dan mengekspornya ke dalam format Excel.
Sebelum membuat laporan perlu sahabat Golan buatkan dulu program yang nantinya datanya akan kita gunakan untuk membuat laporan. Untuk membuat laporan transaksi langsung di export ke excel bisa dengan beberapa langkah. Langkah yang dipilih Golan education yaitu murni menggunakan PHP dan Mysql. Silahkan tonton video berikut supaya Anda ada gambaran. tonton pada link berikut: https://youtu.be/JB_0jwIR8_4
Laporan Transaksi PHP dan MYSQL di Export ke Excel
Setelah menonton silahkan ikuti langkah langkah berikut:
1. Pastikan Tabel Transaksi menggunakan Atribut Tanggal
Pada pembuatan laporan periode Anda harus memastikan ada atribut tanggal untuk bisa digunakan sebagai variabel. Tujuannya laporan periode ini nantinya ada range tanggal awal dan tanggal akhir sebagai pembatas laporan. Sehingga user bisa memilih periode tanggal laporan yang diinginkan.
Sebagai contoh perhatikan tabel berikut:
Pada tabel diatas ada tanggal yang digunakan nanti untuk filter laporan berdasarkan tanggal. Pada contoh yang kita buat juga ada filter tambahan berdasarkan jenis kamar. Jenis kamar ini hanya tambahan dan bisa disesuaikan atau hanya tanggal digunakan.
2. Buatkan Tampilan Filter yang Diinginkan
Berikut tampilan filter yang dibuatkan dalam tutorial ini:
Tampilan Filter berdasakan tanggal awal dan tanggal ahir serta pilihan tipe kamar. Karena sistem yang dicontoh disini adalah sistem hotel, maka pada laporannya dibutuhkan filter berdasarkan jenis kamar. tetapi ada juga secara keseluruhan bisa dilihat pada gambar berikut:
Untuk kodingan pada tampilan diatas sebagai berikut:
<form action="" method="post">
<div class="row">
<div class="col-sm-3">
<div class="form-group">
<input id="checkin" data-date-format="yyyy-mm-dd" value="<?= $start ; ?>" class="form-control" name="tanggal-start" placeholder="Dari Tanggal" />
</div>
</div>
<div class="col-sm-3">
<div class="form-group">
<input id="checkout" data-date-format="yyyy-mm-dd" value="<?= $end ; ?>" class="form-control" name="tanggal-end" placeholder="Sampai Tanggal" />
</div>
</div>
<div class="col-sm-3">
<div class="form-group">
<select name="id_kamar_tipe" class="form-control" id="id_kamar_tipe" >
<option value="">-- Pilih --</option>
<option value='all'>--ALL--</option>
<?php
$mitra = $koneksi->query("SELECT id_kamar_tipe, nama_kamar_tipe FROM kamar_tipe ORDER BY id_kamar_tipe");
while ($d_mitra=$mitra->fetch_assoc()){
if ($id_kamar_tipe == $d_mitra['id_kamar_tipe']) {
$cek4 = " selected";
} else
{ $cek4="";
}
echo "<option value='$d_mitra[id_kamar_tipe]' $cek4>$d_mitra[id_kamar_tipe] - $d_mitra[nama_kamar_tipe]</option>";
}
</select>
</div>
</div>
<div class="col-sm-3">
<button class="btn btn-success" type="submit" name="laporan-transaksi">Lihat Laporan</button>
</div>
</div>
</form>
Buatkan dan sisipkan script tersebut diatas hasil pencarian. Siapkan juga script untuk “laporan-transaksi” dimana ketika diklik button tersebut muncul hasil pencarian. Script tersebut tempatkan dibawah script yang ada diatas.
<?php if(isset($_POST['laporan-transaksi'])) { ?>
<div class="box">
<div class="box-body">
table class="table table-striped">
<thead>
<tr>
<th>Nomor Invoice</th>
<th>Tanggal Transaksi</th>
<th>Nomor Kamar</th>
<th>Tipe Kamar</th>
<th>Total Biaya Kamar</th>
</tr>
</thead>
<tbody>
<?php foreach($laporan_transaksi as $laporan_transaksi) { ?>
<tr>
<?php
$id_kamar = $laporan_transaksi['id_kamar'];
$namakamar = $database->get('kamar','*',['id_kamar'=>$id_kamar]);
$nomor_kamar=$namakamar['nomor_kamar'];
$id_kamar_tipe = $nomor_kamar['id_kamar_tipe'];
$nama_kamar_tipe=$laporan_transaksi['nama_kamar_tipe'];
?>
<td><?php echo $laporan_transaksi['nomor_invoice']; ?></td>
<td><?php echo IndonesiaTgl($laporan_transaksi['tanggal']); ?></td>
<td><?php echo $laporan_transaksi['nomor_kamar']; ?></td>
<td><?php echo $nama_kamar_tipe ; ?></td>
<td>Rp <?php echo rupiah($laporan_transaksi['total_biaya_kamar']); ?></td>
</tr>
<?php
$total_laporan_transaksi += $laporan_transaksi['total_biaya_kamar'];
} ?>
</tbody>
<tfoot>
<tr>
<td colspan="3"><span class="lead">Total Pendapatan : <b>Rp <?php echo rupiah($total_laporan_transaksi); ?></b></span>
<a target="_BLANK" href="excel/datatransaksikamar.php" class="btn btn-primary">Export Excel</a>
</td>
</tr>
</tfoot>
</table>
</div>
</div>
<?php } ?>
Berikut hasil ketika sudah diklik lihat laporan:
3. Siapkan Script Export ke Excel
Pada script diatas ada href=”excel/datatransaksikamar.php” siapkan script tersebut dan untuk folder excel bisa menyesuiakan sesuai folder yang ada dibuat.
Berikut scipt export ke excel:
<?php
include('../config/database.php');
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Nomor Invoice');
$sheet->setCellValue('B1', 'Tanggal Transaksi');
$sheet->setCellValue('C1', 'Nomor Kamar');
$sheet->setCellValue('D1', 'Nama Kamar');
$sheet->setCellValue('E1', 'Total Biaya Kamar');
session_start();
$start = $_SESSION['start'];
$end= $_SESSION['end'];
$id_kamar_tipe= $_SESSION['id_kamar_tipe'];
if ($id_kamar_tipe=='all'){
$query = mysqli_query($koneksi,"select kamar.id_kamar_tipe,kamar.id_kamar, transaksi_kamar.nomor_invoice, transaksi_kamar.tanggal, transaksi_kamar.total_biaya_kamar, kamar_tipe.nama_kamar_tipe, kamar.nomor_kamar
from transaksi_kamar
INNER JOIN kamar ON transaksi_kamar.id_kamar = kamar.id_kamar
INNER JOIN kamar_tipe ON kamar.id_kamar_tipe = kamar_tipe.id_kamar_tipe
where transaksi_kamar.tanggal BETWEEN '$start' AND '$end'");
} else {
$query = mysqli_query($koneksi,"select kamar.id_kamar_tipe,kamar.id_kamar, transaksi_kamar.nomor_invoice, transaksi_kamar.tanggal, transaksi_kamar.total_biaya_kamar, kamar_tipe.nama_kamar_tipe, kamar.nomor_kamar
from transaksi_kamar
INNER JOIN kamar ON transaksi_kamar.id_kamar = kamar.id_kamar
INNER JOIN kamar_tipe ON kamar.id_kamar_tipe = kamar_tipe.id_kamar_tipe
where (transaksi_kamar.tanggal BETWEEN '$start' AND '$end') and kamar_tipe.id_kamar_tipe='$id_kamar_tipe'");
}
//$query = mysqli_query($koneksi,"select * from transaksi_kamar");
$i = 2;
$no = 1;
$total=0;
while($row = mysqli_fetch_array($query))
{
$sheet->setCellValue('A'.$i, $row['nomor_invoice']);
$sheet->setCellValue('B'.$i, $row['tanggal']);
$sheet->setCellValue('C'.$i, $row['nomor_kamar']);
$sheet->setCellValue('D'.$i, $row['nama_kamar_tipe']);
$sheet->setCellValue('E'.$i, $row['total_biaya_kamar']);
$i++;
$total+=$row['total_biaya_kamar'];
}
$sheet->setCellValue('D'.$i, 'Total Pendapatan');
$sheet->setCellValue('E'.$i, $total);
$styleArray = ['borders' => ['allBorders' => ['borderStyle' =>\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
],
],
];
$i = $i - 1;
$sheet->getStyle('A1:E'.$i)->applyFromArray($styleArray);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="Report Data Kamar '.$start.' sd '.$end.'.xlsx.xlsx"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
?>
Ikuti penulisan script diatas untuk bisa menghasilkan format excel. berikut penjelasan scriptnya:
Script di atas adalah contoh kode PHP yang menghasilkan laporan data kamar dalam format Excel (.xlsx). Berikut adalah penjelasan langkah demi langkah dari script tersebut:
Import Dependencies
include('../config/database.php');
require '../vendor/autoload.php';
Baris pertama include(‘../config/database.php’); dan require ‘../vendor/autoload.php’; adalah untuk mengimpor file database konfigurasi dan dependencies dari PHPExcel (sekarang dikenal sebagai PhpSpreadsheet).
Membuat Spreadsheet dan Sheet
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
Baris selanjutnya membuat objek Spreadsheet dan menetapkan variabel $sheet ke aktifnya (sheet pertama).
Menentukan Nama Kolom
$sheet->setCellValue('A1', 'Nomor Invoice');
$sheet->setCellValue('B1', 'Tanggal Transaksi');
$sheet->setCellValue('C1', 'Nomor Kamar');
$sheet->setCellValue('D1', 'Nama Kamar');
$sheet->setCellValue('E1', 'Total Biaya Kamar');
Script selanjutnya menetapkan nama kolom untuk data dalam spreadsheet dengan setCellValue pada kolom A sampai E.
Membaca Data Sesi
session_start();
$start = $_SESSION['start'];
$end= $_SESSION['end'];
session_start() digunakan untuk memulai atau melanjutkan sesi yang ada.
Data tanggal dan id_kamar_tipe diambil dari sesi dengan $_SESSION[‘start’], $_SESSION[‘end’], dan $_SESSION[‘id_kamar_tipe’].
Menjalankan Query
if ($id_kamar_tipe=='all'){
$query = mysqli_query($koneksi,"select kamar.id_kamar_tipe,kamar.id_kamar, transaksi_kamar.nomor_invoice, transaksi_kamar.tanggal, transaksi_kamar.total_biaya_kamar, kamar_tipe.nama_kamar_tipe, kamar.nomor_kamar
from transaksi_kamar
INNER JOIN kamar ON transaksi_kamar.id_kamar = kamar.id_kamar
INNER JOIN kamar_tipe ON kamar.id_kamar_tipe = kamar_tipe.id_kamar_tipe
where transaksi_kamar.tanggal BETWEEN '$start' AND '$end'");
} else {
$query = mysqli_query($koneksi,"select kamar.id_kamar_tipe,kamar.id_kamar, transaksi_kamar.nomor_invoice, transaksi_kamar.tanggal, transaksi_kamar.total_biaya_kamar, kamar_tipe.nama_kamar_tipe, kamar.nomor_kamar
from transaksi_kamar
INNER JOIN kamar ON transaksi_kamar.id_kamar = kamar.id_kamar
INNER JOIN kamar_tipe ON kamar.id_kamar_tipe = kamar_tipe.id_kamar_tipe
where (transaksi_kamar.tanggal BETWEEN '$start' AND '$end') and kamar_tipe.id_kamar_tipe='$id_kamar_tipe'");
}
Query database dieksekusi untuk mengambil data transaksi kamar dari tabel transaksi_kamar, kamar, dan kamar_tipe.
Jika $id_kamar_tipe bernilai ‘all’, maka akan diambil semua data transaksi kamar dalam rentang tanggal $start hingga $end.
Jika $id_kamar_tipe bukan ‘all’, maka hanya data transaksi kamar dengan jenis kamar tertentu yang diambil dalam rentang tanggal yang sama.
Menulis Data ke Spreadsheet
$i = 2;
$no = 1;
$total=0;
while($row = mysqli_fetch_array($query))
{
$sheet->setCellValue('A'.$i, $row['nomor_invoice']);
$sheet->setCellValue('B'.$i, $row['tanggal']);
$sheet->setCellValue('C'.$i, $row['nomor_kamar']);
$sheet->setCellValue('D'.$i, $row['nama_kamar_tipe']);
$sheet->setCellValue('E'.$i, $row['total_biaya_kamar']);
$i++;
$total+=$row['total_biaya_kamar'];
}
$sheet->setCellValue('D'.$i, 'Total Pendapatan');
$sheet->setCellValue('E'.$i, $total);
$styleArray = ['borders' => ['allBorders' => ['borderStyle' =>\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
],
],
];
$i = $i - 1;
$sheet->getStyle('A1:E'.$i)->applyFromArray($styleArray);
Data dari hasil query dimasukkan ke dalam spreadsheet menggunakan perulangan while.
Setiap baris data ditulis pada kolom yang sesuai.
Menghitung Total Pendapatan
$total+=$row['total_biaya_kamar'];
Setelah data transaksi ditulis, total pendapatan dari seluruh transaksi dihitung.
Mengatur Tampilan Spreadsheet
$sheet->getStyle('A1:E'.$i)->applyFromArray($styleArray);
StyleArray digunakan untuk mengatur tampilan (dalam hal ini, hanya batas sel).
Pengaturan Header untuk Unduhan
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="Report Data Kamar '.$start.' sd '.$end.'.xlsx.xlsx"');
header('Cache-Control: max-age=0');
Header HTTP diset untuk mengatur tipe file Excel yang akan diunduh, nama file, dan cache control.
Menyimpan dan Mengunduh Spreadsheet
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
Objek $writer digunakan untuk menyimpan data dalam format XLSX dan mengirimkannya ke output PHP dengan nama file yang sesuai.
Kesimpulan Golan:
Script pembuatan laporan export ke excel ini menggunakan PhpSpreadsheet, yang merupakan pustaka PHP modern untuk menghasilkan file Excel. Pastikan Anda telah menginstal pustaka ini melalui composer atau cara lain yang sesuai agar script ini berfungsi dengan benar. Script ini bisa disesuiakan sesuai framework yang Anda gunakan. Apabila Anda butuh bimbingan silahkan hubungi Golan Education. Golan Education siap membantu dan melatih Anda sampai bisa. Apabila butuh script hotel secara utuh untuk digunakan pada proses belajar, silahkan hubungi Golan Education.