Location: PHPKode > scripts > PEAR WorkBook Helper > anysqltoexcel.php
<?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;
	}
	
}
Return current item: PEAR WorkBook Helper