<?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;
}
}
|