PHP Classes

File: anysqltoexcel.php

Recommend this page to a friend!
  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: 13 years ago
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;
    }
   
}