Setelah sukses mencoba import data excel ke dalam database pada artikel sebelumnya, kali ini saya akan berbagi tentang export data ke dalam excel. Bagaimana caranya?
Berbekal dari pengalaman yang ada saya melakukan pencarian di google hingga akhirnya saya menemukan salah satu cara sederhana untuk export data ke dalam excel. Thanks to developers :)
Caranya cukup mudah tinggal menyalin kode di bawah ini lalu menyimpannya di dalam components. Bagi yang mau mengunduhnya silahkan klik link
download
<?php
//protected/components/ExcelExporter.php
class ExcelExporter
{
const CRLF = "\r\n";
/**
* Outputs active record resultset to an xml based excel file
*
* @param $filename - name of output filename
* @param $data - active record data set
* @param $title - title displayed on top
* @param $header - boolean to show/hide header
* @param $fields - array of fields to export
*/
public static function sendAsXLS($filename, $data, $title = false, $header = false, $fields = false)
{
$export = self::xls($data, $title, $header, $fields);
self::sendHeader($filename, strlen($export), 'vnd.ms-excel');
echo $export;
Yii::app()->end();
}
/**
* Send file header
*
* @param $filename - filename for created file
* @param $length - size of file
* @param $type - mime type of exported data
*/
private static function sendHeader($filename, $length, $type = 'octet-stream')
{
if (strtolower(substr($filename, -4)) != '.xls')
$filename .= '.xls';
header("Content-type: application/$type");
header("Content-Disposition: attachment; filename=$filename");
header("Content-length: $length");
header('Pragma: no-cache');
header('Expires: 0');
}
/**
* Private method to create xls string from active record data set
*
* @param $data - active record data set
* @param $title - title displayed on top
* @param $header - boolean to show/hide header
* @param $fields - array of fields to export
*/
private static function xls($data, $title, $header, $fields)
{
$str = '<html>' . self::CRLF
. '<head>' . self::CRLF
. '<meta http-equiv="content-type" content="text/html; charset=utf-8">' . self::CRLF
. '</head>' . self::CRLF
. '<body style="text-align:center">' . self::CRLF;
if ($title)
$str .= "<b>$title</b><br /><br />" . self::CRLF
. Yii::t('main', 'export_lines') . ': ' . count($data) . '<br />' . self::CRLF
. Yii::t('main', 'export_date') . ': ' . Yii::app()->dateFormatter->formatDateTime($_SERVER['REQUEST_TIME']) . '<br /><br />' . self::CRLF;
if ($data)
{
$str .= '<table style="text-align:left" border="1" cellpadding="0" cellspacing="0">' . self::CRLF;
if (!$fields)
$fields = array_keys($data[0]->attributes);
if ($header)
{
$str .= '<tr>' . self::CRLF;
foreach ($fields as $field)
$str .= '<th>' . $data[0]->getAttributeLabel($field) . '</th>' . self::CRLF;
$str .= '</tr>' . self::CRLF;
}
foreach ($data as $row)
{
$str .= '<tr>' . self::CRLF;
foreach ($fields as $field)
$str .= '<td>' . $row->$field . '</td>' . self::CRLF;
$str .= '</tr>' . self::CRLF;
}
$str .= '</table>' . self::CRLF;
}
$str .= '</body>' . self::CRLF
. '</html>';
return $str;
}
}
Langkah selanjutnya membuat action untuk export data
public function actionExport()
{
$data=Mahasiswa::model()->findAll();
$fields=array(
'field1',
'field2',
);
ExcelExporter::sendAsXLS('Mahasiswa', $data, true, $fields);
}
Hasilnya :
Good Luck!
Artikel keren lainnya:
klo ditambahin kop surat untuk header nya dan penanggung jawabnya di bawah tabel gimana gan.... mohon pencerahannya
BalasHapusUntuk header silahkan edit ExcelExporter.php di bagian :
Hapusif ($title)
$str="Letakkan kop surat di sini, bisa menggunakan tag table"
.self::CRLF
Untuk penanggung jawab bisa menambahkan tag table tepat di atas $str .= '/body' . self::CRLF.
$str = "edit bagian penanggung jawab di sini, bisa menggunakan tag table";
$str .='/body'
Komentar ini telah dihapus oleh pengarang.
BalasHapusuntuk action datanya di letakan dimananya ya gan ? kalo di yii2
HapusSilahkan letakkan di controllernya
Hapus/protected/controllers/nama_controller.php
gan kalo saya mau export di bagian sistemnya saja bisa tidak ?
BalasHapusjadi bukan ambil dari dbnya. karena di db saya menggunakan join table di model classnya jadi nama2 yang di sistem tidak muncul.
Bisa saja, silahkan edit bagian '$data=...' pada actionExport
HapusSesuaikan dengan data sistem yang dimaksud
Komentar ini telah dihapus oleh pengarang.
Hapusgan bisa no WA atau Fb biar saya kasih gambar sistem yang dimau diexport. belum kebayang soalnnya
Hapusfungsi yang di dalam array : Field1 dan field2 nya kalo hapus atau ditambahain ga berpengaruh gan
Hapus