Php ile Excel’e Aktar Fonksiyonu (Export Excel with Php)

php-ile-excele-aktar-fonksiyonu-export-excel-with-php

01. Açıklama

Aşağıdaki fonksiyon yardımı ile herhangi bir html tabloyu Excel dosyası olarak çıktı alabileceksiniz. Üstelik Türkçe karakter problemi de yaşamayacaksınız. Hemen kodları veriyorum.

02. exportExcel() Fonksiyonu

03. Örnek Kullanım

04. Çıktı

php-ile-excele-aktar-fonksiyonu-export-excel-with-php-cikti

05. Php Dosyasını İndir

Dosyayı İndir

06. Güncelleme (30.04.2017)

MSO Formatları Listesi

Stil Kodu ve DeğeriAçıklama
mso-number-format:”0″Ondalıklı rakamları gizler
mso-number-format:”0\.000″Noktadan sonra 3 rakamı gösterir
mso-number-format:”\#\,\#\#0\.000″Binlik ayrıcı ile noktadan sonra 3 rakamı gösterir
mso-number-format:”mm\/dd\/yy”Tarih formatı (ay/gün/yıl)
mso-number-format:”mmmm\ d\,\ yyyy”Başka bir tarih formatı
mso-number-format:”m\/d\/yy\ h\:mm\ AM\/PM”Tarih formatı
mso-number-format:”Short Date”01/03/1998
mso-number-format:”Medium Date”01-mar-98
mso-number-format:”d\-mmm\-yyyy”01-mar-1998
mso-number-format:”Short Time”5:16
mso-number-format:”Medium Time”5:16 am
mso-number-format:”Long Time”5:16:21:00
mso-number-format:”Percent”Yüzde gösterir (2 ondalık rakamlı)
mso-number-format:”0%”Yüzde gösterir (ondalığı göstermez)
mso-number-format:”0\.E+00″Bilimsel gösterim
mso-number-format:”\@”Herşeyi yazı yapar
mso-number-format:”\#\ ???\/???”Kesirler (3 basamağa kadar) (312/943)
mso-number-format:”\0022£\0022\#\,\#\#0\.00″Para birimi gösterimi (£12.76)
mso-number-format:”\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\”2 ondalık ve negatif sayılar kırmızı renkli (1.56 -1.56)

Bu sayfa 20.988 kez görüntülendi.

Ahmet

Sıradan bloglardan birisi :)

Bunlar da hoşunuza gidebilir...

37 Cevaplar

  1. Taner dedi ki:

    Hocam Merhaba. Ben table kullanarak excel e aktarma yapıyorum php de. Fakat satırları atarken 2 satırı birleştirip atıyor.

    • Ahmet dedi ki:

      Merhaba Taner Hocam,

      Fonksiyon içerisindeki aşağıdaki satırları silip veya yorum satırı yapıp, çıktıyı paylaşabilir misiniz?
      Bu sayede hatanın kaynağını bulabiliriz.

      header(“Content-disposition: attachment; filename=”.$filename.”.xls”);
      echo “\xEF\xBB\xBF”; // UTF-8 BOM

  2. Mehmet dedi ki:

    Hocam eline sağlık güzel olmuş. Bu kodlarla multiple sheet çalışma şansımız var mı? 2. sayfayı bir türlü oluşturamadım.

    • Ahmet dedi ki:

      Merhaba Mehmet,

      Maalesef html çıktı ile 2. bir sayfa yapılabileceğini zannetmiyorum. Bunun için PHPExcel classını tavsiye edebilirim. Bunun için aşağıdaki bağlantıyı inceleyebilirsiniz.
      http://stackoverflow.com/a/3269351

      İyi çalışmalar dilerim…

      • Lucas dedi ki:

        PhpExcel Classını tavsiye etmem çünkü while veya foreach döngülerini bu classa uydurmak bir hayli zor ve zahmetli. Hatta birçok kişi bunu yapamadığı için PhpExcel classından vazgeçmiştir. Ancak Xlsx formatında veri aktarımı da sadece PhpExcel türü classlar ile yapılabilmektedir. Buradaki aktarım şekli sadece xls 2003 formatında hatta table-td düzeninde düz kodlama olarak yansıtılmaktadır. Bunu anlamak için indireceğeiniz xls formatındaki dosyanın kaynak kodunu notepad içerisinde görebilirsiniz. Ancak 2007 xlsx formatındaki bir dosyanın içeriğini bu şekilde okuyamazsınız. Kısacası yukarıda bahsi geçen konu ile php dosyalarınızı excele aktarılması tavsiye edilmez. İlerleyen yıllarda bu size güncellik ve xls desteği/dilkodu formatlama vs. açısından sorun çıkaracaktır.

  3. Kutsi Akıllı dedi ki:

    $data[]=array(
    ‘Satır 3 Kolon 1 Verisi’,
    ‘Satır 3 Kolon 2 Verisi’,
    ‘Satır 3 Kolon 3 Verisi’,
    40.01
    );

    içinde while ile veri çekerek nasıl kullanabilirim? Teşekkürler

    • Ahmet dedi ki:

      Merhaba Kutsi,
      Aşağıdaki kodlar işini görecektir.

      $data=array();
      $sql=mysql_query("SELECT * FROM uyeler");
      while($row=mysql_fetch_row($sql)){
          $data[]=$row;
      }
      
      // While döngüsü ile $data arrayına değerleri ekledik.
      • Kutsi Akıllı dedi ki:

        Yardım için teşekkürler. SQL sorgumu sizin kodunuza eklemeden test ettim sorun yok ekrana basıyor ancak sizin kodu, verdiğiniz şekilde modifiye edince gelmesi gereken data (Kolon Başlıkları) ve diğer hiçbir şey gelmiyor. Bir yerde break oluyor anladığım kadarıyla. Zira altında bıraktığım sabit verileri de göstermiyor XLS dosyası içinde.. Çözüm öneriniz varsa mutlu olurum…

  4. Kutsi Akıllı dedi ki:

    Özellikle yukarıda belirttim. Ekrana basıyor echo ile sorun yok…

  5. Kutsi Akıllı dedi ki:

    $docroot = $_SERVER[‘DOCUMENT_ROOT’];

    $dbfile=$docroot.”/admin/_include/mysql-conf.php”;
    include($dbfile);

    //Connect to Database
    connecttodb();

    function exportExcel($filename=’ExportExcel’,$columns=array(),$data=array(),$replaceDotCol=array()){
    header(‘Content-Encoding: UTF-8’);
    header(‘Content-Type: text/plain; charset=utf-8′);
    header(“Content-disposition: attachment; filename=”.$filename.”.xls”);
    echo “\xEF\xBB\xBF”; // UTF-8 BOM

    $say=count($columns);

    echo ”;
    foreach($columns as $v){
    echo ”.trim($v).”;
    }
    echo ”;

    foreach($data as $val){
    echo ”;
    for($i=0; $i < $say; $i++){

    if(in_array($i,$replaceDotCol)){
    echo '’.str_replace(‘.’,’,’,$val[$i]).”;
    }else{
    echo ”.$val[$i].”;
    }
    }
    echo ”;
    }
    }

    /* TANIMLAMALAR */

    $columns=array();

    $data=array();

    /*
    $replaceDotCol
    Decimal kolonlardaki noktayı (.) virgüle (,) dönüştürüelecek kolon numarası belirtilmelidir.
    Örneğin; Kolon 4’ün verilerinde nokta değilde virgül görülmesini istiyorsanız
    ilgili kolonun array key numarasını belirtmelisiniz. İlk kolonun key numarası 0’dır.
    */
    $replaceDotCol=array(3);

    /* Sütun Başlıkları */
    $data[]=array();
    $sql=mysql_query(“SELECT subeadi FROM bayiler”);
    while(list($bayim)=mysql_fetch_row($sql)){

    $data[]=$bayim;

    }

    /* Satır Verileri */
    $data[]=array(
    ‘Satır 1 Kolon 1 Verisi’,
    ‘Satır 1 Kolon 2 Verisi’,
    ‘Satır 1 Kolon 3 Verisi’,
    17.45
    );

    $data[]=array(
    ‘Satır 2 Kolon 1 Verisi’,
    ‘Satır 2 Kolon 2 Verisi’,
    ‘Satır 2 Kolon 3 Verisi’,
    35.10
    );

    $data[]=array(
    ‘Satır 3 Kolon 1 Verisi’,
    ‘Satır 3 Kolon 2 Verisi’,
    ‘Satır 3 Kolon 3 Verisi’,
    40.01
    );

    exportExcel(‘DosyaAdi’,$columns,$data,$replaceDotCol);

    ?>

  6. İbrahim Başeğmez dedi ki:

    Selamlar. Kolon adlarını da dinamik yapabiliyor muyuz?
    Eğer yapabiliyorsak, örnek yazabilir misiniz?

  7. fatma nur dedi ki:

    merabalar kalite performans yönetim sistemi projesi yazdım.ilgili sayfalara tıklanınca performans bilgilerini excel ile almak istiyorum nasıl yapacağımı anlamadım yardımcı olur musunuz? Kolay gelsin

  8. Hasan dedi ki:

    2016 Ekran çıktısı: http://i.hizliresim.com/kBM1ym.png

  9. Ali İhsan dedi ki:

    Merhaba, bir sorun yaşadım da çözümü konusunda yardım isteyecektim. Veritabanında veri çekerek excel çıktısı aldığımda sayfada ne varsa hepsini excel’e aktarmaya çalıştı yani menü vs. ne varsa. Bunu önlemenin bir yolu var mı acaba?

    • Ahmet dedi ki:

      Selamlar Ali İhsan,

      Excel’e export ettiğin sayfada herahangi bir echo yapmaman gerekir. exportExcel() fonksiyonundan önce header veya başka bir çıktı verdiğin için bu hata meydana geliyor.

      İyi çalışmalar…

  10. Sefa dedi ki:

    Merhaba Hocam,

    Benim bir sorum var, mysql den aldığımız datayı mssql den sorgulatıp excele nasıl aktarabiliriz? Yardımcı olursanız çok sevinirim.

  11. koray yaman dedi ki:

    bu cok kalıtelı olmus ama ben elle duzenlemelerı yaparım yeterkı kayıt edecek halde bana xls versın dersenız
    asp de kullandıgım bır sıstemı php de gordum daha yenı basladıgım ıcın php scrıptıne oturtamam ama kodu vereyım mantık aynı bu dırek php sayfanızı xls formatına donusturur
    dıkatt edılmesı gerken kısım dıv degıl bıdlıgınız standart tablo ıle yapın ozaman her tablo bır hucre mantıgında verır

    kod :
    header(“Content-type: application/vnd.ms-excel; name=’excel'”);
    header(“Content-Disposition: attachment; filename=exportfile.xls”);
    header(“Pragma: no-cache”);
    header(“Expires: 0”);

    deneyın yapan yapılmıs halını yayınlasın ısteyen arkadaslar dırek burdan ulassın

  12. merhaba dedi ki:

    merhabalar excele çıktı veriyor ama sadece a1 kolonunda
    html veriyi basıyor sizin dosyanızı indirdim direk çalıştırdım.

  13. faruk dedi ki:

    iyi günler ben php ile değilde js ile yapıyorum excel export işlemni mevcut table lımı basıyorum sıkıntı yok ama ben customize etmek istiyorum header ve footer eklemek istiyorum nasıl yapabilirim

  14. Hamit dedi ki:

    Selamlar. Excel dosyasını dikey değilde yatay konumda ayarlanmasını istiyorum. Hangi parametreyi, nereye girmeliyim?
    Teşekkürler donus bekliyorum

    • Ahmet dedi ki:

      Selam Hamit,
      Hocam HTML olarak bastığımız için sadece mso-*-* ile başlayan formatları kullanabiliyoruz. Numara formatı, text formatı gibi… Html data sayfayı yan çevirmeye daha önce denk gelmedim. Muhtemelen böyle bir özelliği yoktur diye düşünüyorum. Kolay gelsin.

  15. serdar dedi ki:

    iyi geceler, verdiğiniz mysql sorgusunuda kullanarak veriyi başarılı şekilde excel aktardı, fakat son kaydı almıyor. yani bir satır eksik aktarıyor excel e yaprdımcı olurmusunuz… teşekkürler

  16. Toplu Sms dedi ki:

    Merhaba Ahmet hocam. Bu makaledeki paylaşımınız ile Toplu Sms sitesi olan https://esemes.net sitemiz için çok fayda sağladı. tekrardan teşekkürler.

  17. cem dedi ki:

    hocam word belgesinede yazdırabiliyor muyuz acaba

  18. Şakir dedi ki:

    Paylaşımınız için teşekkürler. Başka bir yöntemle tablodan excele aktardığımda 6000 kayıttan sonrasını excele atamıyordu. Sizin fonksiyonu kullanarak 80 000 kaydı excele aktardım. Teşekkürler.

    • Ahmet dedi ki:

      Merhaba Şakir,
      Kullandığın yöntemde 6000 satırı atarken RAM’ı aşırı kullandığı için muhtemelen memory_limit değerine takılıyorsun. Paylaştığım export fonksiyonu RAM’i aşırı kullanmadığı için çok fazla satırı export edebilirsin. Kolay gelsin.

  19. fatih dedi ki:

    merhaba Ahmet bey benim veritabanımda html kodlar var sizin uygulama ile excele çevirdiğimde kodlar işlenip kaydediliyor mesela yazı rengi html kod olarak kımızı ise farklı bir hücrede kırmızı olarak çıkıyor. Bu tabloyu yazı formatında kod olarak nasıl kaydedebilirim?

    • Ahmet dedi ki:

      Merhaba Fatih,
      Açıkçası yukarıda gösterdiğim örnek, temel işlemler için geçerlidir. Siz ise daha gelişmiş araca ihtiyaç duyuyorsunuz. Bunun için size https://github.com/PHPOffice/PhpSpreadsheet paketini tavsiye ederim. Kullanımı oldukça kolaydır.
      Ram tüketimi bir miktar fazladır fakat istediğiniz birçok işlemi yapabilirsiniz. Aşırı fazla satır export etmeniz durumunda memory_limit e dikkat ediniz.
      Örnek Kullanımı:

      require 'vendor/autoload.php';

      use PhpOffice\PhpSpreadsheet\Spreadsheet;
      use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

      $spreadsheet = new Spreadsheet();
      $sheet = $spreadsheet->getActiveSheet();
      $sheet->setCellValue('A1', 'Hello World !');

      $writer = new Xlsx($spreadsheet);
      $writer->save('hello world.xlsx');

  20. Emin M. dedi ki:

    Mysql için kullanımda örnek olarak yapmış olduğum…

    function exportExcel($filename=’Tablo’,$kolonlar=array(),$veri=array(),$kolonsayisi=array()){
    header(‘Content-Encoding: UTF-8’);
    header(‘Content-Type: text/plain; charset=utf-8′);
    header(“Content-disposition: attachment; filename=”.$filename.”.xls”);
    echo “\xEF\xBB\xBF”; // UTF-8 BOM
    $say=count($kolonlar);
    echo ”;
    foreach($kolonlar as $v){
    echo ”.trim($v).”;
    }
    echo ”;
    foreach($veri as $val){
    echo ”;
    for($i=0; $i < $say; $i++){
    if(in_array($i,$kolonsayisi)){
    echo '’.str_replace(‘.’,’,’,$val[$i]).”;
    }else{
    echo ”.$val[$i].”;
    }
    }
    echo ”;
    }
    }

    Bu kodları fonksiyonların olduğu bölüme yapıştırın

    $sorgu = mysql_query(“Select * from galeri”);
    $veri=array();
    while($row=mysql_fetch_row($sorgu)){
    $resmilinkle=’=KÖPRÜ(“https://siteadiniz.com/’.$row[1].'”;”Resmi Aç”)’;
    $dizi=array(“1″=>”Cam Balkon”,”2″=>”Duşa Kabin”,”3″=>”Banyo Dolapları”,”4″=>”PVC Doğrama”,”5″=>”Diğer Çalışmalarımız”);
    $kategori=$row[2];
    $veri[]=array($row[0],$resmilinkle,$dizi[$kategori],$row[3]);
    }
    mysql_free_result($sorgu);

    $sql = mysql_query(“SELECT UPPER(COLUMN_NAME) AS ‘KOLON’FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’galeri’ ORDER BY `COLUMNS`.`ORDINAL_POSITION` ASC”);
    $kolonlar=array();
    while ($row = mysql_fetch_array($sql)) {
    $kolonlar[] = $row[‘KOLON’];
    }

    $sayisikac = mysql_query(“SELECT COUNT(*) AS ‘SAYI’ FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’galeri'”);
    $sayi = mysql_fetch_row($sayisikac);
    $kolonsayisi=$sayi[0];

    exportExcel(‘Raporum’,$kolonlar,$veri,$kolonsayisi);
    }

    bu kodlarıda kodları çalıştırmak istediğiniz yere yapıştırın…

  21. ferhat duman dedi ki:

    hocam paylaşım için teşekkürler çok işime yaradı ancak benim bazı satırları gelen veriye göre renklendirmem lazım bunu nasıl yapabilirim

    • Ahmet dedi ki:

      Merhaba Ferhat,
      td elementi için style tanımlaması yapabilirsin. color, background-color gibi… Temel html özelliklerini kullanabilirsiniz.

  22. Serkan dedi ki:

    function exportExcel($filename=’ExportExcel’, $columns=array(), $data=array())
    {
    header(‘Content-Encoding: UTF-8’);
    header(‘Content-Type: text/plain; charset=utf-8’);
    header(“Content-disposition: attachment; filename=”.$filename.”.xls”);

    echo “\xEF\xBB\xBF”; // UTF-8 BOM

    $say = count($columns);

    echo ”;

    echo ”;

    foreach($columns as $columnKey => $columnValue) echo ”.trim($columnValue).”;

    echo ”;

    foreach ($data as $dataKey => $dataValue)
    {
    echo ”;
    foreach($columns as $columnKey => $columnValue) echo ”.$dataValue[$columnKey].”;
    echo ”;
    }

    echo ”;
    }

    *Kullanımı*

    exportExcel(‘customers’, array(
    ‘id’ => ‘ID’,
    ‘name’ => ‘MÜŞTERİ’,
    ‘code’ => ‘ERP_CARİ_KODU’,
    ‘credit_limit’ => ‘ALIŞVERİŞ LİMİTİ’,
    ‘customer_group_name’ => ‘MÜŞTERİ_GRUBU/TİPİ’,
    ‘status’ => ‘DURUM’,
    ‘representative_name’ => ‘TEMSİLCİ’,
    ), $customers);

    exit;

  23. ymail dedi ki:

    hocam merhaba php ile excele aktar butonunu nasıl yapabilirim destek olur musunuz?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir