Pazar, 28 Haziran 2009

Excel Dosyası Oluşturma

 

CodeIgniter içinde daha önce yazdığınız genel işler için kullandığınız PHP fonksiyonlarının MVC çatısı altında kullanımı iki farklı şekilde yapılabilmektedir. Birincisi kütüphane ve helper kullanımı, ikincisi ise plugin kullanımıdır.

Kütüphane kullanımını daha önce de burada anlatmıştım. Çalışma mantığını tekrarlarsam: yazdığımız fonksiyonları bir sınıf (class) altında birleştiriyoruz. Ancak bu sınıf CodeIgniter ile ilgili olmadığı için herhangi bir Controller, Model vs. gibi bir sınıfı genişletmemektedir (extend). Yani kendine müstakil bir sınıf yazıyor, dosyanın adını da kullanacağımız kütüphanenin adını veriyoruz. Ne zaman kullanmak istersek bu sınıfı Controller içinden $this->load->libraries('kutuphane_adi'); cümlesi ile çağırıyor sınıfın adı altındaki methodları $this->sinif_adi->method_adi olarak kullanıyoruz.

Plugin`lerde ise durum daha farklı. Plugin dosyaları daha çok Helper dosylarına benziyor. Hatırlarsanız Helper dosyaları Kütüphanelerdeki metodların $this->sinif_adi->method_adi yerine doğrudan erişimi ($method_adi) için yazdığımız dosyalardı. Plugin dosyaları da buna benzerler. Örnek olarak Excel plugin dosyasını inceleyelim: Kodların yer aldığı dosyanın yeri system/plugin dizini altında olup, adı to_excel_pi.php dir.

<!--?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/*
* Excel library for Code Igniter applications
* Author: Derek Allard, Dark Horse Consulting, www.darkhorse.to, April 2006
*/

function to_excel($query, $filename='exceloutput')
{

     $headers = ''; // just creating the var for field headers to append to below
     $data = ''; // just creating the var for field data to append to below
     
     $obj =& get_instance();
  
     if ($query->num_rows() == 0) 
  {
          echo '<p>The table appears to have no data.</p>';
     } else 
  {
  
    $i = 0;
          foreach ($query->result() as $row) 
    {
               $line = '';

               foreach($row as $key=>$value) 
      { 
     if($i == 0) $headers .= $key . "\t";      
     
                    if ((!isset($value)) OR ($value == "")) 
     {
                         $value = "\t";
                    } else {
                         $value = str_replace('"', '""', $value);
                         $value = '"' . $value . '"' . "\t";
                    }
     
     $value = utf8_decode($value);//utf8 
                    $line .= $value;
               }
      
               $data .= trim($line)."\n";
      $i++;
          }
          
          $data = str_replace("\r","",$data);
                         
          header("Content-type: application/x-msdownload");
          header("Content-Disposition: attachment; filename=$filename.xls");
          echo "$headers\n$data";  
     }
}

Dosya içinde bulunan fonksiyon bir sınıfa ait değildir. Amacı, kendisine gönderilen tabloyu Excel`in okuyabileceği versiyon olan tab`lı şekle dönüştürmektir.

Bu plugin dosyasının Controller dosyası içine yüklenmesi ve çağırılması ise aşağıda anlatılmıştır (aşağıda kolay anlaşılması bakımından veritabanına bağlantı ve veri çekimi, model dosyası yerine controller içinden anlatılmıştır) :

$this->load->plugin('to_excel');//yükleniyor
$this->db->use_table('tablo_adi');//veritabanından tablo çağrılıyor
$this->db->select('field1', 'field2');//iki kolon seçiliyor
$query = $this->db->get();//seçilen kolonlar çekiliyor
to_excel($query, ['dosya_adi']); //verilen dosyaya yazdırılıyor.

Bu yazıda bahsedilen Excel plugin dosyası CodeIgniter Wiki sayfalarından alınmıştır.

Bu yazı, orijinal plugin kodları ile tablo isimleri alınamadığı için, result_array() metodu kullanılarak tablo isimleri alınacak şekilde 23 Kasım 2010 tarihinde, yeniden düzenlenmiştir.

Yorumlar

selam ben bu classı denedım fakat class duzgun calısmasına ragmen nette exel cıktısını alamadım CI de header calısmıyor CI nın kendı header sınıfınıda denedım fakat sonuc alamadım

$this->output->set_header('Content-type: application/x-msdownload'); //bunu denedım ve duz header da denedım ama exel cıktısını alamadım sorun hakkında bılgısı olan yardımcı olabilecek headerla ılgılı protokellere dıkat edılmısdır

@efehan: Log dosyalarını inceledin mi? hangi hataları alıyorsun baktın mı?

Muhtemelen serdan kaynaklanan NIME type ile alakalı bir sorun... Server a excel dosyasını nasıl açılacağını belirtmek lazım ISS serverlar da sorun çıkarıyo genelde..

Yorum Ekle