Yii Tutorial: Ekspor Ke Excel Sesuai Hasil Filter User
July 5th, 2012, Written by: | Categories: Programming, Tutorial, Yii Framework

Pada artikel sebelumnya kita sudah pernah membahas bagaimana mengekspor hasil CGridView ke dalam Excel. Tetapi pertanyaannya sekarang adalah mungkinkah kita mengekspor data yang hanya difilter user ke Excel? Tentu saja bisa. Penasaran? Simaklah artikel berikut.

Secara sederhana penulis akan membuat dua halaman di Website. Halaman pertama menampilkan CGridView (sebenarnya kita bisa saja menggunakan EExcelView sebagai CGridView, tetapi demi kesederhanaan lebih baik kita tetap menggunakan CGridView saja). Halaman kedua adalah untuk mengekspor Excel.

Jika Anda belum pernah menggunakan EExcelView, maka baca terlebih dahulu di artikel Computesta untuk mengekspor CGridView ke Excel.

1. Buat Action untuk Menampilkan CGridView

Untuk menampilkan tabel CGridView, kita buat sebuah action. Untuk tutorial ini mari kita buatkan di SiteController, yang terletak di webroot/protected/controllers/SiteController.php. Kita namakan actionTampil(). Tetapi alih-alih menampilkan CGridView saja, kita pasangkan juga sebuah form supaya bisa di-submit ke halaman ekspor Excel. Berikut isi actionTampil()

public function actionTampil()
{
        $model=new Buku('search');
        $model->unsetAttributes(); 
        if(isset($_GET['Buku']))
            $model->attributes=$_GET['Buku'];

        $this->render('tampil',array(
            'model'=>$model,
        ));
}

Berikut merupakan konten file view di webroot/protected/views/site/tampil.php:

<?php echo CHtml::beginForm(array('site/exportExcel')); ?>
$model = new Buku();
$this->widget('zii.widgets.grid.CGridView', array(
		'dataProvider' => $model->search(),
                'filter'=>$model,
                    'columns' => array(
                        'id',
		        'judul',
		        'tahun',
		        'pengarang.nama',
	),
));
<?php echo CHtml::submitButton('Export'); ?>
<?php echo CHtml::endForm(); ?>


2. Action Untuk Ekspor Excel

Action untuk mengekspor file Excel, kita namakan actionExportExcel(). Action ini juga kita pasangkan di SiteController saja.

public function actionExportExcel()
    {
        $model = new Buku();
        $model->attributes = $_POST['Buku'];

        $this->widget('ext.EExcelView', array(
            'title'=>'Daftar Buku',
            'dataProvider' => $model->search(),
            'filter'=>$model,
            'grid_mode'=>'export',
             'columns' => array(
                'id',
                'judul',
                'tahun',
                'nama.pengarang',
            ),
        ));
    }

Nah selesai sudah langkahnya. Sekarang saatnya mencoba. Anda bisa membuka halaman index.php?r=site/tampil, yang akan memunculkan tampilan CGridView plus tombol Submit. Isikan filter di CGridView, lihat hasilnya. Kemudian pastikan kotak filter masih terisi, Anda tekan submit, maka akan muncul file Excel. Silahkan cek file Excel-nya. Sekarang Excel itu hanya menampilkan hasil sesuai filter.

More about: , , ,

17 Responses to “Yii Tutorial: Ekspor Ke Excel Sesuai Hasil Filter User”

  1. iwan

    Mau tanya gan,
    Kenapa file excel nya ga tampil ya ketika di klik tombol submit
    Yang tampil malah grid di web aja

    Ini ane posting coding nya
    Berikut action nya yang ada di siteController

    public function actionTampil()
    {
    $model = new Mapel(‘search’);
    $model->unsetAttributes();
    if(isset($_GET['Mapel']))
    $model->attributes = $_GET['Mapel'];

    $this->render(‘tampil’,array(
    ‘model’=>$model,
    ));
    }

    public function actionExportExcel()
    {
    $model = new Mapel();
    $model->attributes = $_POST['Mapel'];

    $this->widget(‘ext.EExcelView’,array(
    ‘grid_mode’=>’export’,
    ‘title’=>’Daftar Mapel’,
    ‘dataProvider’=>$model->search(),
    ‘filter’=>$model,
    ‘columns’=>array(
    ‘id’,
    ‘nm_matapelajaran’,
    ‘kelas_id’,
    ‘jurusan_id’,
    ‘semester_id’,
    ),
    ));
    }

    dan ini views/site/tampil

    widget(‘zii.widgets.grid.CGridView’,array(
    ‘dataProvider’=>$model->search(),
    ‘filter’=>$model,
    ‘columns’=>array(
    ‘id’,
    ‘nm_matapelajaran’,
    ‘kelas_id’,
    ‘jurusan_id’,
    ‘semester_id’,
    ),
    ));
    echo CHtml::submitButton(‘Export’);
    echo CHtml::endForm();
    ?>

    Reply
    • Garry

      Anda harus tambahkan koding bawah ini di bagian EExcelView…
      ‘grid_mode’=>’export’,

      Di tutorial, sudah saya update. Coba cek apakah masih keluar Grid dan bukannya Excel?

      Reply
      • ksk

        saya juga mengalami hal yang sama.. grid_mode udah export,, tpi yg muncul di browser nya,, tanpa css apa2 lagi muncul,, g seperti cgridview yang biasa

        Reply
        • adi r

          saya juga alamin hal yg sama, berhasil dengan cara :

          buka file : extensions/EExcelView.php
          rubah baris ke 20:

          public $libPath = ‘ext.phpexcel.Classes.PHPExcel’;

          menjadi :

          public $libPath = ‘ext.PHPExcel’;

          dengan struktur direktori saya :
          protected/extensions/PHPExcel
          protected/extensions/EExcelView.php

          Reply
        • adi r

          lupa lagi 1. tambahkan juga file PHPExcel.php pada folder protected/extensions.
          jadi struktur direktorinya menjadi :

          protected/extensions/PHPExcel
          protected/extensions/EExcelView.php
          protected/extensions/PHPExcel.php

          Reply
          • Rahma

            kok ane coba malah keluar ini ya gan?
            Fatal error: Class ‘CLogger’ not found in C:\xampp\htdocs\yii\framework\base\CApplication.php on line 704

  2. Naisa

    Wah, terima kasih atas tutorial ini mas… :D
    Sangat sangat membantu.

    Selalu suka baca tutorial dari sini karena step2 nya jelas dan ngga ribet.

    Terus share ilmunya ya mas… :)

    Reply
    • Garry

      Sep, terima kasih juga sudah berkunjung ke blog kami :)
      Jangan lupa di-life fan page kami juga jika merasa bermanfaat… :D

      Reply
  3. silvi

    maaf, mau nanya…

    saya kan naroh tombol submit nya di halaman admin…
    nah, dihalaman adminkan ada tombol search juga yg sama2 tipenya submit, jadi kan bentrok, saat saya klik tombol search, malah langsung export ke excel, gimana caranya biar 2 tombol itu ga bentrok ya??

    makasih sebelumnya…

    Reply
    • Garry

      Normalnya tidak akan bentrok. Karena form search ada di tempat tersendiri. Form export kita juga ada tempat tersendiri. Mungkin koding Silvi ini
      < ?php $this->renderPartial(‘_search’,array(
      ‘model’=>$model,
      )); ?>
      ikut masuk ke dalam form buatan kita? Kalau iya, silahkan keluarkan koding render itu dari form yang kita buat. Jadi kita buat seperti demikian:
      < ?php $this->renderPartial(‘_search’,array(
      ‘model’=>$model,
      )); ?>
      < ?php echo CHtml::beginForm(array('site/exportExcel')); ?>
      $model = new Buku();
      $this->widget(‘zii.widgets.grid.CGridView’, array(
      ‘dataProvider’ => $model->search(),
      ‘filter’=>$model,
      ‘columns’ => array(
      ‘id’,
      ‘judul’,
      ‘tahun’,
      ‘pengarang.nama’,
      ),
      ));
      < ?php echo CHtml::submitButton('Export'); ?>
      < ?php echo CHtml::endForm(); ?>

      Reply
  4. had

    Thanks gan tutorialnya
    membantu sekali

    klo boleh tanya, header nya pengen di bold otomatis gmana caranya y ? jadi pas udah donlot excelnya langsung d print g usah d edit lagi

    thx banget gan tutorialnya

    Reply
    • Garry

      Halo Had, sejauh yang saya tahu, saat ini belum bisa. Mungkin harus melakukan perubahan pada file core extensionnya.

      Reply
  5. hebby

    misi gan aku udah bikin persis ama pnya gan tapi ngak bisa ya ni kodenya
    //public function actionTampil()
    // {
    // $model=new Barang(‘search’);
    // $model->unsetAttributes();
    // if(isset($_GET['Barang']))
    // $model->attributes=$_GET['Barang'];
    //
    // $this->render(‘tampil’,array(
    // ‘model’=>$model,
    // ));
    // }
    //
    // public function actionExportExcel()
    // {
    // $model = new Barang();
    // $model->attributes = $_POST['Barang'];
    //
    // $this->widget(‘ext.EExcelView’, array(
    // ‘title’=>’Daftar Barang’,
    // ‘dataProvider’ => $model->search(),
    // ‘filter’=>$model,
    // ‘grid_mode’=>’export’,
    // ‘columns’ => array(
    // ‘idbarang’,
    // ‘namabarang’,
    // ‘barcode’,
    // ‘sn’
    // ‘merkbarang’,
    // ‘stock’,
    // ‘idsatuan0.satuan’,
    // ‘tglinput’,
    // ‘idjenis0.jenisbarang’,
    // ‘idkondisi0.kondisi’,
    // ‘idsupplier0.namasupplier’,
    // ‘idlokasi0.lokasi’,
    // ‘nosurat’,
    // ‘keterangan’,
    // ),
    // ));
    //

    widget(‘zii.widgets.grid.CGridView’, array(
    //’id’=>’barang-grid’,
    ‘dataProvider’=>$model->search(),
    ‘filter’=>$model,
    //’emptyText’=>’Maaf ,data tidak tersedia’,
    //’summaryText’ => ‘ ‘,
    ‘columns’=>array(
    //’id’,
    ‘idbarang’,
    ‘namabarang’,
    ‘barcode’,
    ‘sn’,
    ‘merkbarang’,
    ‘stock’,
    // ‘idsatuan0.satuan’,
    array(
    ‘name’=>’idsatuan’,
    ‘value’=>’$data->idsatuan0->satuan’,

    ),
    ‘tglinput’,
    //’idlokasi’,
    array(
    ‘name’=>’idlokasi’,
    ‘value’=>’$data->idlokasi0->lokasi’,

    ),
    //’idjenis’,
    array(
    ‘name’=>’idjenis’,
    ‘value’=>’$data->idjenis0->jenisbarang’,

    ),

    //’idsupplier0.supplier’,
    array(
    ‘name’=>’idsupplier’,
    ‘value’=>’$data->idsupplier0->namasupplier’,

    ),
    // //’idkondisi0.kondisi’,
    array(
    ‘name’=>’idkondisi’,
    ‘value’=>’$data->idkondisi0->kondisi’,

    ),
    ‘nosurat’,
    ‘keterangan’,

    ),
    )); ?>

    Reply
    • Garry

      Aganwati mau export excel bukan?
      Kalau berdasarkan pengamatan ane, ini masih pakai CGridView : widget(‘zii.widgets.grid.CGridView’, array(
      Sedangkan seharusnya kita pakai Eexcelview harusnya : $this->widget(‘ext.EExcelView’, array(

      Oh ya sekedar tambahan aja, penulisan yang benar adalah
      $this->widget(‘zii.widgets.grid.CGridView’, array(
      Agan kurang “$this->” di situ juga.

      Reply

Leave a Reply