<?php
 
 
// Kelas untuk mengexport perintah sql menjadi excel spread sheet.
 
// Bisa mengexport menjadi multiple sheet.
 
// Memiliki ketergantungan terhadap pustaka berikut:
 
// - Pear Spreadsheet
 
 
// 09 January 2001
 
// visit: http://baabullah.blogspot.com
 
 
require_once 'Spreadsheet/Excel/Writer.php';
 
 
/**
 
 * 
 
 * Menyimpan data SQL Sheet yang terdiri dari nama Sheet dan perintah SQL yang akan dieksekusi.
 
 * Perintah SQL harus dapat dieksekusi dengan baik oleh implementasi SqlExplorer Anda.
 
 * 
 
 * @author fridayana baabullah
 
 * @see SqlExplorer
 
 *
 
 */
 
class SqlSheet {
 
    /**
 
     * 
 
     * Nama sheet. Misalnya Sheet 1
 
     * @var string
 
     */
 
    private $name;
 
    
 
    /**
 
     * 
 
     * Perintah SQL yang akan dieksekusi. Perintah ini harus dapat dieksekusi dengan baik oleh
 
     * implementasi SqlExplorer Anda.
 
     * @var string
 
     */
 
    private $sql;
 
    
 
    public function setName($name) {
 
        $this->name = $name;
 
    }
 
    
 
    public function getName() {
 
        return $this->name;
 
    }
 
    
 
    public function setSql($sql) {
 
        $this->sql = $sql;
 
    }
 
    
 
    public function getSql() {
 
        return $this->sql;
 
    }
 
}
 
 
/**
 
 * 
 
 * Jika PearWorkBookHelper dikonfigurasi mempunyai sebuah WriterCallback,
 
 * maka pada setiap kali PearWorkBookHelper menulis data akan memanggil
 
 * fungsi-fungsi di WriterCallback ini.
 
 * 
 
 * @author fridayana baabullah
 
 * @see PearWorkBookHelper
 
 */
 
interface WriterCallback {
 
    /**
 
     * 
 
     * Fungsi ini akan dieksekusi saat PearWorkBookHelper membuat header
 
     * 
 
     * @param Spreadsheet_Excel_Writer_Worksheet $worksheet object worksheet
 
     * @param int $rowNum nomor baris
 
     * @param int $colNum nomor kolom
 
     * @param mixed $data data yang akan dituliskan pada cell tersebut
 
     */
 
    public function onHeaderWrite(&$worksheet, $rowNum, $colNum, $data);
 
    
 
    /**
 
     * 
 
     * Fungsi ini akan dieksekusi saat PearWorkBookHelper menuliskan data
 
     * 
 
     * @param Spreadsheet_Excel_Writer_Worksheet $worksheet
 
     * @param int $rowNum nomor baris
 
     * @param int $colNum nomor kolom
 
     * @param mixed $data data yang akan dituliskan pada cell tersebut
 
     */
 
    public function onBodyWrite(&$worksheet, $rowNum, $colNum, $data);
 
}
 
 
/**
 
 * 
 
 * Kelas implementasi WriterCallback. Secara default PearWorkBookHelper
 
 * akan menggunakan instance dari kelas ini.
 
 * 
 
 * @author fridayana baabullah
 
 *
 
 */
 
class DefaultWriterCallback implements WriterCallback {
 
    public function onHeaderWrite(&$worksheet, $rowNum, $colNum, $data) {
 
        $worksheet->write($rowNum, $colNum, $data);
 
    }
 
    public function onBodyWrite(&$worksheet, $rowNum, $colNum, $data) {
 
        $worksheet->write($rowNum, $colNum, $data);
 
    }
 
}
 
 
/**
 
 * 
 
 * SqlExplorer adalah interface yang mendefinisikan fungsi
 
 * untuk mengeksekusi perintah SQL yang Anda berikan.
 
 * 
 
 * @author fridayana baabullah
 
 *
 
 */
 
interface SqlExplorer {
 
    /**
 
     * 
 
     * Dipanggil saat akan mengeksekusi perintah SQL
 
     * @param string $sql
 
     */
 
    public function query($sql);
 
    
 
    /**
 
     * 
 
     * Dipanggil saat mengiterasi row hasil query.
 
     * @return array yang diindex menggunakan numeric (tidak boleh assosiative array)
 
     */
 
    public function fetchArray();
 
    
 
    /**
 
     * 
 
     * @return int jumlah field pada row data tersebut
 
     */
 
    public function numFields();
 
    
 
    /**
 
     * 
 
     * @return string nama field pada offset tersebut
 
     * @param int $offset nomor field
 
     */
 
    public function fieldName($offset);
 
}
 
 
/**
 
 * 
 
 * Contoh implementasi SqlExplorer untuk mysql
 
 * @author fridayana baabullah
 
 *
 
 */
 
class MysqlSqlExplorer implements SqlExplorer {
 
    /**
 
     * 
 
     * Menyimpan koneksi mysql
 
     * @var MySQL link identifier 
 
     */
 
    private $conn;
 
    
 
    /**
 
     * 
 
     * Menyimpan result hasil query
 
     * @var resource
 
     */
 
    private $result = null;
 
    
 
    public function __construct($host, $user, $password, $dbname) {
 
        $this->conn = mysql_connect($host, $user, $password);
 
        mysql_select_db($dbname, $this->conn);
 
    }
 
    
 
    public function query($sql) {
 
        $this->result = mysql_query($sql, $this->conn);
 
    }
 
    
 
    public function fetchArray() {
 
        return mysql_fetch_array($this->result);
 
    }
 
    
 
    public function numFields() {
 
        return mysql_num_fields($this->result);
 
    }
 
    
 
    public function fieldName($offset){
 
        return mysql_field_name($this->result, $offset);
 
    }
 
}
 
 
/**
 
 * 
 
 * Kelas untuk menggenerate workbook sesuai dengan parameter SqlSheet yang diberikan
 
 * @author fridayana baabullah
 
 *
 
 */
 
class PearWorkBookHelper {
 
    
 
    public function __construct() {
 
        $this->setWriterCallback(new DefaultWriterCallback());
 
    }
 
    
 
    /**
 
     * Implementasi SqlExplorer Anda, silakan buatlah implementasi
 
     * SqlExplorer Anda sendiri sesuai dengan kebutuhan
 
     * @var SqlExplorer
 
     * @see SqlExplorer
 
     */
 
    private $sqlExplorer;
 
    public function setSqlExplorer(SqlExplorer $sqlExplorer) {
 
        $this->sqlExplorer = $sqlExplorer;
 
    }
 
    
 
    /**
 
     * 
 
     * @var WriterCallback
 
     */
 
    private $writerCallback = null;
 
    public function setWriterCallback(WriterCallback $writerCallback) {
 
        $this->writerCallback = $writerCallback;
 
    }
 
    
 
    /**
 
     * 
 
     * Membuat workbook yang telah diisi dengan data-data sesuai dengan Sql yang diberikan
 
     * 
 
     * @param array $sqlSheetList array of SqlSheet
 
     * @return Spreadsheet_Excel_Writer workbook
 
     */
 
    public function createWorkBook($sqlSheetList = array()) {
 
        $workbook = new Spreadsheet_Excel_Writer();
 
        
 
        foreach($sqlSheetList as $eachSqlSheet) {
 
            $worksheet =& $workbook->addWorksheet($eachSqlSheet->getName());
 
            $this->sqlExplorer->query($eachSqlSheet->getSql());
 
            
 
            $i = 1;
 
            $writeHeaderDone = false;
 
            while ($row = $this->sqlExplorer->fetchArray()) {
 
                $colNum = $this->sqlExplorer->numFields();
 
                
 
                if (!$writeHeaderDone) {
 
                    for ($c = 1; $c <= $colNum; $c++) {
 
                        if ($this->writerCallback != null) {
 
                            $this->writerCallback->onHeaderWrite($worksheet, $i - 1, $c - 1, $this->sqlExplorer->fieldName($c-1));
 
                        }
 
                        else {
 
                            $worksheet->writeString($i - 1, $c - 1, $this->sqlExplorer->fieldName($c-1));
 
                        }
 
                    }
 
                    $writeHeaderDone = true;
 
                }
 
                
 
                for ($c = 1; $c <= $colNum; $c++) {
 
                    if ($this->writerCallback != null) {
 
                        $this->writerCallback->onBodyWrite($worksheet, $i, $c-1, $row[$c-1]);
 
                    }
 
                    else {
 
                        $worksheet->write($i, $c-1, $row[$c-1]);
 
                    }
 
                }
 
                
 
                $i++;
 
            }
 
            
 
        }
 
        return $workbook;
 
    }
 
}
 
 
/**
 
 * 
 
 * Utilitas untuk mempermudah operasi workbook
 
 * @author fridayana baabullah
 
 *
 
 */
 
class WorkbookUtil {
 
    
 
    /**
 
     * 
 
     * Factory method sederhana untuk membuat sebuah SqlSheet
 
     * @param string $name nama sheetnya
 
     * @param string $sql perintah sqlnya
 
     * @return SqlSheet
 
     */
 
    public static function createSqlSheet($name, $sql) {
 
        $sqlSheet1 = new SqlSheet();
 
        $sqlSheet1->setSql($sql);
 
        $sqlSheet1->setName($name);
 
        return $sqlSheet1;
 
    }
 
    
 
}
 
 |