<?PHP
define('Reviser_Version','0.23beta3');
define('Version_Num', 0.23);
define('Default_CHARSET', 'UTF-8');
define('Code_BIFF8', 0x600);
define('Code_WorkbookGlobals', 0x5);
define('Code_Worksheet', 0x10);
define('Type_EOF', 0x0a);
define('Type_BOUNDSHEET', 0x85);
define('Type_SST', 0xfc);
define('Type_CONTINUE', 0x3c);
define('Type_EXTSST', 0xff);
define('Type_LABEL', 0x204);
define('Type_LABELSST', 0xfd);
define('Type_WRITEACCESS', 0x5c);
define('Type_OBJPROJ', 0xd3);
define('Type_BUTTONPROPERTYSET', 0x1ba);
define('Type_DIMENSION', 0x200);
define('Type_ROW', 0x208);
define('Type_DEFCOLWIDTH', 0x55);
define('Type_COLINFO', 0x7d);
define('Type_DBCELL', 0xd7);
define('Type_RK', 0x7e);
define('Type_RK2', 0x27e);
define('Type_MULRK', 0xbd);
define('Type_MULBLANK', 0xbe);
define('Type_INDEX', 0x20b);
define('Type_NUMBER', 0x203);
define('Type_FORMULA', 0x406);
define('Type_FORMULA2', 0x6);
define('Type_BOOLERR', 0x205);
define('Type_UNKNOWN', 0xffff);
define('Type_BLANK', 0x201);
define('Type_SharedFormula', 0x4bc);
define('Type_STRING', 0x207);
define('Type_HEADER', 0x14);
define('Type_FOOTER', 0x15);
define('Type_BOF', 0x809);
define('Type_WINDOW2', 0x23e);
define('Type_COUNTRY', 0x8c);
define('Type_SUPBOOK', 0x1ae);
define('Type_EXTERNSHEET', 0x17);
define('Type_NAME', 0x18);
define('Type_MERGEDCELLS', 0xe5);
define('Type_SELECTION', 0x1d);
define('Type_FONT', 0x31);
define('Type_FORMAT', 0x041e);
define('Type_XF', 0xe0);
define('Type_DEFAULTROWHEIGHT', 0x225);
/**
* Class for regenerating Excel Spreadsheets
*/
class ExcelReviser
{
// temp for workbook Globals Substream data
var $wbdat='';
// part of workbook Globals Substream data
var $globaldat=array();
// original rowrecord
var $rowblock=array();
// original colinfo record
var $colblock=array();
// buffer for all cell-record
var $cellblock=array();
// sheet-block data
var $sheetbin=array();
// each parameter of sheet record
var $boundsheets=array();
// buffer of user setting parameter
var $revise_dat=array();
// each data of shared string
var $eachsst=array();
// hyperlink-data by user
var $hlink = array();
// sheet-number for erase by user
var $rmsheets=array();
// cell for erase by user
var $rmcells=array();
// option for some type of formula
var $exp_mode=0;
// duplicate-sheet data by user
var $dupsheet=array();
// part of original sheet data
var $stable=array();
// charactor-set name
var $charset;
// option for graph-object reference
var $opt_ref3d;
// option for parse mode
var $opt_parsemode;
// mergecells data
var $mergecells=array();
// set/unset merge info
var $mergeinfo=array();
// set column width
var $colwidth=array();
// set row height
var $rowheight=array();
// font data
var $recFONT=array();
// format data
var $recFORMAT=array();
// XF data
var $recXF=array();
// DEFAULTROWHEIGHT data
var $defrowH=array();
// DEFCOLWIDTH data
var $defcolW=array();
// print Area data
var $prnarea=array();
// print Title data
var $prntitle=array();
// debug for image-data
var $debug_image=1;
// save magic_quotes Flag
var $Flag_Magic_Quotes=False;
// Constructor
function ExcelReviser(){
//error_reporting(E_ALL ^ E_NOTICE);
$this->charset = Default_CHARSET;
$this->opt_ref3d = 0;
$this->globaldat['presheet']='';
$this->globaldat['presst']='';
$this->globaldat['last']='';
$this->globaldat['presup']='';
$this->globaldat['supbook']='';
$this->globaldat['extsheet']='';
$this->globaldat['name']='';
$this->globaldat['namerecord']='';
$this->globaldat['exsstbin']='';
}
/**
* Set(Get) internal charset, if you use multibyte-code.
* @param string $chrset charactor-set name(Ex. SJIS)
* @return string current charector-set name
* @access public
*/
function setInternalCharset($chrset=''){
if (strlen(trim($chrset)) > 2) {
$this->charset = $chrset;
}
return $this->charset;
}
/**
* Set(Get) parse mode, 1: include cell-attribute.
* @param string $mode set parse mode
* @return string current parse mode
* @access public
* @example ./sample_ex1.php sample_ex1
*/
function setParseMode($mode=null){
if ($mode == 1) {
$this->opt_parsemode = 1;
}
return $this->opt_parsemode;
}
/**
* Set reference option for graph-object in added sheet
* (This is experimental function. It operates under only
* the conditions which are limited.)
* @param integer $opt 1 = change link to self-sheet
* 0 = keep original link-address
* @return integer current value
* @access public
* @example ./sample2.php sample2
*/
function setOptionRef3d($opt=null){
if ($opt !== null){
$this->opt_ref3d= $opt;
}
return $this->opt_ref3d;
}
/**
* Set Cells to merge
* @param integer $sn sheet-number 0 base indexed
* @param integer $rowst row number for top-cell
* @param integer $rowen row number for bottom-cell
* @param integer $colst column number for left-cell
* @param integer $colen column number for right-cell
* @access public
* @example ./sample3.php sample3
*/
function setCellMerge($sn,$rowst,$rowen,$colst,$colen){
if ($sn < 0) return -1;
if ($rowst < 0 || $rowst > 65535) return -1;
if ($rowen < 0 || $rowen > 65535) return -1;
if ($colst < 0 || $colst > 255) return -1;
if ($colen < 0 || $colen > 255) return -1;
if ($rowst == $rowen && $colst == $colen) return -1;
if ($rowst > $rowen) return -1;
if ($colst > $colen) return -1;
$mtmp['rows']=$rowst;
$mtmp['rowe']=$rowen;
$mtmp['cols']=$colst;
$mtmp['cole']=$colen;
$this->mergeinfo['set'][$sn][]=$mtmp;
}
/**
* Unset original MergedCells
* @param integer $sn sheet-number 0 base indexed
* @access public
* @example ./sample3.php sample3
*/
function unsetCellMerge($sn){
if ($sn < 0) return -1;
$this->mergeinfo['unset'][$sn]=TRUE;
}
/**
* make MergedCells-info
* @param integer $sn sheet-number 0 base indexed
* @access private
*/
function makeMergeinfo($sn){
if ($sn < 0) return -1;
if (isset($this->mergeinfo['unset'][$sn])) unset($this->mergecells[$sn]);
if (isset($this->mergeinfo['set'][$sn])){
foreach($this->mergeinfo['set'][$sn] as $val){
if (count($this->mergecells[$sn]))
foreach($this->mergecells[$sn] as $key=>$val0){
if ($val['rows']==$val0['rows'] && $val['cols']==$val0['cols'])
unset($this->mergecells[$sn][$key]);
}
$this->mergecells[$sn][]=$val;
}
}
}
/**
* Parse file and Remake
* @param string $readfile full path filename for read
* @param string $outfile filename for web output
* @param string $path if not null then save file
* @access public
* @example ./sample.php sample
*/
function reviseFile($readfile,$outfile,$path=null){
$this->parseFile($readfile);
$this->reviseCell();
$this->makeFile($outfile,$path);
}
/**
* Remake file
* @param string $outfile filename for web output
* @param string $path if not null then save file
* @access public
* @example ./sample4.php sample4
*/
function buildFile($outfile,$path=null){
$this->reviseCell();
$this->makeFile($outfile,$path);
}
/**
* Copy Sheet
* @param integer $orgsn original sheet-number 0 indexed
* @param integer $num number of sheet to duplicate
* @access public
* @example ./sample2.php sample2
*/
function addSheet($orgsn,$num){
if ($num < 1) return;
$tmp['orgsn']=$orgsn;
$tmp['count']=$num;
$this->dupsheet[]=$tmp;
}
/**
* Add hyperlink to Cell
* @param integer $sn sheet number
* @param integer $row Row position
* @param integer $col Column posion 0indexed
* @param string $desc cell description(option)
* @param string $link absolute link path
* @param integer $refrow reference row(option)
* @param integer $refcol reference column(opt