Php ile Excel’e 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ı
05. Php Dosyasını İndir
06. Güncelleme (30.04.2017)
MSO Formatları Listesi
Stil Kodu ve Değeri | Açı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.
Hocam Merhaba. Ben table kullanarak excel e aktarma yapıyorum php de. Fakat satırları atarken 2 satırı birleştirip atıyor.
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.
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.
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…
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.
$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
Merhaba Kutsi,
Aşağıdaki kodlar işini görecektir.
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…
Merhaba Kutsi,
Sql sorgunuz boş dönüyor olabilir mi?
Özellikle yukarıda belirttim. Ekrana basıyor echo ile sorun yok…
Kaynak kodları ekleyebilir misin?
$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);
?>
Selamlar. Kolon adlarını da dinamik yapabiliyor muyuz?
Eğer yapabiliyorsak, örnek yazabilir misiniz?
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
2016 Ekran çıktısı: http://i.hizliresim.com/kBM1ym.png
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?
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…
teşekkür ederim sorunu hallettim.
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.
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
merhabalar excele çıktı veriyor ama sadece a1 kolonunda
html veriyi basıyor sizin dosyanızı indirdim direk çalıştırdım.
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
Selamlar. Excel dosyasını dikey değilde yatay konumda ayarlanmasını istiyorum. Hangi parametreyi, nereye girmeliyim?
Teşekkürler donus bekliyorum
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.
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
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.
hocam word belgesinede yazdırabiliyor muyuz acaba
Maalesef. Fakat https://github.com/PHPOffice/PHPWord bu paket ile yapabilirsin. Kolay gelsin.
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.
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.
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?
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');
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…
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
Merhaba Ferhat,
td elementi için style tanımlaması yapabilirsin. color, background-color gibi… Temel html özelliklerini kullanabilirsiniz.
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;
hocam merhaba php ile excele aktar butonunu nasıl yapabilirim destek olur musunuz?