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:

Yii: Import Data from Excel into MySQL Database

Pada artikel sebelumnya saya sudah membahas langkah-langkah mengupload file (klik di sini) dan langkah untuk membaca file excel (klik di sini). Kali ini saya akan mencoba membahas sedikit tentang bagaimana import data dari excel dan memasukkannya ke dalam database.

Berikut sekenario yang akan dijalankan :
  • Upload file excel
  • Membaca data dari file excel dan menginputkannya ke dalam database
  • Unlink file excel
1. Pertama buatlah halaman untuk upload file, definiskan model beserta atributnya :
//models/ImportForm.php
<?php
class ImportForm extends CFormModel{
    public $file_excel;
   
    public function rules(){
        return array(
            array('file_excel','file','types'=>'xls',
            'allowEmpty'=>false),
        );
    }
   
    public function attributeLabels(){
        return array(
        'file_excel'=>'File',
        );
    }
}
?>
 2. Di dalam view, buatlah form upload

//views/mahasiswa/_formimport.php
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'import-form',
    'enableAjaxValidation'=>false,
    'htmlOptions'=> array('enctype'=>'multipart/form-data'),
)); ?>


<div class="row">
        <?php echo $form->labelEx($model,'file_excel'); ?>
        <?php echo $form->Filefield($model,'file_excel'); ?>
        <?php echo $form->error($model,'file_excel'); ?>
    </div>
......
//views/mahasiswa/import.php
<h1>Import Mahasiswa</h1>
<?php $this->renderPartial('_formimport', array('model'=>$model)); ?>
 
3. Langkah terakhir adalah membuat action import, perhatikan kode di bawah ini :
public function actionImport()
{
 $model=new ImportForm;
 require_once Yii::app()->basePath.'/../upload/excel_reader2.php';

       
   if (isset($_POST['ImportForm']))
   {
     $a=$model->validate();
     if ($a) {
       //upload file
       $model->attributes=$_POST['ImportForm'];
       $file=CUploadedFile::getInstance($model,'file_excel');
       $file->saveAs(Yii::app()->basePath.'/../upload/import.xls');
                   
       //Read excel to array
       $path=Yii::app()->basepath.'/../upload/import.xls';
       $data = new Spreadsheet_Excel_Reader($path);
       $nim=array();
       $nama=array();
       $alamat=array();
                       
       $berhasil=0;
       $gagal= 0;
       //insert into database
       for ($j=2; $j <= $data->sheets[0]['numRows']; $j++)
          {
             $nim[$j]=$data->sheets[0]['cells'][$j][1];
             $nama[$j]=$data->sheets[0]['cells'][$j][2];
             $alamat[$j]=$data->sheets[0]['cells'][$j][3];
               
             $model= new Mahasiswa;
             $model->nim=$nim[$j];
             $model->nama=$nama[$j];
             $model->alamat=$alamat[$j];
             $model->create_time=new CDbExpression('now()');
             $model->save();
              
               //hitung record
               if(!$model->save()){
                 $gagal++;
               } else {
                 $berhasil++;
               }  
          }
        Yii::app()->user->setFlash('sukses',$berhasil.' record
        berhasil disimpan dan '.$gagal.' record gagal disimpan..');
        //hapus file excel
        unlink ($path);
        $this->redirect(array('admin'));
       }
    }
    $this->render('import',array('model'=>$model));
}

Hasilnya :





Good Luck!

Artikel keren lainnya:

Yii: Membaca Excel menggunakan Php Excel Reader

Php-excel-reader memiliki kemampuan untuk membaca format binary dari file XLS dan menampilkannya sesuai dengan isi dan formatnya. 


1. Pertama silahkan unduh library php-excel-reader terlebih dahulu, klik download

2. Kemuadian siapkan file .xls (Excel 97-2003 workbook).

3. Letakkan file xls dan excel_reader2.php di dalam folder webaccess
    Di sini saya meletakkannya di dalam folder C:\wamp\www\Helloword\upload

4. Silahkan pahami kode di bawah ini :
<?php
error_reporting(E_ALL ^ E_NOTICE);
require_once Yii::app()->basePath.'/../upload/excel_reader2.php';
$example = Yii::app()->basePath.'/../upload/transactions.xls' ;
$data = new Spreadsheet_Excel_Reader($example);
?>
<html>
<head>
<style>
table.excel {
    border-style:ridge;
    border-width:1;
    border-collapse:collapse;
    font-family:sans-serif;
    font-size:12px;
}
table.excel thead th, table.excel tbody th {
    background:#CCCCCC;
    border-style:ridge;
    border-width:1;
    text-align: center;
    vertical-align:bottom;
}
table.excel tbody th {
    text-align:center;
    width:20px;
}
table.excel tbody td {
    vertical-align:bottom;
}
table.excel tbody td {
    padding: 0 3px;
    border: 1px solid #EEEEEE;
}
</style>
</head>

<body>
<?php echo $data->dump(true,true); ?>
</body>
</html>

 Hasilnya :


Catatan :
  1. Jika menemukan error function split() is deprecated silahkan modifikasi excel_reader2.php, replace kata split dengan explode
  2. Jika menemukan error Assigning the return value of new by reference is deprecated silahkan modifikasi excel_reader2.php
    ganti kode berikut
    $this->_ole =& new OLERead();

    dengan
    $t = new OLERead();
    $this->_ole =& $t;


Good Luck!

Artikel keren lainnya: