Sakin Adam

Web Yazılım Günlüğü

Php ile Excel Dosyasından Veri Okuma

Php ile geliştirdiğiniz projelerde; müşterilerinizden, var olan verilerinin excel ile gönderilerek, sisteme işlenmesi yönündeki bir taleple karşılaşmışsınızdır. Bu makalede; bu işlemin php ile kolay, hızlı ve veri kaybı olmadan nasıl yapabileceğimizi anlatmaya çalışacağım. İşlemi, PhpExcel kütüphanesini kullanarak yapacağız. Kütüphaneyi bu adresten indirebilirsiniz. İşlemi gerçekleştirirken dikkat edilmesi gereken birkaç nokta var. Bunları da anlattıktan sonra örnek kodu vereceğim. Bunlardan en önemlisi dosya büyüklüğü. Dosya ne kadar büyük olursa işlem o kadar uzun sürüyor. Bu nedenle büyük dosyalarda “max_execution_time” hatası alabilirsiniz. Eğer kullandığınız sunucu kendinize ait ise “max_execution_time” değerini arttırabilirsiniz, ancak paylaşımlı hosting kullanıyorsanız, dosyayı parçalayarak işlemeniz daha mantıklı. Karşılaşabileceğiniz diğer sorun da dosya büyüklüğüyle ilgili olan “max memory usage” hatası. Diğer hatada olduğu gibi burada da çözüm kullandığınız sunucu/hosting türüne göre değeri arttırmak ya da  dosyayı parçalayarak işlemek. Bu gibi hatalarla karşılaşma durumuna karşı, kod içerisine bir sayaç yerleştirerek, işlem sonunda değerleri karşılaştırmanız, veri kaybının önüne geçmek için önemli. Karşılaştığım son sorun ise, başlık satırı. Dosya işlenirken başlık satırı da okunuyor ve diğer veriler gibi işlenebiliyor. O nedenle bu satıra da dikkat etmekte yarar var. Aşağıda örnek kodu paylaşıyorum. Bir hata ile karşılaşırsanız lütfen bildiriniz. Yorumlarınızı esirgemeyiniz lütfen.

Veri Okuma

<?php
error_reporting(E_ALL);//tüm hata gösterimleri açılıyor.
set_time_limit(0);//max_execution_time değeri olabilecek en üst değere getirliyor

include 'Classes/PHPExcel/IOFactory.php';//kullandığımız kütüphane
$inputFileName = 'dosya.xls';//işlenecek dosya
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
$excel_satirlar = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);//excel dosyasındaki aktif sekme kullanılıyor

$i=0;//sayac
foreach($excel_satirlar as $excel_satir){
    $i++;
    //veriler değişkene alınıyor
    $veri_1 = $excel_satir['A'];
    $veri_2 = $excel_satir['B'];
    $veri_3 = $excel_satir['C'];
    $veri_4 = $excel_satir['D'];
    $veri_5 = $excel_satir['E'];

    //bu kısımdan sonra verileri nasıl işlemek istiyorsanız ona göre kodları yazmamış gerekiyor. örneğin veri tabanına kaydetmek.
    }
}
echo $i;//satır sayısını kontrol için en son kaç satırın işlendiğini sayaçtan ekrana basıyoruz.
?>

Not : Her ihtimale karşı okunan verileri sql injection’a karşı süzmekte yarar var.

Php ile Excel Dosyası Oluşturma için ilgili makaleyi inceleyebilirsiniz.

14 Responses to Php ile Excel Dosyasından Veri Okuma

  1. Çok teşekkürler Güzel Paylaşım

  2. cemal himmetoğlu says:

    Merhabalar,

    Sizin kodlarınıza yakın olarak aşağıdaki kodlar ile aktarım yapmaktayım.

    soru 1:
    Aşağıda belirttiğim kodlar çalışmaktadır. Fakat Dosya 14 sütun 31000 satır olunca açıp okuyamıyor, nefesi yetmiyor, ancak 2300 satırda okumayı ve aktarmayı yapıyor, Öyleki aktaracağım dosya büyüklüğü 100.000 satırları bulacağı için bu aktarımda işlemi yapamadım.
    sorun 2:
    Sayfaları okutmak istedim fakat sadece ilk sayfayı okuyor, diğer sayfaları okutamadım,
    $excel->sheets[SAYFA][‘cells’][SATIR][SUTUN]; buraya sayfa numarası yazdım olmadı, sayfa adını yazdım olmadı,
    büyük dosyaları nasıl aktaracağız, çünkü aktarım web sayfasından form üzerinden olması gerektiği için, csv, sql, aktarım programı navitac gibi onları kullanamıyorum. bir fikir bir yol gösterirseniz sevinirim, teşekkürler

    require_once ‘Excel/reader.php’;
    //yeni excel dosyamız
    $data = new Spreadsheet_Excel_Reader();
    //çıkış karakter kodu. Yani Türkçe karakterler için ayar yaptık
    setOutputEncoding(‘ISO-8859-9′);
    $kaynak1 = $_FILES["dosya"]["tmp_name"]; //yüklenen dosyanın dı
    $klasor1 = “excelorderstat/”; // alınan excel dosyasının kopyalanacağı hedef yerimiz
    $yukle1 = $klasor1.basename($_FILES['dosya']['name']);
    $yukle2 = basename($_FILES['dosya']['name']); // dosyanın adını attığımız değişken
    if(move_uploaded_file($kaynak1, $yukle1))
    {
    echo “Dosya “. basename($_FILES['dosya']['name']). ” Başarıyla yüklendi…”;
    }
    else
    {
    echo “Dosya Yükleme İşlemi Başarısız… “;
    }
    $data-&gt;read(‘excelorderstat/’.$yukle2);
    for($i = 2; $i sheets[0]['numRows']; $i++) { //i=2 demek excelin ikinci satırından başlanacakdemektir.
    $SO_NO	= $data-&gt;sheets[0]['cells'][$i][1]; //1.sütundaki satırı oKur
    $MUS_NO	= $data-&gt;sheets[0]['cells'][$i][2]; //2. sütundaki satırı okur
    $MUS_AD	= $data-&gt;sheets[0]['cells'][$i][3];
    $ITEM_NO	= $data-&gt;sheets[0]['cells'][$i][4];
    $URUN_ADI = $data-&gt;sheets[0]['cells'][$i][5];
    $SAT_ADEDI = $data-&gt;sheets[0]['cells'][$i][6];
    $TOPLAM_TUTAR	= $data-&gt;sheets[0]['cells'][$i][7];
    $SIP_SEK	= $data-&gt;sheets[0]['cells'][$i][8];
    $SIP_TAR	= $data-&gt;sheets[0]['cells'][$i][9];
    $FAT_TAR	= $data-&gt;sheets[0]['cells'][$i][10];
    $MUS_REF	= $data-&gt;sheets[0]['cells'][$i][11];
    $SAT_KOD	= $data-&gt;sheets[0]['cells'][$i][12];
    $SIP_TAR1 = date(‘Y-m-d’) ;
    $FAT_TAR1 = date(‘Y-m-d’) ;
    $yeni1 = “INSERT INTO orderstatm
    ( SO_NO, MUS_NO, MUS_AD, ITEM_NO, URUN_ADI, SAT_ADEDI, TOPLAM_TUTAR, SIP_SEK, SIP_TAR, FAT_TAR, MUS_REF, SAT_KOD ) values
    (‘$SO_NO’, ‘$MUS_NO’, ‘$MUS_AD’,’$ITEM_NO’,’$URUN_ADI’, ‘$SAT_ADEDI’, ‘$TOPLAM_TUTAR’, ‘$SIP_SEK’, ‘$SIP_TAR1′, ‘$FAT_TAR1′, ‘$MUS_REF’, ‘$SAT_KOD’ )”;
    $SQL = mysql_query($yeni1) ;
    }
    echo “yükleme işlemi başarı ile gerçekleşti.”;
    
    • Birinci sorunuzun cevabını makale içerisinde vermiştim. Onun için makaleyi tekrar okumanınızı rica ediyorum 🙂

      İkinci sorunuz için ise;

      $objPHPExcel->setActiveSheetIndex(1);
      

      kodu ile excel sekmelerini değiştirebilirsiniz.

      Yorumunuz için teşekkürler 🙂

  3. Türkçe karakerler bozuk geliyor, nasıl bir çözüm önerirsiniz?

    if(($size&gt;0)&amp;&amp;($size&lt;($sizeMB*1024*1024))){							
    error_reporting(E_ALL);//tüm hata gösterimleri açılıyor
    set_time_limit(0);//max_execution_time değeri olabilecek en üst değere getirliyor						
    //echo $tmp.&quot;";
    include 'Classes/PHPExcel/IOFactory.php';//kullandığımız kütüphane
    $inputFileName = $tmp;//işlenecek dosya
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    $excel_satirlar = $objPHPExcel-&gt;getActiveSheet()-&gt;toArray(null,true,true,true);		
    //excel dosyasındaki aktif sekme kullanılıyor
    ?&gt;&lt;?php
    $i=0;//sayac
    foreach($excel_satirlar as $excel_satir){
    $veri_1 = $excel_satir[&#039;A&#039;];
    $veri_2 = $excel_satir[&#039;B&#039;];
    $veri_3 = $excel_satir[&#039;C&#039;];
    $veri_4 = $excel_satir[&#039;D&#039;];
    //echo &quot;A:&quot;.$veri_1.&quot;B:&quot;.$veri_2.&quot;C:&quot;.$veri_3.&quot;D:&quot;.$veri_4.&quot;";
    if($i==0){?&gt;
    &lt;?php
    echo $i;//satır sayısını kontrol için en son kaç satırın işlendiğini sayaçtan ekrana basıyoruz.
    }
    
  4. Tamam sayfayı UTF-8 yapınca türkçe karakterler düzeldi, teşekkürler 🙂

  5. Merhabalar $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); satırı çalışmıyor ve bağlantı sıfırlandı hatası veriyor. sorun ne olabilir acaba…

    • Kütüphane kodlarının ve okunan excel dosyasının dizinlerinin doğru olduğundan emin misin? Eğer localhost’ta çalışıyorsan bir de sunucuda denemeni tavsiye ederim.

  6. hocam peki veritabanından çekilen verileri nasıl yazdıracağız birde diyelim bir dosya oluşturduk devamlı aynı doayanın üzerine yazabilirmiyiz


    • Php ile Excel Dosyası Oluşturma
      makalesinden nasıl yazdırılacağına bakabilirsiniz. Aynı dosyanın üzerine yazabilirsiniz. Ancak o işlemde eski dosya silinip, yeni dosya oluşturuluyor. Hata ile aynı dosyanın üzerine yazarsanız, excel dosyasındaki eski verilerinizi kaybedersiniz yani.

  7. cemal himmetoğlu says:

    Merhabalar,
    Anlatım ve cevaplar çok sade ve anlaşılır, çok teşekküler
    Bende bir sorun çıktı.
    Ben dosyaları servera koydum, düzenleme yaptım, ilgili dosyaları bir dosya altına koydum. Fakat bu sefer de
    Excel dosyayı aktaramıyorum. Dosyalarımı 01_stok_dosya altına koydum. Serverda da …/httpdocs/01_stok_dosya
    altında durmaktadır. $klasor1 = “excelorderstat/”; bu kodu belirtiğim kod $klasor1 = “httpdocs/01_stok_dosya/excelorderstat/”; olarak değiştiriyorum fakat excel dosyasını bir türlü atmıyor. Bir sürü yol versiyonunu denedim olmadı. Başka bir yer de mi değişiklik yapmak gerekli?
    teşekkürler

    • Yorumunuz için teşekkürler 🙂

      Sorunu tam anlamamakla birlikte tahmin üzerinden yardımcı olmaya çalışayım. Dosyayı okuyan php ile excel farklı klasörlerde sanırım. Bu gibi durumlarda önce bir üst dizine çıkmak, sonra dizin adını yazmak gerekiyor. Yani sizin php kodunuz folder_1 -in içinde, excel dosyanız da folder_1 ile aynı dizinde olup, folder_2 olsun. Bu durumda php-den dizin belirtirken “../folder_2/excel.xls” şeklinde belirtmeniz gerekiyor. Yani “../” ile üst dizinlere çıkıp, sonra dosyanın yolunu belirtmelisiz.

      Eğer tahminim yanlış ise lütfen dönüş yapınız.

  8. kullandıgım excel dosyasının ilk satırları başlıklar. 1. satırı atlayıp diğer satırdan okumaya başlamasını nasıl sağlayabiliriz?

    • $i=0;//sayac değişkenini kontrol edecek bir if döngüsü koyarak 1. satırı pas geçebilirsiniz.

  9. Çok teşekkürler elimdeki alan listesini sayende mysql e aktarabildim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.