Login   Register  
PHP Classes
elePHPant
Icontem

File: anysqltoexcel.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of fridayana baabullah  >  PEAR WorkBook Helper  >  anysqltoexcel.php  >  Download  
File: anysqltoexcel.php
Role: Class source
Content type: text/plain
Description: Core classes
Class: PEAR WorkBook Helper
Generate an Excel spreadsheet with MySQL results
Author: By
Last change: Added type hint in PearWorkBookHelper::setWriterCallback. Many thanks to Stanislav Shramko :)
Date: 2011-01-15 15:28
Size: 6,882 bytes
 

Contents

Class file image Download
<?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;
    }
    
}