Beranda · Contact Us · Downloads

Yii: Export Data into Excel

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:

10 Tanggapan untuk "Yii: Export Data into Excel"

  1. klo ditambahin kop surat untuk header nya dan penanggung jawabnya di bawah tabel gimana gan.... mohon pencerahannya

    BalasHapus
    Balasan
    1. Untuk header silahkan edit ExcelExporter.php di bagian :
      if ($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'

      Hapus
  2. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
    Balasan
    1. untuk action datanya di letakan dimananya ya gan ? kalo di yii2

      Hapus
    2. Silahkan letakkan di controllernya

      /protected/controllers/nama_controller.php

      Hapus
  3. gan kalo saya mau export di bagian sistemnya saja bisa tidak ?
    jadi bukan ambil dari dbnya. karena di db saya menggunakan join table di model classnya jadi nama2 yang di sistem tidak muncul.

    BalasHapus
    Balasan
    1. Bisa saja, silahkan edit bagian '$data=...' pada actionExport
      Sesuaikan dengan data sistem yang dimaksud

      Hapus
    2. Komentar ini telah dihapus oleh pengarang.

      Hapus
    3. gan bisa no WA atau Fb biar saya kasih gambar sistem yang dimau diexport. belum kebayang soalnnya

      Hapus
    4. fungsi yang di dalam array : Field1 dan field2 nya kalo hapus atau ditambahain ga berpengaruh gan

      Hapus