Bazen veri tabanındaki kayıtları Excel gibi elektronik tablolara aktarmamız gerekir. Aktarma işleminde Türkçe karakterlerin aktarılmasında genellikle sorunlar yaşarız. Bu yazıda PHP’den Excel’e verileri aktarma ve Excelde olmayan ASCII karakterler ile ilgili yaşanan sorunu düzeltme üzerine bir kaç püf noktaya değineceğim.
Excel’in dosyayı nasıl yorumlayacağı ile ilgili çözümü Excel varsayılan kodlaması sisteme bağlıdır. Geçici çözüm, dosyaya başlangıçta üç sihirli bayt koymaktır. Bunlara BOM denir ve bu dosyanın UTF-8 olarak kodlandığı editöre söylenir.
Gerisi hiç bir değişiklik yapmadan verilerimizi Excel aktarmaktır.
Excel’e kaydetme sınıfının oluşturulması
Verileri PHP ile Excel’e kaydetmek için sınıf oluşturmak zorunda değiliz. Fakat bu şekilde yapılmış bir uygulama diğer projelerde de rahatlıkla kullanımın önünü açmaktadır. Excel sınıfını oluşturup adım adım neler yapıldığını inceleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php class Excel { private $fp=null; function __construct() { $this->fp = fopen('php://output', 'w'); } function doldur($data=array()){ //UTF-8 Excel fputs($this->fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); if ($this->fp) { foreach($data as $d) { if(!isset($isaret)) { fputcsv($this->fp,array_keys($d), ";"); $isaret = true; } fputcsv($this->fp, $d, ";"); } } fclose($this->fp); } function kaydet($dosya){ header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Description: File Transfer'); header('Content-Type: text/csv'); header("Content-Disposition: attachment; filename=$dosya.csv;"); header('Content-Transfer-Encoding: binary'); } } |
__construct: Kurucu metot ile yazmak için bir tane file stream açıyoruz. $fp özelliği içinde de bu bilgi tutuluyor.
doldur: Doldur metotu ile Veritabanından yada her hangi bir listeden çektiğimiz verileri açtığımız dosyaya dolduruyoruz. Burada dikkat edilmesi gereken nokta 13.satırdaki koddur. Dosyanın kodlamasının BOM olarak yapıldığını ( chr(0xEF) . chr(0xBB) . chr(0xBF) karakterleri ile ifade ediyoruz. Türkçe Karakter sorunu buradaki kod ile çözülüyor. Sonraki satırlarda gelen değleri dosyaya yazdırmak oluyor.
kaydet: Kaydet metodu ile veriyi hangi isimde kayıt edileceğinin bilgisini veriyoruz.
PHP ile Excel’e Aktarma
Sınıfı ve fonksiyonlarını yazdıktan sonra kullanımı için aşağıdaki gibi örnek bir veri hazırlıyoruz. Bu veriler PDO ile MySql veri tabanından da çekilmiş olabilirdi.
1 2 3 4 5 6 7 8 9 10 11 |
$veri = [ ["ad" => "Hayri", "soyad" => "Koç", "yas" => 75], ["ad" => "Mehmet", "soyad" => "Kacar", "yas" => 14], ["ad" => "Murat", "soyad" => "Ülgen", "yas" => 41], ["ad" => "Recep", "soyad" => "Ören", "yas" => 47], ["ad" => "Hüseyin", "soyad" => "İlkDağcı", "yas" => 23], ["ad" => "Şerif", "soyad" => "Bağcı", "yas" => 4], ["ad" => "Ayşe" ,"soyad" => "Uyanık", "yas" => 7] ]; |
Verileri yukarıdaki gibi hazırladıktan sonra aşağıdaki gibi sınıfın bir örneğini oluşturup kayıt işlemini gerçekleştiriyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php include 'excel.php'; $veri = [ ["ad" => "Hayri", "soyad" => "Koç", "yas" => 75], ["ad" => "Mehmet", "soyad" => "Kacar", "yas" => 14], ["ad" => "Murat", "soyad" => "Ülgen", "yas" => 41], ["ad" => "Recep", "soyad" => "Ören", "yas" => 47], ["ad" => "Hüseyin", "soyad" => "İlkDağcı", "yas" => 23], ["ad" => "Şerif", "soyad" => "Bağcı", "yas" => 4], ["ad" => "Ayşe" ,"soyad" => "Uyanık", "yas" => 7] ]; $excel =new Excel(); //excel örneği oluştur $excel->doldur($veri); //veriler ile tabloları doldur $excel->kaydet("yazilimbilisim"); //yazilimbilisim adında kaydet |
Php ile MySql Verilerini Excel’e Aktarma
Sınıf haline çevrilmiş excel kütüphanesi ile verileri her hangi veri veri kaynağından okuyup aktarmak kolay olduğunu belirtmiştim. Aşağıdaki örnek ise PDO ile MySql veritabanından okuma yapıp excel tablosuna kaydetme işlemini gerçekleştiriyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php include 'excel.php'; /* veri tabanı bağlantısı*/ $dsn = 'mysql:dbname=kutuphane;host=127.0.0.1'; $kullanici = 'root'; $sifre = ''; try { $baglanti = new PDO($dsn, $kullanici, $sifre); } catch (PDOException $e) { echo 'Bağlantı kurulamadı: ' . $e->getMessage(); } /*verilerin tümünü okuma*/ $sorgu=$baglanti->prepare("SELECT * FROM ogrenciler"); $sorgu->execute(); $liste=$sorgu->fetchAll(); /*okunan verileri excel'e kaydetme*/ $excel =new Excel(); $excel->doldur($liste); $excel->kaydet("yazilimbilisim"); |
İşte PHP tablosunu Excel’e aktarmak bu kadar kolay 🙂
Merhaba, Class’ı kullandım ancak excel dosyasına bulunduğu php dosyasının kodlarını yazıyor.
Nerede yanlışlık yapıyor olabilirim.
Merhaba, veritabanından verileri çekip excel’e aktarıyor ama excel de her bir sütunu hem alan ismi ile hem de 0 dan başlayarak her bir alanın yanına rakam yazım altına da veri satırını getiriyor,
yani 10 sütun varsa tablo da onu 20 olarak çekiyor ve satıra da aynı verileri yazıyor.
Örn.
adi | 0 |tcno|1 |tel |2
ali |ali|111 |111|555|555
Aynı sorunu yaşayan arkadaşlar için;
$liste=$sorgu->fetchAll();
satırını;
$liste=$sorgu->fetchAll(PDO::FETCH_ASSOC);
olarak değiştirin.
$liste=$sorgu->fetchAll(PDO::FETCH_ASSOC);
PDO::FETCH_ASSOC bunu parantez içine yazarsan istediğin gibi sonuç alırsın.
Kolay gelsin hocam,
Hazır bir excel şablonu hazırladım. Bu şablondaki excel’in istediğim satır ve sütununa veritabanımdan çektiğim verileri eklemek istiyorum. Bunun için nasıl bi yol izlemeliyim?
Cevap için şimdiden teşekkür ederim.