Php İle Excel Dosyası Oluşturmak

Genelde, herhangi bir biçimlendirme söz konusu olmadığında, veritabanındaki bir bilgiyi ya da başka bir tabloyu excel ortamına aktarmak için csv yöntemini kullanırım. Bu yöntem herkesin bildiği gibi, her sütunu tab ya da noktalı virgül gibi bir karakterle ve her satırı da enter karakteri ile bölmekten ibaret. Ama biçimlendirme söz konusu olduğunda, mesela sütunlara bir genişlik vermek, yazıları bold yapmak, bazı hücreleri sayı ya da para tipine çevirmek gibi biçimlendirmelerde bu yöntem işe yaramamakta.

PHP ile Excel Dosyası OluşturmakBu yüzden Excel'in anlayacağı tarzda dosya üreten basit bir sınıf yazmam gerekti. Aşağıda verdiğim koddaki sınıfı kullanarak Xml Spreadsheet dosyaları oluşturabilirsiniz. Bu sayede Excel'in anlayacağı tarzda biçimli tablolara sahip olacaksınız.

Aşağıdaki kodu, kendinize göre düzenleyebilirsiniz. GetHeader metodunda değişiklikler yaparak daha fazla sitil ve özellik ekleyebilirsiniz. Ya da yapmak istediğiniz sitil ve biçimleri ilk başta Excel ile yapıp, Xml SpreadSheet olarak kaydettikten sonra, GetHeader metodunu yaptığınız bu dosyaya göre düzenleyebilirsiniz. Örnek kullanım, sınıf kodlarının altındadır.

  

<?php

/**
 * ExcelWriter 1.0
 *
 * Programmed by Fatih Tolga Ata
 * fatih at diyezon dot com
 * 13.01.2007
 */




Class ExcelWriter

{   
    var $output = "";
    var $state;
    var $ColumnWidths = array();
    var $Rows = "";
    var $DefaultWidth = 65;

    function ExcelWriter($author, $sheettitle)

    {

        $this->state = "BEGIN";

        $this->output .= $this->GetHeader($author, $sheettitle);

    }

    function Generate()

    {

        if ($this->state != "END")

        {

            $this->output .= $this->GetColumnWidths();

            $this->output .= $this->Rows;

            $this->output .= $this->GetFooter();

            $this->state = "END";

        }

        return $this->output;            

    }

                                   
    function GetHeader($author, $sheettitle)

    {

        $date = date("d-m-Y");

        $time = date("H:i:s");

        return chr(0xEF).chr(0xBB).chr(0xBF).<<<EOH

<?xml version="1.0"?>

<?mso-application progid="Excel.Sheet"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"

 xmlns:o="urn:schemas-microsoft-com:office:office"

 xmlns:x="urn:schemas-microsoft-com:office:excel"

 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"

 xmlns:html="http://www.w3.org/TR/REC-html40">

 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">

  <Author>$author</Author>

  <LastAuthor>$author</LastAuthor>

  <Created>{$date}T{$time}Z</Created>

  <Version>12.00</Version>

 </DocumentProperties>

 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">

  <WindowHeight>11985</WindowHeight>

  <WindowWidth>19095</WindowWidth>

  <WindowTopX>120</WindowTopX>

  <WindowTopY>45</WindowTopY>

  <ProtectStructure>False</ProtectStructure>

  <ProtectWindows>False</ProtectWindows>

 </ExcelWorkbook>

 <Styles>

  <Style ss:ID="Default" ss:Name="Normal">

   <Alignment ss:Vertical="Bottom"/>

   <Borders/>

   <Font ss:FontName="Arial" x:CharSet="162" x:Family="Swiss" ss:Size="11"

    ss:Color="#000000"/>

   <Interior/>

   <NumberFormat/>

   <Protection/>

  </Style>

  <Style ss:ID="s62">

   <NumberFormat ss:Format="Fixed"/>

  </Style>

  <Style ss:ID="s63">

   <NumberFormat ss:Format="#,##0.00 "YTL""/>

  </Style>

  <Style ss:ID="s64">

   <Font ss:FontName="Arial" x:CharSet="162" x:Family="Swiss" ss:Size="11"

    ss:Color="#000000" ss:Bold="1"/>

  </Style>

 </Styles>

 <Worksheet ss:Name="$sheettitle">

  <Table ss:DefaultColumnWidth="$this->DefaultWidth" ss:DefaultRowHeight="15">



EOH;

    }

    function GetFooter()

    {

        return <<<EOH

  </Table>        

  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">

   <PageSetup>

    <Header x:Margin="0.3"/>

    <Footer x:Margin="0.3"/>

    <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>

   </PageSetup>

   <Print>

    <ValidPrinterInfo/>

    <HorizontalResolution>600</HorizontalResolution>

    <VerticalResolution>600</VerticalResolution>

   </Print>

   <Selected/>

   <Panes>

    <Pane>

     <Number>3</Number>

     <ActiveCol>3</ActiveCol>

    </Pane>

   </Panes>

   <ProtectObjects>False</ProtectObjects>

   <ProtectScenarios>False</ProtectScenarios>

  </WorksheetOptions>

 </Worksheet>

</Workbook>

EOH;

    }

    function GetColumnWidths()

    {

        foreach($this->ColumnWidths as $width)

        {

            if ($width == 0)

                $width = $this->DefaultWidth;

            $str .= "   <Column ss:AutoFitWidth="1" ss:Width="$width"/>n";

        }

        return $str;

    }

    function AddRow($data_arr, $type_arr)

    {

        $this->state = "PROCESS";

        $this->Rows .= "   <Row>n";

        for ($i=0; $i <count($data_arr); $i++)

        {

            $type = "String";

            $style = "";

            switch($type_arr[$i])

            {

                case "num":

                    $style = " ss:StyleID="s62"";

                    $type = "Number";

                    break;

                case "cur":

                    $style = " ss:StyleID="s63"";

                    $type = "Number";

                    break;

                case "bold":

                    $style = " ss:StyleID="s64"";

            }

            $this->Rows .= "    <Cell$style>";

            $this->Rows .= "<Data ss:Type="$type">".$data_arr[$i]."</Data>";

            $this->Rows .= "</Cell>n";

        }

        $this->Rows .= "   </Row>n";          

    }

}

?> 

Bu da örnek kullanım:

 

<?

//Bu header fonksiyonları dosyayı download ettirebilmek içindir

header("Pragma: no-cache");

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

header("Cache-Control: private", false);

header("Content-Type: application/octet-stream");

header("Content-Disposition: attachment; filename="exceldosyasi.xml"");

header("Content-Transfer-Encoding: binary");

/////////////////////////////////////////////////////



    //sınıfı oluşturalım

    $writer = new ExcelWriter("Yazar ismi","Sheet adı");

    //sütun genişliklerini belirleyelim.

    $writer->ColumnWidths = array(165,0,50,0); //Sıfırın manası varsayılan değerdir.

    $veriler = array("deneme",15,20,"Bold yazı");

    $tipler = array("", "num", "cur", "bold"); //""=> String, "num"=>Sayı, "cur"=>Para, "bold"=>Bold String

    $writer->AddRow($veriler, $tipler);

    $excel = $writer->Generate();

    header("Content-Length: ".strlen($excel)."");

    echo $excel;

?>

 


Yorumunuzu Ekleyin
Php İle Excel Dosyası Oluşturmak Yorumları +1 Yorum
  • Mahir
    1
    Mahir
    Selamlar güzel bir konu ama kullanamadım. Örnek olarak açıklayabilirmisiniz.
    09 Ocak 2010 13:47:26, Cumartesi


Yükleniyor...
Yükleniyor...