Mise a jour librairie php_writeexcel en 0.3.0 (la prcdente ne fonctionne pas en php5)

This commit is contained in:
Laurent Destailleur
2006-01-27 20:52:08 +00:00
parent c5462977e4
commit 08615d2bbc
27 changed files with 3430 additions and 1316 deletions

View File

@@ -1,3 +1,32 @@
0.3.0 (2005-11-01):
- Fixed cell merging (fix contributed by Nicolas Kahn - thanks!)
- Corrected the README: formulas are supported since version 0.2.2
- Added a method named set_codepage() to the workbook object which
allows to set the codepage (fixes German Umlauts on Macs for
example, contributed by Stefan Gr<47>nig - thanks!)
- Changed all calls of call_user_method_array() to call_user_func_array()
as recent PHP versions complain about call_user_method_array() being
deprecated (reported by Julien Detante and Luc Cessieux)
- Added $_debug to the class variable declaration of
class.writeexcel_biffwriter.inc.php and
class.writeexcel_worksheet.inc.php so that PHP doesn't complain about it
- The demos now produce proper headers ("Content-Type" and
"Content-Disposition") so that the correct application gets loaded
when an XLS file is received more reliably (thanks to
C. Mourad Jaber)
- Temporary files are now deleted (reported by Siggi Oskarsson)
- Added example-colors.php
- Fixed frozen and thawed panes (reported by Roger Jochem and Flavio
Ciotola)
- Added example-panes.php to prove that it's really fixed ;-)
- Added example-repeat.php because somebody reported that it doesn't
work - it does work for me, please report again if it fails for you
and send me your code
- Fixed cell range formulas like '$A$1:$B$2' which should now work
(thanks Cedric Chandon)
- Fixed the PHP 5 incompatibility (reported by several people, patch
by Jean Pasdeloup, thanks!)
0.2.2 (2003-10-08):
- Cleaned up class.writeexcel_biffwriter.inc.php
- Cleaned up _append() and _prepend() in class.writeexcel_biffwriter.inc.php

View File

@@ -1 +1 @@
You can contact me via email at <jonny@1409.org>.
You can contact me via email at <jonny@nurfuerspam.de>.

View File

@@ -1,18 +1,33 @@
Q: Could you please add support for XYZGJGNDF?
A: Sorry, this project is at its alpha stage. I won't add any new features
until there is a stable version.
A: Sorry, I don't have the time to make this a full-featured project.
It only contains the features which I need (and which were supported
by SpreadSheet:WriteExcel anyway). You are welcome to add features
yourself though and send it to me for inclusion.
Q: The files class.ole_pps_root.php and class.ole_pps_file.php are
missing. Where can I get them?
A: They are only required for big file (>7 MB) support and available
as a seperate project at
http://bettina-attack.de/jonny/view.php?path=/projects/php_ole/
http://bettina-attack.de/jonny/view.php/projects/php_ole/
Q: How can I create files bigger than 7 MB?
A: Use class.writeexcel_workbookbig.inc.php instead of
class.writeexcel_workbook.inc.php. You'll need the php_ole project
available at
http://bettina-attack.de/jonny/view.php?path=/projects/php_ole/
http://bettina-attack.de/jonny/view.php/projects/php_ole/
Q: Will you make the project PEAR compliant?
A: Probably. But this means a lot of work and will require some time.
Q: Is there a 'auto-column-width' function?
A: AFAIK Excel doesn't store this information in the XLS files but
calculates the auto-width at run-time, so this doesn't seem to be
possible, sorry.
Q: Is it possible to include Unicode strings in a worksheet?
A: Sorry, this is not possible due to the restrictions of the Excel 5
format which is still used.
Q: Is it possible to include strings with a length of more than
255 characters?
A: No, sorry. Please see the TODO file.

View File

@@ -1 +1 @@
http://www.bettina-attack.de/jonny/projects/php_writeexcel/
http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/

View File

@@ -67,21 +67,20 @@ with while porting SpreadSheet::WriteExcel to PHP:
What features are currently supported?
--------------------------------------
Basically all features of Spreadsheet::WriteExcel will hopefully be
supported one day. However, it makes use of some Perl packages with
functions I did not yet find for PHP.
Basically all features of Spreadsheet::WriteExcel are supported and
thanks to a lot of people (see CHANGELOG) who contributed code and bug
fixes, most things seem to work. However, please remember that it's still
in beta stage, so there are probably some bugs left.
Spreadsheet::WriteExcel uses the Parse::RecDescent package for formula
support. I havn't looked for a Recursive Descent parser for PHP yet. Thus
Excel formulas are not yet supported.
support. Andreas Brodowski has imported and changed the PEAR::Spreadsheet
Parser.php file, so formulas are supported since version 0.2.2.
Spreadsheet::WriteExcel uses the OLE::Storage_Lite package for
supporting Excel files bigger than approx. 7 MB. I have ported this
package already and called it php_ole. But I really don't know how
reliable it is, so use it with care!
All other features SHOULD work.
Documentation

View File

@@ -0,0 +1,9 @@
The maximum string length is 255 due to the Excel 5 format which is
still used. The long_string.pl example coming with
SpreadSheet::WriteExcel does not work for some reason. It must be
figured out why.
Volker Sauer has reported that sheet names in Excel files generated by
php_writeexcel get prepended with ".xls]" when he renames them, but I
can't reproduce it. If you can, please send me the generated file and
the version number of Excel you are using.

View File

@@ -0,0 +1,541 @@
<?php
/*
* Copyleft 2002 Johann Hanne
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
/*
* This is the OLE::Storage_Lite Perl package ported to PHP
* OLE::Storage_Lite was written by Kawai Takanori, kwitknr@cpan.org
*/
require_once "functions.ole.php";
class ole {
var $sFile;
#------------------------------------------------------------------------------
# new OLE::Storage_Lite
#------------------------------------------------------------------------------
function ole($sFile) {
$this->sFile=$sFile;
}
#------------------------------------------------------------------------------
# getPpsTree: OLE::Storage_Lite
#------------------------------------------------------------------------------
function getPpsTree($bData=false) {
#0.Init
$rhInfo = _initParse($this->_FILE);
if (!$rhInfo) {
return false;
}
#1. Get Data
list($oPps) = _getPpsTree(0, $rhInfo, $bData);
// close(IN);
return $oPps;
}
#------------------------------------------------------------------------------
# getSearch: OLE::Storage_Lite
#------------------------------------------------------------------------------
function getPpsSearch($raName, $bData=false, $iCase=false) {
#0.Init
$rhInfo = _initParse($this->_FILE);
if (!$rhInfo) {
return false;
}
#1. Get Data
$aList = _getPpsSearch(0, $rhInfo, $raName, $bData, $iCase);
// close(IN);
return $aList;
}
#------------------------------------------------------------------------------
# getNthPps: OLE::Storage_Lite
#------------------------------------------------------------------------------
function getNthPps($iNo, $bData=false) {
#0.Init
$rhInfo = _initParse($this->_FILE);
if (!$rhInfo) {
return false;
}
#1. Get Data
$oPps = _getNthPps($iNo, $rhInfo, $bData);
// close IN;
return $oPps;
}
#------------------------------------------------------------------------------
# _initParse: OLE::Storage_Lite
#------------------------------------------------------------------------------
function _initParse($sFile) {
//$oIo;
#1. $sFile is a resource (hopefully a file resource)
if (is_resource($sFile)) {
$oIo=$sFile;
}
#2. $sFile is a filename string
else {
$oIo=fopen($sFile, "rb");
}
return _getHeaderInfo($oIo);
}
#------------------------------------------------------------------------------
# _getPpsTree: OLE::Storage_Lite
#------------------------------------------------------------------------------
function _getPpsTree($iNo, $rhInfo, $bData, &$raDone) { // last par optional!
if($raDone!==false) {
if(in_array($iNo, $raDone)) {
return array();
}
} else {
$raDone=array();
}
array_push($raDone, $iNo);
$iRootBlock = $rhInfo->_ROOT_START;
#1. Get Information about itself
$oPps = _getNthPps($iNo, $rhInfo, $bData);
#2. Child
if($oPps->DirPps != 0xFFFFFFFF) {
$aChildL = _getPpsTree($oPps->DirPps, $rhInfo, $bData, $raDone);
$oPps->Child =& $aChildL;
} else {
$oPps->Child = false;
}
#3. Previous,Next PPSs
$aList = array();
if ($oPps->PrevPps != 0xFFFFFFFF) {
array_push($aList, _getPpsTree($oPps->PrevPps, $rhInfo, $bData, $raDone));
}
array_push($aList, $oPps);
if ($oPps->NextPps != 0xFFFFFFFF) {
array_push($aList, _getPpsTree($oPps->NextPps, $rhInfo, $bData, $raDone));
}
return $aList;
}
#------------------------------------------------------------------------------
# _getPpsSearch: OLE::Storage_Lite
#------------------------------------------------------------------------------
function _getPpsSearch($iNo, $rhInfo, $raName, $bData, $iCase, &$raDone) { // last par optional!
$iRootBlock = $rhInfo->_ROOT_START;
//my @aRes;
#1. Check it self
if($raDone!==false) {
if(in_array($iNo, $raDone)) {
return array();
}
} else {
$raDone=array();
}
array_push($raDone, $iNo);
$oPps = _getNthPps($iNo, $rhInfo, false);
$found=false;
foreach ($raName as $cmp) {
if (($iCase && strcasecmp($oPps->Name, $cmp)==0) ||
strcmp($oPps->Name, $cmp)==0) {
$found=true;
break;
}
}
if ($found) {
if ($bData) {
$oPps = _getNthPps($iNo, $rhInfo, $bData);
}
$aRes = array($oPps);
} else {
$aRes = array();
}
#2. Check Child, Previous, Next PPSs
if ($oPps->DirPps != 0xFFFFFFFF) {
array_push($aRes, _getPpsSearch($oPps->DirPps, $rhInfo, $raName, $bData, $iCase, $raDone));
}
if ($oPps->PrevPps != 0xFFFFFFFF) {
array_push($aRes, _getPpsSearch($oPps->PrevPps, $rhInfo, $raName, $bData, $iCase, $raDone));
}
if ($oPps->NextPps != 0xFFFFFFFF) {
array_push($aRes, _getPpsSearch($oPps->NextPps, $rhInfo, $raName, $bData, $iCase, $raDone));
}
return $aRes;
}
#===================================================================
# Get Header Info (BASE Informain about that file)
#===================================================================
function _getHeaderInfo($FILE) {
//my($iWk);
$rhInfo = new object();
$rhInfo->_FILEH_ = $FILE;
//my $sWk;
#0. Check ID
fseek($rhInfo->_FILEH_, 0, SEEK_SET);
$sWk=fread($rhInfo->_FILEH_, 8);
if ($sWk!="\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1") {
return false;
}
#BIG BLOCK SIZE
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x1E, 2, "v");
if ($iWk===false) {
return false;
}
$rhInfo->_BIG_BLOCK_SIZE = pow(2, $iWk);
#SMALL BLOCK SIZE
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x20, 2, "v");
if ($iWk===false) {
return false;
}
$rhInfo->_SMALL_BLOCK_SIZE = pow(2, $iWk);
#BDB Count
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x2C, 4, "V");
if ($iWk===false) {
return false;
}
$rhInfo->_BDB_COUNT = $iWk;
#START BLOCK
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x30, 4, "V");
if ($iWk===false) {
return false;
}
$rhInfo->_ROOT_START = $iWk;
#MIN SIZE OF BB
# $iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x38, 4, "V");
# if ($iWk===false) {
# return false;
# }
# $rhInfo->_MIN_SIZE_BB = $iWk;
#SMALL BD START
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x3C, 4, "V");
if ($iWk===false) {
return false;
}
$rhInfo->_SBD_START = $iWk;
#SMALL BD COUNT
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x40, 4, "V");
if ($iWk===false) {
return false;
}
$rhInfo->_SBD_COUNT = $iWk;
#EXTRA BBD START
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x44, 4, "V");
if ($iWk===false) {
return false;
}
$rhInfo->_EXTRA_BBD_START = $iWk;
#EXTRA BD COUNT
$iWk = _getInfoFromFile($rhInfo->_FILEH_, 0x48, 4, "V");
if ($iWk===false) {
return false;
}
$rhInfo->_EXTRA_BBD_COUNT = $iWk;
#GET BBD INFO
$rhInfo->_BBD_INFO= _getBbdInfo($rhInfo);
#GET ROOT PPS
$oRoot = _getNthPps(0, $rhInfo, false);
$rhInfo->_SB_START = $oRoot->StartBlock;
$rhInfo->_SB_SIZE = $oRoot->Size;
return $rhInfo;
}
#------------------------------------------------------------------------------
# _getInfoFromFile
#------------------------------------------------------------------------------
function _getInfoFromFile($FILE, $iPos, $iLen, $sFmt) {
//my($sWk);
if (!$FILE) {
return false;
}
if (fseek($FILE, $iPos, SEEK_SET)!==0) {
return false;
}
$sWk=fread($FILE, $iLen);
$data=unpack($sFmt."ret", $sWk);
return $data["ret"];
}
#------------------------------------------------------------------------------
# _getBbdInfo
#------------------------------------------------------------------------------
function _getBbdInfo($rhInfo) {
$aBdList = array();
$iBdbCnt = $rhInfo->_BDB_COUNT;
//my $iGetCnt;
//my $sWk;
$i1stCnt = floor(($rhInfo->_BIG_BLOCK_SIZE - 0x4C) / LongIntSize);
$iBdlCnt = floor($rhInfo->_BIG_BLOCK_SIZE / LongIntSize) - 1;
#1. 1st BDlist
fseek ($rhInfo->_FILEH_, 0x4C, SEEK_SET);
$iGetCnt = ($iBdbCnt < $i1stCnt) ? $iBdbCnt : $i1stCnt;
$sWk=fread($rhInfo->_FILEH_, LongIntSize*$iGetCnt);
$data=unpack("V".$iGetCnt."int", $sWk);
for ($c=0;$c<$iGetCnt;$c++) {
array_push ($aBdList, $data["int$c"]);
}
$iBdbCnt -= $iGetCnt;
#2. Extra BDList
$iBlock = $rhInfo->_EXTRA_BBD_START;
while(($iBdbCnt> 0) && _isNormalBlock($iBlock)){
_setFilePos($iBlock, 0, $rhInfo);
$iGetCnt= ($iBdbCnt < $iBdlCnt) ? $iBdbCnt : $iBdlCnt;
$sWk=fread($rhInfo->_FILEH_, LongIntSize*$iGetCnt);
$data=unpack("V".$iGetCnt."int", $sWk);
for ($c=0;$c<$iGetCnt;$c++) {
array_push ($aBdList, $data["int$c"]);
}
$iBdbCnt -= $iGetCnt;
$sWk=fread($rhInfo->_FILEH_, LongIntSize);
$data=unpack("Vint", $sWk);
$iBlock = $data["int"];
}
#3.Get BDs
$aWk=array();
$hBd=array();
$iBlkNo = 0;
//my $iBdL;
//my $i;
$iBdCnt = floor($rhInfo->_BIG_BLOCK_SIZE / LongIntSize);
foreach ($aBdList as $iBdl) {
// foreach $iBdL (@aBdList) {
_setFilePos($iBdL, 0, $rhInfo);
$sWk=fread($rhInfo->_FILEH_, $rhInfo->_BIG_BLOCK_SIZE);
$aWk = unpack("V".$iBdCnt."int", $sWk);
for ($i=0;$i<$iBdCnt;$i++, $iBlkNo++) {
if($aWk["int".$i] != ($iBlkNo+1)) {
$hBd["$iBlkNo"] = $aWk["int".$i];
}
}
}
return $hBd;
}
#------------------------------------------------------------------------------
# getNthPps (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getNthPps($iPos, $rhInfo, $bData) {
$iPpsStart = $rhInfo->_ROOT_START;
//my($iPpsBlock, $iPpsPos);
//my $sWk;
//my $iBlock;
$iBaseCnt = $rhInfo->_BIG_BLOCK_SIZE / PpsSize;
$iPpsBlock = floor($iPos / $iBaseCnt);
$iPpsPos = $iPos % $iBaseCnt;
$iBlock = _getNthBlockNo($iPpsStart, $iPpsBlock, $rhInfo);
if ($iBlock===false) {
return false;
}
_setFilePos($iBlock, PpsSize*$iPpsPos, $rhInfo);
$sWk=fread($rhInfo->_FILEH_, PpsSize);
// return undef unless($sWk);
//TODO: substr() binary safe?
$data=unpack("vint", substr($sWk, 0x40, 2));
$iNmSize = $data["int"];
$iNmSize = ($iNmSize > 2) ? $iNmSize - 2 : $iNmSize;
$sNm= substr($sWk, 0, $iNmSize);
$data=unpack("Cint", substr($sWk, 0x42, 2));
$iType = $data["int"];
$data=unpack("V3int", substr($sWk, 0x44, LongIntSize*3));
$lPpsPrev = $data["int1"];
$lPpsNext = $data["int2"];
$lDirPps = $data["int3"];
// TODO: Original lines terminated by commas: ?!
/*
my @raTime1st =
(($iType == PpsType_Root) or ($iType == PpsType_Dir))?
OLEDate2Local(substr($sWk, 0x64, 8)) : undef ,
my @raTime2nd =
(($iType == PpsType_Root) or ($iType == PpsType_Dir))?
OLEDate2Local(substr($sWk, 0x6C, 8)) : undef,
*/
$raTime1st = (($iType == PpsType_Root) or ($iType == PpsType_Dir)) ?
OLEDate2Local(substr($sWk, 0x64, 8)) : false;
$raTime2nd = (($iType == PpsType_Root) or ($iType == PpsType_Dir)) ?
OLEDate2Local(substr($sWk, 0x6C, 8)) : false;
$data=unpack("V2int", substr($sWk, 0x74, 8));
$iStart=$data["int1"];
$iSize=$data["int2"];
if ($bData) {
$sData = _getData($iType, $iStart, $iSize, $rhInfo);
/* TODO!!!
return OLE::Storage_Lite::PPS->new(
$iPos, $sNm, $iType, $lPpsPrev, $lPpsNext, $lDirPps,
\@raTime1st, \@raTime2nd, $iStart, $iSize, $sData, undef);
*/
} else {
/* TODO!!!
return OLE::Storage_Lite::PPS->new(
$iPos, $sNm, $iType, $lPpsPrev, $lPpsNext, $lDirPps,
\@raTime1st, \@raTime2nd, $iStart, $iSize, undef, undef);
*/
}
}
#------------------------------------------------------------------------------
# _setFilePos (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _setFilePos($iBlock, $iPos, $rhInfo) {
fseek($rhInfo->_FILEH_, ($iBlock+1)*$rhInfo->_BIG_BLOCK_SIZE+$iPos,
SEEK_SET);
}
#------------------------------------------------------------------------------
# _getNthBlockNo (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getNthBlockNo($iStBlock, $iNth, $rhInfo) {
//my $iSv;
$iNext = $iStBlock;
for ($i=0; $i<$iNth; $i++) {
$iSv = $iNext;
$iNext = _getNextBlockNo($iSv, $rhInfo);
if (!_isNormalBlock($iNext)) {
return;
}
}
return $iNext;
}
#------------------------------------------------------------------------------
# _getData (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getData($iType, $iBlock, $iSize, $rhInfo) {
if ($iType == PpsType_File) {
if($iSize < DataSizeSmall) {
return _getSmallData($iBlock, $iSize, $rhInfo);
} else {
return _getBigData($iBlock, $iSize, $rhInfo);
}
} elseif($iType == PpsType_Root) { #Root
return _getBigData($iBlock, $iSize, $rhInfo);
} elseif($iType == PpsType_Dir) { # Directory
return false;
}
}
#------------------------------------------------------------------------------
# _getBigData (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getBigData($iBlock, $iSize, $rhInfo) {
//my($iRest, $sWk, $sRes);
if (!_isNormalBlock($iBlock)) {
return '';
}
$iRest = $iSize;
//my($i, $iGetSize, $iNext);
$sRes = '';
/* TODO
my @aKeys= sort({$a<=>$b} keys(%{$rhInfo->{_BBD_INFO}}));
while ($iRest > 0) {
my @aRes = grep($_ >= $iBlock, @aKeys);
my $iNKey = $aRes[0];
$i = $iNKey - $iBlock;
$iNext = $rhInfo->{_BBD_INFO}{$iNKey};
_setFilePos($iBlock, 0, $rhInfo);
my $iGetSize = ($rhInfo->{_BIG_BLOCK_SIZE} * ($i+1));
$iGetSize = $iRest if($iRest < $iGetSize);
$rhInfo->{_FILEH_}->read( $sWk, $iGetSize);
$sRes .= $sWk;
$iRest -= $iGetSize;
$iBlock= $iNext;
}
*/
return $sRes;
}
#------------------------------------------------------------------------------
# _getNextBlockNo (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getNextBlockNo($iBlockNo, $rhInfo) {
$iRes = $rhInfo->_BBD_INFO[$iBlockNo];
return ($iRes!==false) ? $iRes : $iBlockNo+1;
}
#------------------------------------------------------------------------------
# _isNormalBlock (OLE::Storage_Lite)
# 0xFFFFFFFC : BDList, 0xFFFFFFFD : BBD,
# 0xFFFFFFFE: End of Chain 0xFFFFFFFF : unused
#------------------------------------------------------------------------------
function _isNormalBlock($iBlock) {
return ($iBlock < 0xFFFFFFFC) ? 1 : false;
}
#------------------------------------------------------------------------------
# _getSmallData (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getSmallData($iSmBlock, $iSize, $rhInfo) {
//my($sRes, $sWk);
$iRest = $iSize;
$sRes = '';
while ($iRest > 0) {
_setFilePosSmall($iSmBlock, $rhInfo);
$sWk=fread($rhInfo->_FILEH_, ($iRest >= $rhInfo->_SMALL_BLOCK_SIZE) ?
$rhInfo->_SMALL_BLOCK_SIZE : $iRest);
$sRes .= $sWk;
$iRest -= $rhInfo->_SMALL_BLOCK_SIZE;
$iSmBlock= _getNextSmallBlockNo($iSmBlock, $rhInfo);
}
return $sRes;
}
#------------------------------------------------------------------------------
# _setFilePosSmall(OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _setFilePosSmall($iSmBlock, $rhInfo) {
$iSmStart = $rhInfo->_SB_START;
$iBaseCnt = $rhInfo->_BIG_BLOCK_SIZE / $rhInfo->_SMALL_BLOCK_SIZE;
$iNth = floor($iSmBlock/$iBaseCnt);
$iPos = $iSmBlock % $iBaseCnt;
$iBlk = _getNthBlockNo($iSmStart, $iNth, $rhInfo);
_setFilePos($iBlk, $iPos * $rhInfo->_SMALL_BLOCK_SIZE, $rhInfo);
}
#------------------------------------------------------------------------------
# _getNextSmallBlockNo (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _getNextSmallBlockNo($iSmBlock, $rhInfo) {
//my($sWk);
$iBaseCnt = $rhInfo->_BIG_BLOCK_SIZE / LongIntSize;
$iNth = floor($iSmBlock/$iBaseCnt);
$iPos = $iSmBlock % $iBaseCnt;
$iBlk = _getNthBlockNo($rhInfo->_SBD_START, $iNth, $rhInfo);
_setFilePos($iBlk, $iPos * LongIntSize, $rhInfo);
$sWk=fread($rhInfo->_FILEH_, LongIntSize);
$data=unpack("Vint", $sWk);
return $data["int"];
}
}
?>

View File

@@ -0,0 +1,209 @@
<?php
/*
* Copyleft 2002 Johann Hanne
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
/*
* This is the OLE::Storage_Lite Perl package ported to PHP
* OLE::Storage_Lite was written by Kawai Takanori, kwitknr@cpan.org
*/
class ole_pps {
var $No;
var $Name;
var $Type;
var $PrevPps;
var $NextPps;
var $DirPps;
var $Time1st;
var $Time2nd;
var $StartBlock;
var $Size;
var $Data;
var $Child;
#------------------------------------------------------------------------------
# new (OLE::Storage_Lite::PPS)
#------------------------------------------------------------------------------
// TODO: Do we need this function?
/*
function ole_pps($iNo, $sNm, $iType, $iPrev, $iNext, $iDir,
$raTime1st, $raTime2nd, $iStart, $iSize,
$sData=false, $raChild=false) {
#1. Constructor for General Usage
if($iType == PpsType_File) { #FILE
return OLE::Storage_Lite::PPS::File->_new
($iNo, $sNm, $iType, $iPrev, $iNext, $iDir, $raTime1st, $raTime2nd,
$iStart, $iSize, $sData, $raChild);
}
elsif($iType == PpsType_Dir) { #DIRECTRY
return OLE::Storage_Lite::PPS::Dir->_new
($iNo, $sNm, $iType, $iPrev, $iNext, $iDir, $raTime1st, $raTime2nd,
$iStart, $iSize, $sData, $raChild);
}
elsif($iType == PpsType_Root) { #ROOT
return OLE::Storage_Lite::PPS::Root->_new
($iNo, $sNm, $iType, $iPrev, $iNext, $iDir, $raTime1st, $raTime2nd,
$iStart, $iSize, $sData, $raChild);
}
else {
die "Error PPS:$iType $sNm\n";
}
}
*/
// We probably don't need a constructor at all because
// all derived classed do their own initialization stuff
#------------------------------------------------------------------------------
# _new (OLE::Storage_Lite::PPS)
# for OLE::Storage_Lite
#------------------------------------------------------------------------------
function ole_pps($iNo, $sNm, $iType, $iPrev, $iNext, $iDir,
$raTime1st, $raTime2nd, $iStart, $iSize,
$sData=false, $raChild=false) {
#1. Constructor for OLE::Storage_Lite
$this->No = $iNo;
$this->Name = $sNm;
$this->Type = $iType;
$this->PrevPps = $iPrev;
$this->NextPps = $iNext;
$this->DirPps = $iDir;
$this->Time1st = $raTime1st;
$this->Time2nd = $raTime2nd;
$this->StartBlock = $iStart;
$this->Size = $iSize;
$this->Data = $sData;
$this->Child = $raChild;
}
#------------------------------------------------------------------------------
# _DataLen (OLE::Storage_Lite::PPS)
# Check for update
#------------------------------------------------------------------------------
function _DataLen() {
if ($this->Data===false) {
return 0;
}
if ($this->_PPS_FILE) {
return filesize($this->_PPS_FILE);
}
return strlen($this->Data);
}
#------------------------------------------------------------------------------
# _makeSmallData (OLE::Storage_Lite::PPS)
#------------------------------------------------------------------------------
function _makeSmallData(&$aList, $rhInfo) {
//my ($sRes);
$FILE = $rhInfo->_FILEH_;
$iSmBlk = 0;
for ($c=0;$c<sizeof($aList);$c++) {
$oPps=&$aList[$c];
#1. Make SBD, small data string
if ($oPps->Type==PpsType_File) {
if ($oPps->Size<=0) {
continue;
}
if($oPps->Size < $rhInfo->_SMALL_SIZE) {
$iSmbCnt = floor($oPps->Size / $rhInfo->_SMALL_BLOCK_SIZE) +
(($oPps->Size % $rhInfo->_SMALL_BLOCK_SIZE) ? 1 : 0);
#1.1 Add to SBD
for ($i = 0; $i<($iSmbCnt-1); $i++) {
fputs($FILE, pack("V", $i+$iSmBlk+1));
}
fputs($FILE, pack("V", -2));
#1.2 Add to Data String(this will be written for RootEntry)
#Check for update
if ($oPps->_PPS_FILE) {
//my $sBuff;
fseek($oPps->_PPS_FILE, 0, SEEK_SET); #To The Top
while ($sBuff=fread($oPps->_PPS_FILE, 4096)) {
$sRes .= $sBuff;
}
} else {
$sRes .= $oPps->Data;
}
if($oPps->Size % $rhInfo->_SMALL_BLOCK_SIZE) {
$sRes .= (str_repeat("\x00",
($rhInfo->_SMALL_BLOCK_SIZE -
($oPps->Size % $rhInfo->_SMALL_BLOCK_SIZE))));
}
#1.3 Set for PPS
$oPps->StartBlock = $iSmBlk;
$iSmBlk += $iSmbCnt;
}
}
}
$iSbCnt = floor($rhInfo->_BIG_BLOCK_SIZE / LongIntSize);
if ($iSmBlk % $iSbCnt) {
fputs($FILE, str_repeat(pack("V", -1), $iSbCnt - ($iSmBlk % $iSbCnt)));
}
#2. Write SBD with adjusting length for block
return $sRes;
}
#------------------------------------------------------------------------------
# _savePpsWk (OLE::Storage_Lite::PPS)
#------------------------------------------------------------------------------
function _savePpsWk($rhInfo) {
#1. Write PPS
$FILE=$rhInfo->_FILEH_;
fputs($FILE,
$this->Name.
str_repeat("\x00", 64 - strlen($this->Name)). # 64
pack("v", strlen($this->Name) + 2). # 66
pack("c", $this->Type). # 67
pack("c", 0x00). #UK # 68
pack("V", $this->PrevPps). #Prev # 72
pack("V", $this->NextPps). #Next # 76
pack("V", $this->DirPps). #Dir # 80
"\x00\x09\x02\x00". # 84
"\x00\x00\x00\x00". # 88
"\xc0\x00\x00\x00". # 92
"\x00\x00\x00\x46". # 96
"\x00\x00\x00\x00". # 100
//TODO!!! LocalDate2OLE($this->Time1st). # 108
"\x00\x00\x00\x00\x00\x00\x00\x00".
//TODO!!! LocalDate2OLE($this->Time2nd). # 116
"\x00\x00\x00\x00\x00\x00\x00\x00".
pack("V", ($this->StartBlock!==false) ?
$this->StartBlock : 0). # 120
pack("V", ($this->Size!==false) ?
$this->Size : 0). # 124
pack("V", 0) # 128
);
}
}
?>

View File

@@ -0,0 +1,50 @@
<?php
/*
* Copyleft 2002 Johann Hanne
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
/*
* This is the OLE::Storage_Lite Perl package ported to PHP
* OLE::Storage_Lite was written by Kawai Takanori, kwitknr@cpan.org
*/
require_once "class.ole_pps.php";
require_once "functions.ole.php";
class ole_pps_dir extends ole_pps {
function ole_pps_dir($sName, $raTime1st=false, $raTime2nd=false,
$raChild=false) {
$this->No = false;
$this->Name = $sName;
$this->Type = PpsType_Dir;
$this->PrevPps = false;
$this->NextPps = false;
$this->DirPps = false;
$this->Time1st = $raTime1st;
$this->Time2nd = $raTime2nd;
$this->StartBlock = false;
$this->Size = false;
$this->Data = false;
$this->Child = $raChild;
}
}
?>

View File

@@ -0,0 +1,74 @@
<?php
/*
* Copyleft 2002 Johann Hanne
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
/*
* This is the OLE::Storage_Lite Perl package ported to PHP
* OLE::Storage_Lite was written by Kawai Takanori, kwitknr@cpan.org
*/
require_once "class.ole_pps.php";
require_once "functions.ole.php";
class ole_pps_file extends ole_pps {
function ole_pps_file($sNm, $sData=false, $sFile=false) {
$this->No = false;
$this->Name = $sNm;
$this->Type = PpsType_File;
$this->PrevPps = false;
$this->NextPps = false;
$this->DirPps = false;
$this->Time1st = false;
$this->Time2nd = false;
$this->StartBlock = false;
$this->Size = false;
$this->Data = ($sFile===false) ? $sData : '';
$this->Child = false;
if ($sFile!==false) {
if (is_ressource($sFile)) {
$this->_PPS_FILE=$sFile;
} elseif ($sFile=="") {
$fname=tempnam("php_ole");
$this->_PPS_FILE=fopen($fname, "r+b");
} else {
$fname=$sFile;
$this->_PPS_FILE=fopen($fname, "r+b");
}
if ($sData!==false) {
fputs($this->_PPS_FILE, $sData);
}
}
}
function append ($sData) {
if ($this->_PPS_FILE) {
fputs($this->_PPS_FILE, $sData);
} else {
$this->Data.=$sData;
}
}
}
?>

View File

@@ -0,0 +1,517 @@
<?php
/*
* Copyleft 2002 Johann Hanne
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
/*
* This is the OLE::Storage_Lite Perl package ported to PHP
* OLE::Storage_Lite was written by Kawai Takanori, kwitknr@cpan.org
*/
require_once "class.ole_pps.php";
require_once "functions.ole.php";
class ole_pps_root extends ole_pps {
function ole_pps_root($raTime1st=false, $raTime2nd=false, $raChild=false) {
$this->No = false;
$this->Name = Asc2Ucs('Root Entry');
$this->Type = PpsType_Root;
$this->PrevPps = false;
$this->NextPps = false;
$this->DirPps = false;
$this->Time1st = $raTime1st;
$this->Time2nd = $raTime2nd;
$this->StartBlock = false;
$this->Size = false;
$this->Data = false;
$this->Child = $raChild;
}
#------------------------------------------------------------------------------
# save (OLE::Storage_Lite::PPS::Root)
#------------------------------------------------------------------------------
function save($sFile, $bNoAs=false, $rhInfo=false) {
#0.Initial Setting for saving
/*
if (!$rhInfo) {
$rhInfo=new object();
}
*/
$rhInfo->_BIG_BLOCK_SIZE=pow(2, (($rhInfo->_BIG_BLOCK_SIZE) ?
_adjust2($rhInfo->_BIG_BLOCK_SIZE) : 9));
$rhInfo->_SMALL_BLOCK_SIZE=pow(2, (($rhInfo->_SMALL_BLOCK_SIZE) ?
_adjust2($rhInfo->_SMALL_BLOCK_SIZE) : 6));
$rhInfo->_SMALL_SIZE = 0x1000;
$rhInfo->_PPS_SIZE = 0x80;
#1.Open File
#1.1 $sFile is Ref of scalar
if(is_resource($sFile)) {
$oIo=$sFile;
$rhInfo->_FILEH_ = $oIo;
}
#1.2 $sFile is a simple filename string
else {
$oIo=fopen("$sFile", "wb");
$rhInfo->_FILEH_ = $oIo;
}
$iBlk = 0;
#1. Make an array of PPS (for Save)
$aList=array();
$list=array(&$this);
if($bNoAs) {
$this->_savePpsSetPnt2($list, $aList, $rhInfo);
} else {
$this->_savePpsSetPnt($list, $aList, $rhInfo);
}
list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList, $rhInfo);
#2.Save Header
$this->_saveHeader($rhInfo, $iSBDcnt, $iBBcnt, $iPPScnt);
#3.Make Small Data string (write SBD)
$sSmWk = $this->_makeSmallData($aList, $rhInfo);
$this->Data = $sSmWk; #Small Datas become RootEntry Data
#4. Write BB
$iBBlk = $iSBDcnt;
$this->_saveBigData($iBBlk, $aList, $rhInfo);
#5. Write PPS
$this->_savePps($aList, $rhInfo);
#6. Write BD and BDList and Adding Header informations
$this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt, $rhInfo);
#7.Close File
fclose($rhInfo->_FILEH_);
}
#------------------------------------------------------------------------------
# _calcSize (OLE::Storage_Lite::PPS)
#------------------------------------------------------------------------------
function _calcSize(&$raList, $rhInfo) {
#0. Calculate Basic Setting
$iSBDcnt=0;
$iBBcnt=0;
$iPPScnt = 0;
$iSmallLen = 0;
$iSBcnt = 0;
for ($c=0;$c<sizeof($raList);$c++) {
$oPps=&$raList[$c];
if($oPps->Type==PpsType_File) {
$oPps->Size = $oPps->_DataLen(); #Mod
if($oPps->Size < $rhInfo->_SMALL_SIZE) {
$iSBcnt += floor($oPps->Size / $rhInfo->_SMALL_BLOCK_SIZE) +
(($oPps->Size % $rhInfo->_SMALL_BLOCK_SIZE) ? 1 : 0);
} else {
$iBBcnt +=
(floor($oPps->Size/ $rhInfo->_BIG_BLOCK_SIZE) +
(($oPps->Size % $rhInfo->_BIG_BLOCK_SIZE)? 1: 0));
}
}
}
$iSmallLen = $iSBcnt * $rhInfo->_SMALL_BLOCK_SIZE;
$iSlCnt = floor($rhInfo->_BIG_BLOCK_SIZE / LongIntSize);
$iSBDcnt = floor($iSBcnt / $iSlCnt)+ (($iSBcnt % $iSlCnt) ? 1 : 0);
$iBBcnt += (floor($iSmallLen/ $rhInfo->_BIG_BLOCK_SIZE) +
(( $iSmallLen% $rhInfo->_BIG_BLOCK_SIZE) ? 1 : 0));
$iCnt = sizeof($raList);
$iBdCnt = $rhInfo->_BIG_BLOCK_SIZE/PpsSize;
$iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt) ? 1 : 0));
return array($iSBDcnt, $iBBcnt, $iPPScnt);
}
#------------------------------------------------------------------------------
# _adjust2 (OLE::Storage_Lite::PPS::Root)
#------------------------------------------------------------------------------
function _adjust2($i2) {
$iWk = log($i2)/log(2);
return ($iWk > int($iWk)) ? floor($iWk)+1 : $iWk;
}
#------------------------------------------------------------------------------
# _saveHeader (OLE::Storage_Lite::PPS::Root)
#------------------------------------------------------------------------------
function _saveHeader($rhInfo, $iSBDcnt, $iBBcnt, $iPPScnt) {
$FILE = $rhInfo->_FILEH_;
#0. Calculate Basic Setting
$iBlCnt = $rhInfo->_BIG_BLOCK_SIZE / LongIntSize;
$i1stBdL = ($rhInfo->_BIG_BLOCK_SIZE - 0x4C) / LongIntSize;
$iBdExL = 0;
$iAll = $iBBcnt + $iPPScnt + $iSBDcnt;
$iAllW = $iAll;
$iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0);
$iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt) ? 1 : 0);
//my $i;
#0.1 Calculate BD count
if ($iBdCnt > $i1stBdL) {
// TODO: is do-while correct here?
do {
$iBdExL++;
$iAllW++;
$iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0);
$iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt) ? 1 : 0);
} while($iBdCnt > ($iBdExL*$iBlCnt+ $i1stBdL));
}
#1.Save Header
fputs($FILE,
"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1".
"\x00\x00\x00\x00".
"\x00\x00\x00\x00".
"\x00\x00\x00\x00".
"\x00\x00\x00\x00".
pack("v", 0x3b).
pack("v", 0x03).
pack("v", -2).
pack("v", 9).
pack("v", 6).
pack("v", 0).
"\x00\x00\x00\x00".
"\x00\x00\x00\x00".
pack("V", $iBdCnt).
pack("V", $iBBcnt+$iSBDcnt). #ROOT START
pack("V", 0).
pack("V", 0x1000).
pack("V", 0). #Small Block Depot
pack("V", 1)
);
#2. Extra BDList Start, Count
if($iBdCnt < $i1stBdL) {
fputs($FILE,
pack("V", -2). #Extra BDList Start
pack("V", 0) #Extra BDList Count
);
} else {
fputs($FILE,
pack("V", $iAll+$iBdCnt).
pack("V", $iBdExL)
);
}
#3. BDList
for ($i=0;($i<$i1stBdL) && ($i < $iBdCnt); $i++) {
fputs($FILE, pack("V", $iAll+$i));
}
if ($i<$i1stBdL) {
// TODO: Check, if str_repeat is binary safe
fputs($FILE, str_repeat((pack("V", -1)), ($i1stBdL-$i)));
}
}
#------------------------------------------------------------------------------
# _saveBigData (OLE::Storage_Lite::PPS)
#------------------------------------------------------------------------------
function _saveBigData(&$iStBlk, &$raList, $rhInfo) {
//return;//!!!
$iRes = 0;
$FILE = $rhInfo->_FILEH_;
#1.Write Big (ge 0x1000) Data into Block
for ($c=0;$c<sizeof($raList);$c++) {
$oPps=&$raList[$c];
if($oPps->Type!=PpsType_Dir) {
#print "PPS: $oPps DEF:", defined($oPps->{Data}), "\n";
$oPps->Size = $oPps->_DataLen(); #Mod
if(($oPps->Size >= $rhInfo->_SMALL_SIZE) ||
(($oPps->Type == PpsType_Root) && $oPps->Data!==false)) {
#1.1 Write Data
#Check for update
if($oPps->_PPS_FILE) {
//my $sBuff;
$iLen = 0;
fseek($oPps->_PPS_FILE, 0, SEEK_SET); #To The Top
while ($sBuff=fread($oPps->_PPS_FILE, 4096)) {
$iLen += length($sBuff);
fputs($FILE, $sBuff); #Check for update
}
} else {
fputs($FILE, $oPps->Data);
}
if ($oPps->Size % $rhInfo->_BIG_BLOCK_SIZE) {
// TODO: Check, if str_repeat() is binary safe
fputs($FILE, str_repeat("\x00",
($rhInfo->_BIG_BLOCK_SIZE -
($oPps->Size % $rhInfo->_BIG_BLOCK_SIZE)))
);
}
#1.2 Set For PPS
$oPps->StartBlock = $iStBlk;
$iStBlk +=
(floor($oPps->Size/ $rhInfo->_BIG_BLOCK_SIZE) +
(($oPps->Size % $rhInfo->_BIG_BLOCK_SIZE) ? 1 : 0));
}
}
}
}
#------------------------------------------------------------------------------
# _savePps (OLE::Storage_Lite::PPS::Root)
#------------------------------------------------------------------------------
function _savePps(&$raList, $rhInfo)
{
#0. Initial
$FILE = $rhInfo->_FILEH_;
#2. Save PPS
for ($c=0;$c<sizeof($raList);$c++) {
$oItem=&$raList[$c];
$oItem->_savePpsWk($rhInfo);
}
#3. Adjust for Block
$iCnt = sizeof($raList);
$iBCnt = $rhInfo->_BIG_BLOCK_SIZE / $rhInfo->_PPS_SIZE;
if($iCnt % $iBCnt) {
fputs($FILE, str_repeat("\x00", (($iBCnt - ($iCnt % $iBCnt)) * $rhInfo->_PPS_SIZE)));
}
return (floor($iCnt / $iBCnt) + (($iCnt % $iBCnt) ? 1 : 0));
}
#------------------------------------------------------------------------------
# _savePpsSetPnt2 (OLE::Storage_Lite::PPS::Root)
# For Test
#------------------------------------------------------------------------------
function _savePpsSetPnt2(&$aThis, &$raList, $rhInfo) {
#1. make Array as Children-Relations
#1.1 if No Children
if (!is_array($aThis) || sizeof($aThis)==0) {
return 0xFFFFFFFF;
} elseif (sizeof($aThis)==1) {
#1.2 Just Only one
array_push($raList, &$aThis[0]);
$aThis[0]->No = sizeof($raList)-1;
$aThis[0]->PrevPps = 0xFFFFFFFF;
$aThis[0]->NextPps = 0xFFFFFFFF;
$aThis[0]->DirPps = $this->_savePpsSetPnt2($aThis[0]->Child, $raList, $rhInfo);
return $aThis[0]->No;
} else {
#1.3 Array
$iCnt = sizeof($aThis);
#1.3.1 Define Center
$iPos = 0; #int($iCnt/ 2); #$iCnt
$aWk = $aThis;
$aPrev = (sizeof($aThis) > 2) ? array_splice($aWk, 1, 1) : array(); #$iPos);
$aNext = array_splice($aWk, 1); #, $iCnt - $iPos -1);
$aThis[$iPos]->PrevPps = $this->_savePpsSetPnt2($aPrev, $raList, $rhInfo);
array_push($raList, $aThis[$iPos]);
$aThis[$iPos]->No = sizeof($raList)-1;
#1.3.2 Devide a array into Previous,Next
$aThis[$iPos]->NextPps = $this->_savePpsSetPnt2($aNext, $raList, $rhInfo);
$aThis[$iPos]->DirPps = $this->_savePpsSetPnt2($aThis[$iPos]->Child, $raList, $rhInfo);
return $aThis[$iPos]->No;
}
}
#------------------------------------------------------------------------------
# _savePpsSetPnt2 (OLE::Storage_Lite::PPS::Root)
# For Test
#------------------------------------------------------------------------------
function _savePpsSetPnt2s(&$aThis, &$raList, $rhInfo) {
#1. make Array as Children-Relations
#1.1 if No Children
if (!is_array($aThis) || sizeof($aThis)==0) {
return 0xFFFFFFFF;
} elseif (sizeof($aThis)==1) {
#1.2 Just Only one
array_push($raList, &$aThis[0]);
$aThis[0]->No = sizeof($raList)-1;
$aThis[0]->PrevPps = 0xFFFFFFFF;
$aThis[0]->NextPps = 0xFFFFFFFF;
$aThis[0]->DirPps = $this->_savePpsSetPnt2($aThis[0]->Child, $raList, $rhInfo);
return $aThis[0]->No;
} else {
#1.3 Array
$iCnt = sizeof($aThis);
#1.3.1 Define Center
$iPos = 0; #int($iCnt/ 2); #$iCnt
array_push($raList, $aThis[$iPos]);
$aThis[$iPos]->No = sizeof($raList)-1;
$aWk = $aThis;
#1.3.2 Devide a array into Previous,Next
$aPrev = array_splice($aWk, 0, $iPos);
$aNext = array_splice($aWk, 1, $iCnt - $iPos - 1);
$aThis[$iPos]->PrevPps = $this->_savePpsSetPnt2($aPrev, $raList, $rhInfo);
$aThis[$iPos]->NextPps = $this->_savePpsSetPnt2($aNext, $raList, $rhInfo);
$aThis[$iPos]->DirPps = $this->_savePpsSetPnt2($aThis[$iPos]->Child, $raList, $rhInfo);
return $aThis[$iPos]->No;
}
}
#------------------------------------------------------------------------------
# _savePpsSetPnt (OLE::Storage_Lite::PPS::Root)
#------------------------------------------------------------------------------
function _savePpsSetPnt(&$aThis, &$raList, $rhInfo) {
//print "yyy type: ".gettype($aThis)."<br>\n";
//print "yyy name: ".$aThis[0]->Name."<br>\n";
#1. make Array as Children-Relations
#1.1 if No Children
if (!is_array($aThis) || sizeof($aThis)==0) {
return 0xFFFFFFFF;
} elseif (sizeof($aThis)==1) {
#1.2 Just Only one
array_push($raList, &$aThis[0]);
$aThis[0]->No = sizeof($raList)-1;
$aThis[0]->PrevPps = 0xFFFFFFFF;
$aThis[0]->NextPps = 0xFFFFFFFF;
$aThis[0]->DirPps = $this->_savePpsSetPnt($aThis[0]->Child, $raList, $rhInfo);
return $aThis[0]->No;
} else {
#1.3 Array
$iCnt = sizeof($aThis);
#1.3.1 Define Center
$iPos = floor($iCnt/2); #$iCnt
array_push($raList, $aThis[$iPos]);
$aThis[$iPos]->No = sizeof($raList)-1;
$aWk = $aThis;
#1.3.2 Devide a array into Previous,Next
$aPrev = splice($aWk, 0, $iPos);
$aNext = splice($aWk, 1, $iCnt - $iPos - 1);
$aThis[$iPos]->PrevPps = $this->_savePpsSetPnt($aPrev, $raList, $rhInfo);
$aThis[$iPos]->NextPps = $this->_savePpsSetPnt($aNext, $raList, $rhInfo);
$aThis[$iPos]->DirPps = $this->_savePpsSetPnt($aThis[$iPos]->Child, $raList, $rhInfo);
return $aThis[$iPos]->No;
}
}
#------------------------------------------------------------------------------
# _savePpsSetPnt (OLE::Storage_Lite::PPS::Root)
#------------------------------------------------------------------------------
function _savePpsSetPnt1(&$aThis, &$raList, $rhInfo) {
#1. make Array as Children-Relations
#1.1 if No Children
if (!is_array($aThis) || sizeof($aThis)==0) {
return 0xFFFFFFFF;
} elseif (sizeof($aThis)==1) {
#1.2 Just Only one
array_push($raList, &$aThis[0]);
$aThis[0]->No = sizeof($raList)-1;
$aThis[0]->PrevPps = 0xFFFFFFFF;
$aThis[0]->NextPps = 0xFFFFFFFF;
$aThis[0]->DirPps = $this->_savePpsSetPnt($aThis[0]->Child, $raList, $rhInfo);
return $aThis[0]->No;
} else {
#1.3 Array
$iCnt = sizeof($aThis);
#1.3.1 Define Center
$iPos = floor($iCnt / 2); #$iCnt
array_push($raList, $aThis[$iPos]);
$aThis[$iPos]->No = sizeof($raList)-1;
$aWk = $aThis;
#1.3.2 Devide a array into Previous,Next
$aPrev = splice($aWk, 0, $iPos);
$aNext = splice($aWk, 1, $iCnt - $iPos - 1);
$aThis[$iPos]->PrevPps = $this->_savePpsSetPnt($aPrev, $raList, $rhInfo);
$aThis[$iPos]->NextPps = $this->_savePpsSetPnt($aNext, $raList, $rhInfo);
$aThis[$iPos]->DirPps = $this->_savePpsSetPnt($aThis[$iPos]->Child, $raList, $rhInfo);
return $aThis[$iPos]->No;
}
}
#------------------------------------------------------------------------------
# _saveBbd (OLE::Storage_Lite)
#------------------------------------------------------------------------------
function _saveBbd($iSbdSize, $iBsize, $iPpsCnt, $rhInfo) {
$FILE = $rhInfo->_FILEH_;
#0. Calculate Basic Setting
$iBbCnt = $rhInfo->_BIG_BLOCK_SIZE / LongIntSize;
$i1stBdL = ($rhInfo->_BIG_BLOCK_SIZE - 0x4C) / LongIntSize;
$iBdExL = 0;
$iAll = $iBsize + $iPpsCnt + $iSbdSize;
$iAllW = $iAll;
$iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0);
$iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
//my $i;
#0.1 Calculate BD count
if ($iBdCnt >$i1stBdL) {
// TODO: do-while correct here?
do {
$iBdExL++;
$iAllW++;
$iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0);
$iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt) ? 1 : 0);
} while ($iBdCnt > ($iBdExL*$iBbCnt+$i1stBdL));
}
#1. Making BD
#1.1 Set for SBD
if($iSbdSize > 0) {
for ($i = 0; $i<($iSbdSize-1); $i++) {
fputs($FILE, pack("V", $i+1));
}
fputs($FILE, pack("V", -2));
}
#1.2 Set for B
for ($i = 0; $i<($iBsize-1); $i++) {
fputs($FILE, pack("V", $i+$iSbdSize+1));
}
fputs($FILE, pack("V", -2));
#1.3 Set for PPS
for ($i = 0; $i<($iPpsCnt-1); $i++) {
fputs($FILE, pack("V", $i+$iSbdSize+$iBsize+1));
}
fputs($FILE, pack("V", -2));
#1.4 Set for BBD itself ( 0xFFFFFFFD : BBD)
for ($i=0; $i<$iBdCnt;$i++) {
fputs($FILE, pack("V", 0xFFFFFFFD));
}
#1.5 Set for ExtraBDList
for ($i=0; $i<$iBdExL;$i++) {
fputs($FILE, pack("V", 0xFFFFFFFC));
}
#1.6 Adjust for Block
if(($iAllW + $iBdCnt) % $iBbCnt) {
fputs($FILE, str_repeat(pack("V", -1), ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt))));
}
#2.Extra BDList
if($iBdCnt > $i1stBdL) {
$iN=0;
$iNb=0;
for ($i=$i1stBdL;$i<$iBdCnt; $i++, $iN++) {
if($iN>=($iBbCnt-1)) {
$iN = 0;
$iNb++;
fputs($FILE, pack("V", $iAll+$iBdCnt+$iNb));
}
fputs($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i));
}
if(($iBdCnt-$i1stBdL) % ($iBbCnt-1)) {
fputs($FILE, str_repeat(pack("V", -1), (($iBbCnt-1) - (($iBdCnt-$i1stBdL) % ($iBbCnt-1)))));
}
fputs($FILE, pack("V", -2));
}
}
}
?>

View File

@@ -31,6 +31,7 @@ class writeexcel_biffwriter {
var $_data;
var $_datasize;
var $_limit;
var $_debug;
/*
* Constructor

View File

@@ -110,7 +110,7 @@ class writeexcel_format {
// Set properties passed to writeexcel_workbook::addformat()
if (sizeof($_)>0) {
call_user_method_array('set_properties', $this, $_);
call_user_func_array(array(&$this, 'set_properties'), $_);
}
}
@@ -119,7 +119,9 @@ class writeexcel_format {
*/
function copy($other) {
$xf = $this->_xf_index; // Backup XF index
$this = $other; // Copy properties
foreach ($other as $key->$value) {
$this->{$key} = $value;
}
$this->_xf_index = $xf; // Restore XF index
}

File diff suppressed because it is too large Load Diff

View File

@@ -45,6 +45,7 @@ class writeexcel_workbook extends writeexcel_biffwriter {
var $_sheetname;
var $_tmp_format;
var $_url_format;
var $_codepage;
var $_worksheets;
var $_sheetnames;
var $_formats;
@@ -77,6 +78,7 @@ function writeexcel_workbook($filename) {
$this->_sheetname = "Sheet";
$this->_tmp_format = $tmp_format;
$this->_url_format = false;
$this->_codepage = 0x04E4;
$this->_worksheets = array();
$this->_sheetnames = array();
$this->_formats = array();
@@ -411,6 +413,24 @@ function set_tempdir($tempdir) {
$this->_tempdir = $tempdir;
}
###############################################################################
#
# set_codepage()
#
# See also the _store_codepage method. This is used to store the code page, i.e.
# the character set used in the workbook.
#
function set_codepage($cp) {
if($cp==1)
$codepage = 0x04E4;
else if($cp==2)
$codepage = 0x8000;
if($codepage)
$this->_codepage = $codepage;
}
###############################################################################
#
# _store_workbook()
@@ -442,6 +462,8 @@ function _store_workbook() {
$this->_store_names(); # For print area and repeat rows
$this->_store_codepage();
$this->_store_window1();
$this->_store_1904();
@@ -499,6 +521,7 @@ function _store_OLE_file() {
while ($tmp = $sheet->get_data()) {
$OLE->write($tmp);
}
$sheet->cleanup();
}
}
@@ -1103,6 +1126,24 @@ function _store_palette() {
$this->_append($header . $data);
}
###############################################################################
#
# _store_codepage()
#
# Stores the CODEPAGE biff record.
#
function _store_codepage() {
$record = 0x0042; # Record identifier
$length = 0x0002; # Number of bytes to follow
$cv = $this->_codepage; # The code page
$header = pack("vv", $record, $length);
$data = pack("v", $cv);
$this->_append($header.$data);
}
}
?>

View File

@@ -43,6 +43,7 @@ class writeexcel_workbookbig extends writeexcel_workbook {
while ($data=$worksheet->get_data()) {
$file->append($data);
}
$worksheet->cleanup();
}
$ole=new ole_pps_root(false, false, array($file));

View File

@@ -38,6 +38,7 @@ class writeexcel_worksheet extends writeexcel_biffwriter {
var $_ext_sheets;
var $_using_tmpfile;
var $_tmpfilename;
var $_filehandle;
var $_fileclosed;
var $_offset;
@@ -100,6 +101,8 @@ class writeexcel_worksheet extends writeexcel_biffwriter {
var $_zoom;
var $_print_scale;
var $_debug;
/*
* Constructor. Creates a new Worksheet object from a BIFFwriter object
*/
@@ -122,6 +125,7 @@ class writeexcel_worksheet extends writeexcel_biffwriter {
$this->_ext_sheets = array();
$this->_using_tmpfile = 1;
$this->_tmpfilename = false;
$this->_filehandle = false;
$this->_fileclosed = 0;
$this->_offset = 0;
@@ -198,7 +202,8 @@ class writeexcel_worksheet extends writeexcel_biffwriter {
function _initialize() {
# Open tmp file for storing Worksheet data.
$fh=fopen(tempnam($this->_tempdir, "php_writeexcel"), "w+b");
$this->_tmpfilename=tempnam($this->_tempdir, "php_writeexcel");
$fh=fopen($this->_tmpfilename, "w+b");
if ($fh) {
# Store filehandle
@@ -206,6 +211,7 @@ function _initialize() {
} else {
# If tempfile() failed store data in memory
$this->_using_tmpfile = 0;
$this->_tmpfilename=false;
if ($this->_index == 0) {
$dir = $this->_tempdir;
@@ -305,11 +311,13 @@ function get_data() {
# Return data stored in memory
if ($this->_data!==false) {
$tmp = $this->_data;
$tmp=$this->_data;
$this->_data=false;
$fh = $this->_filehandle;
// The next data comes from the temporary file, so prepare
// it by putting the file pointer to the beginning
if ($this->_using_tmpfile) {
fseek($fh, 0, SEEK_SET);
fseek($this->_filehandle, 0, SEEK_SET);
}
if ($this->_debug) {
@@ -345,10 +353,20 @@ function get_data() {
}
}
# No data to return
# No more data to return
return false;
}
/* Remove the temporary file */
function cleanup() {
if ($this->_using_tmpfile) {
fclose($this->_filehandle);
unlink($this->_tmpfilename);
$this->_tmpfilename=false;
$this->_using_tmpfile=false;
}
}
/*
* Set this worksheet as a selected worksheet, i.e. the worksheet has
* its tab highlighted.
@@ -767,37 +785,37 @@ function write() {
# Match an array ref.
if (is_array($token)) {
return call_user_method_array('write_row', $this, $_);
return call_user_func_array(array(&$this, 'write_row'), $_);
}
# Match number
if (preg_match('/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/', $token)) {
return call_user_method_array('write_number', $this, $_);
return call_user_func_array(array(&$this, 'write_number'), $_);
}
# Match http, https or ftp URL
elseif (preg_match('|^[fh]tt?ps?://|', $token)) {
return call_user_method_array('write_url', $this, $_);
return call_user_func_array(array(&$this, 'write_url'), $_);
}
# Match mailto:
elseif (preg_match('/^mailto:/', $token)) {
return call_user_method_array('write_url', $this, $_);
return call_user_func_array(array(&$this, 'write_url'), $_);
}
# Match internal or external sheet link
elseif (preg_match('[^(?:in|ex)ternal:]', $token)) {
return call_user_method_array('write_url', $this, $_);
return call_user_func_array(array(&$this, 'write_url'), $_);
}
# Match formula
elseif (preg_match('/^=/', $token)) {
return call_user_method_array('write_formula', $this, $_);
return call_user_func_array(array(&$this, 'write_formula'), $_);
}
# Match blank
elseif ($token == '') {
array_splice($_, 2, 1); # remove the empty string from the parameter list
return call_user_method_array('write_blank', $this, $_);
return call_user_func_array(array(&$this, 'write_blank'), $_);
}
# Default: match string
else {
return call_user_method_array('write_string', $this, $_);
return call_user_func_array(array(&$this, 'write_string'), $_);
}
}
@@ -1069,6 +1087,7 @@ function _cell_to_rowcol($cell) {
function _encode_password($plaintext) {
$chars=preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY);
$count=sizeof($chars);
$i=0;
for ($c=0;$c<sizeof($chars);$c++) {
$char=&$chars[$c];
@@ -1377,7 +1396,7 @@ function write_url() {
}
# Add start row and col to arg list
return call_user_method_array('write_url_range', $this,
return call_user_func_array(array(&$this, 'write_url_range'),
array_merge(array($_[0], $_[1]), $_));
}
@@ -1413,14 +1432,14 @@ function write_url_range() {
# Check for internal/external sheet links or default to web link
if (preg_match('[^internal:]', $url)) {
return call_user_method_array('_write_url_internal', $this, $_);
return call_user_func_array(array(&$this, '_write_url_internal'), $_);
}
if (preg_match('[^external:]', $url)) {
return call_user_method_array('_write_url_external', $this, $_);
return call_user_func_array(array(&$this, '_write_url_external'), $_);
}
return call_user_method_array('_write_url_web', $this, $_);
return call_user_func_array(array(&$this, '_write_url_web'), $_);
}
###############################################################################
@@ -1582,7 +1601,7 @@ function _write_url_external() {
# Network drives are different. We will handle them separately
# MS/Novell network drives and shares start with \\
if (preg_match('[^external:\\\\]', $_[4])) {
return call_user_method_array('_write_url_external_net', $this, $_);
return call_user_func_array(array(&$this, '_write_url_external_net'), $_);
}
$record = 0x01B8; # Record identifier
@@ -2075,15 +2094,13 @@ function _store_selection($_) {
# Frozen panes are specified in terms of a integer number of rows and columns.
# Thawed panes are specified in terms of Excel's units for rows and columns.
#
function _store_panes() {
$_=func_get_args();
function _store_panes($_) {
$record = 0x0041; # Record identifier
$length = 0x000A; # Number of bytes to follow
$y = $_[0] || 0; # Vertical split position
$x = $_[1] || 0; # Horizontal split position
$y = $_[0] ? $_[0] : 0; # Vertical split position
$x = $_[1] ? $_[1] : 0; # Horizontal split position
if (isset($_[2])) {
$rwTop = $_[2]; # Top row visible
}
@@ -2371,8 +2388,8 @@ function merge_cells() {
$cref = 1; # Number of refs
$rwFirst = $_[0]; # First row in reference
$colFirst = $_[1]; # First col in reference
$rwLast = $_[2] || $rwFirst; # Last row in reference
$colLast = $_[3] || $colFirst; # Last col in reference
$rwLast = $_[2] ? $_[2] : $rwFirst; # Last row in reference
$colLast = $_[3] ? $_[3] : $colFirst; # Last col in reference
// Swap last row/col for first row/col as necessary
if ($rwFirst > $rwLast) {

View File

@@ -19,7 +19,8 @@ for ($col=0;$col<50;$col++) {
$workbook->close();
header("Content-Type: application/x-msexcel");
header("Content-Type: application/x-msexcel; name=\"example-bigfile.xls\"");
header("Content-Disposition: inline; filename=\"example-bigfile.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

View File

@@ -0,0 +1,115 @@
<?php
# Demonstrates Spreadsheet::WriteExcel's named colors and the Excel
# color palette.
#
# reverse('<27>'), March 2002, John McNamara, jmcnamara@cpan.org
# PHP port by Johann Hanne, 2005-11-01
set_time_limit(10);
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
$fname = tempnam("/tmp", "colors.xls");
$workbook = &new writeexcel_workbook($fname);
# Some common formats
$center =& $workbook->addformat(array('align' => 'center'));
$heading =& $workbook->addformat(array('align' => 'center', 'bold' => 1));
# Try this to see the default Excel 5 palette
# $workbook->set_palette_xl5();
######################################################################
#
# Demonstrate the named colors.
#
$colors = array(
'black'=>0x08,
'blue'=>0x0C,
'brown'=>0x10,
'cyan'=>0x0F,
'gray'=>0x17,
'green'=>0x11,
'lime'=>0x0B,
'magenta'=>0x0E,
'navy'=>0x12,
'orange'=>0x35,
'purple'=>0x14,
'red'=>0x0A,
'silver'=>0x16,
'white'=>0x09,
'yellow'=>0x0D
);
$worksheet1 =& $workbook->addworksheet('Named colors');
$worksheet1->set_column(0, 3, 15);
$worksheet1->write(0, 0, "Index", $heading);
$worksheet1->write(0, 1, "Index", $heading);
$worksheet1->write(0, 2, "Name", $heading);
$worksheet1->write(0, 3, "Color", $heading);
$i = 1;
foreach ($colors as $color=>$index) {
$format =& $workbook->addformat(array(
'fg_color' => $color,
'pattern' => 1,
'border' => 1
));
$worksheet1->write($i+1, 0, $index, $center);
$worksheet1->write($i+1, 1, sprintf("0x%02X", $index), $center);
$worksheet1->write($i+1, 2, $color, $center);
$worksheet1->write($i+1, 3, '', $format);
$i++;
}
######################################################################
#
# Demonstrate the standard Excel colors in the range 8..63.
#
$worksheet2 =& $workbook->addworksheet('Standard colors');
$worksheet2->set_column(0, 3, 15);
$worksheet2->write(0, 0, "Index", $heading);
$worksheet2->write(0, 1, "Index", $heading);
$worksheet2->write(0, 2, "Color", $heading);
$worksheet2->write(0, 3, "Name", $heading);
for ($i=8;$i<=63;$i++) {
$format =& $workbook->addformat(array(
'fg_color' => $i,
'pattern' => 1,
'border' => 1
));
$worksheet2->write(($i -7), 0, $i, $center);
$worksheet2->write(($i -7), 1, sprintf("0x%02X", $i), $center);
$worksheet2->write(($i -7), 2, '', $format);
# Add the color names
foreach ($colors as $color=>$index) {
if ($i==$index) {
$worksheet2->write(($i -7), 3, $color, $center);
}
}
}
$workbook->close();
header("Content-Type: application/x-msexcel; name=\"example-colors.xls\"");
header("Content-Disposition: inline; filename=\"example-colors.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);
?>

View File

@@ -61,11 +61,9 @@ $worksheet->write('B6', 37257, $num2_format);
#
# Formulae
#
/*
$worksheet->set_selection('B7');
$worksheet->write('A7', 'Formulas and functions, "=SIN(PI()/4)"');
$worksheet->write('B7', '=SIN(PI()/4)');
*/
#######################################################################
#
@@ -90,7 +88,8 @@ $worksheet->write('A18', "Multiple worksheets");
$workbook->close();
header("Content-Type: application/x-msexcel");
header("Content-Type: application/x-msexcel; name=\"example-demo.xls\"");
header("Content-Disposition: inline; filename=\"example-demo.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

View File

@@ -51,7 +51,8 @@ $worksheet->write_blank(2, 2, $border2);
$workbook->close();
header("Content-Type: application/x-msexcel");
header("Content-Type: application/x-msexcel; name=\"example-merge2.xls\"");
header("Content-Disposition: inline; filename=\"example-merge2.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

View File

@@ -0,0 +1,144 @@
<?php
# Example of using the WriteExcel module to create worksheet panes.
#
# reverse('<27>'), May 2001, John McNamara, jmcnamara@cpan.org
# PHP port by Johann Hanne, 2005-11-01
set_time_limit(10);
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
$fname = tempnam("/tmp", "panes.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet1 =& $workbook->addworksheet('Panes 1');
$worksheet2 =& $workbook->addworksheet('Panes 2');
$worksheet3 =& $workbook->addworksheet('Panes 3');
$worksheet4 =& $workbook->addworksheet('Panes 4');
# Frozen panes
$worksheet1->freeze_panes(1, 0); # 1 row
$worksheet2->freeze_panes(0, 1); # 1 column
$worksheet3->freeze_panes(1, 1); # 1 row and column
# Un-frozen panes. The divisions must be specified in terms of row and column
# dimensions. The default row height is 12.75 and the default column width
# is 8.43
#
$worksheet4->thaw_panes(12.75, 8.43, 1, 1); # 1 row and column
#######################################################################
#
# Set up some formatting and text to highlight the panes
#
$header =& $workbook->addformat();
$header->set_color('white');
$header->set_align('center');
$header->set_align('vcenter');
$header->set_pattern();
$header->set_fg_color('green');
$center =& $workbook->addformat();
$center->set_align('center');
#######################################################################
#
# Sheet 1
#
$worksheet1->set_column('A:I', 16);
$worksheet1->set_row(0, 20);
$worksheet1->set_selection('C3');
for ($i=0;$i<=8;$i++) {
$worksheet1->write(0, $i, 'Scroll down', $header);
}
for ($i=1;$i<=100;$i++) {
for ($j=0;$j<=8;$j++) {
$worksheet1->write($i, $j, $i+1, $center);
}
}
#######################################################################
#
# Sheet 2
#
$worksheet2->set_column('A:A', 16);
$worksheet2->set_selection('C3');
for ($i=0;$i<=49;$i++) {
$worksheet2->set_row($i, 15);
$worksheet2->write($i, 0, 'Scroll right', $header);
}
for ($i=0;$i<=49;$i++) {
for ($j=1;$j<=25;$j++) {
$worksheet2->write($i, $j, $j, $center);
}
}
#######################################################################
#
# Sheet 3
#
$worksheet3->set_column('A:Z', 16);
$worksheet3->set_selection('C3');
for ($i=1;$i<=25;$i++) {
$worksheet3->write(0, $i, 'Scroll down', $header);
}
for ($i=1;$i<=49;$i++) {
$worksheet3->write($i, 0, 'Scroll right', $header);
}
for ($i=1;$i<=49;$i++) {
for ($j=1;$j<=25;$j++) {
$worksheet3->write($i, $j, $j, $center);
}
}
#######################################################################
#
# Sheet 4
#
$worksheet4->set_selection('C3');
for ($i=1;$i<=25;$i++) {
$worksheet4->write(0, $i, 'Scroll', $center);
}
for ($i=1;$i<=49;$i++) {
$worksheet4->write($i, 0, 'Scroll', $center);
}
for ($i=1;$i<=49;$i++) {
for ($j=1;$j<=25;$j++) {
$worksheet4->write($i, $j, $j, $center);
}
}
$workbook->close();
header("Content-Type: application/x-msexcel; name=\"example-panes.xls\"");
header("Content-Disposition: inline; filename=\"example-panes.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);
?>

View File

@@ -0,0 +1,29 @@
<?php
set_time_limit(10);
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
$fname = tempnam("/tmp", "repeat.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet = &$workbook->addworksheet();
$worksheet->repeat_rows(0, 1);
$worksheet->write(0, 0, "Header line (will be repeated when printed)");
$worksheet->write(1, 0, "Header line number 2");
for ($i=1;$i<=100;$i++) {
$worksheet->write($i+1, 0, "Line $i");
}
$workbook->close();
header("Content-Type: application/x-msexcel; name=\"example-repeat.xls\"");
header("Content-Disposition: inline; filename=\"example-repeat.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);
?>

View File

@@ -5,7 +5,7 @@ set_time_limit(10);
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
$fname = tempnam("/tmp", "merge2.xls");
$fname = tempnam("/tmp", "simple.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet = &$workbook->addworksheet();
@@ -22,16 +22,17 @@ $worksheet->write(3, 0, 3.00000); # Writes 3
$worksheet->write(4, 0, 3.00001); # Writes 3.00001
$worksheet->write(5, 0, 3.14159); # TeX revision no.?
# Formulas are not yet supported
//$worksheet->write(7, 0, '=A3 + A6');
//$worksheet->write(8, 0, '=IF(A5>3,"Yes", "No")');
# Write two formulas
$worksheet->write(7, 0, '=A3 + A6');
$worksheet->write(8, 0, '=IF(A5>3,"Yes", "No")');
# Write a hyperlink
$worksheet->write(7, 0, 'http://www.php.net/');
$worksheet->write(10, 0, 'http://www.php.net/');
$workbook->close();
header("Content-Type: application/x-msexcel");
header("Content-Type: application/x-msexcel; name=\"example-simple.xls\"");
header("Content-Disposition: inline; filename=\"example-simple.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

View File

@@ -5,7 +5,7 @@ set_time_limit(10);
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
$fname = tempnam("/tmp", "merge2.xls");
$fname = tempnam("/tmp", "stocks.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet =& $workbook->addworksheet();
@@ -62,7 +62,8 @@ $worksheet->write(3, 3, 0, $f_change); # 0 in the font color (black)
$workbook->close();
header("Content-Type: application/x-msexcel");
header("Content-Type: application/x-msexcel; name=\"example-stocks.xls\"");
header("Content-Disposition: inline; filename=\"example-stocks.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

View File

@@ -3,7 +3,7 @@
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
$fname = tempnam("/tmp", "merge2.xls");
$fname = tempnam("/tmp", "textwrap.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet = &$workbook->addworksheet();
@@ -63,7 +63,8 @@ $worksheet->write(5, 3, $str2, $format2);
$workbook->close();
header("Content-Type: application/x-msexcel");
header("Content-Type: application/x-msexcel; name=\"example-textwrap.xls\"");
header("Content-Disposition: inline; filename=\"example-textwrap.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

View File

@@ -0,0 +1,120 @@
<?php
define(PpsType_Root, 5);
define(PpsType_Dir, 1);
define(PpsType_File, 2);
define(DataSizeSmall, 0x1000);
define(LongIntSize, 4);
define(PpsSize, 0x80);
function Asc2Ucs($sAsc) {
return implode("\x00", (preg_split('//', $sAsc, -1, PREG_SPLIT_NO_EMPTY)))."\x00";
}
function Ucs2Asc($sUcs) {
$chars=explode("\x00", $sUcs);
array_pop($chars);
return implode("", $chars);
}
function OLEDate2Local($sDateTime) {
/* TODO!!!
//my($iSec, $iMin, $iHour, $iDay, $iMon, $iYear);
//my($iDate);
//my($iDt, $iYDays);
#1.Divide Day and Time
my $iBigDt = Math::BigInt->new(0);
foreach my $sWk (reverse(split //, $sDateTime)) {
$iBigDt *= 0x100;
$iBigDt += ord($sWk);
}
my $iHSec = $iBigDt % 10000000;
$iBigDt /= 10000000;
my $iBigDay = int($iBigDt / (24*3600)) + 1;
my $iTime = int($iBigDt % (24*3600));
#2. Year->Day(1601/1/2?)
$iDt = $iBigDay;
$iYear = 1601;
$iYDays = _yearDays($iYear); #Not 365 (365 days is Only in Excel World)
while($iDt > $iYDays) {
$iDt -= $iYDays;
$iYear++;
$iYDays = _yearDays($iYear);
}
my $iMD;
for($iMon=1;$iMon < 12; $iMon++){
$iMD = _monthDays($iMon, $iYear);
last if($iDt <= $iMD);
$iDt -= $iMD;
}
$iDay = $iDt;
#3. Hour->iSec
$iHour = int($iTime / 3600);
$iMin = int(($iTime % 3600) / 60);
$iSec = $iTime % 60;
return ($iSec, $iMin, $iHour, $iDay, $iMon - 1, $iYear-1900, $iHSec);
*/
}
#------------------------------------------------------------------------------
# Localtime->OLE Date
#------------------------------------------------------------------------------
function LocalDate2OLE($raDate) {
/* TODO!!!
if (!$raDate) {
return str_repeat("\x00", 8);
}
list($iSec, $iMin, $iHour, $iDay, $iMon, $iYear, $iHSec) = $raDate;
$iSec ||=0; $iMin ||=0; $iHour ||=0;
$iDay ||=0; $iMon ||=0; $iYear ||=0; $iHSec ||=0;
//my($iDate);
//my($iDt, $iYDays);
#1. Year -> Days
$iDate = -1;
for ($iY=1601;$iY<($iYear+1900);$iY++){
$iDate += _yearDays($iY);
}
for ($iM=0;$iM < $iMon;$iM++){
$iDate += _monthDays($iM+1, ($iYear+1900));
}
$iDate += $iDay;
#2. Hours->Sec + HighReso
my $iBigDt = Math::BigInt->new(0);
$iBigDt += $iHour*3600 + $iMin*60+ $iSec;
$iBigDt += ($iDate*(24*3600));
$iBigDt *= 10000000;
$iBigDt += $iHSec if($iHSec);
#3. Make HEX string
//my $iHex;
$sRes = '';
for($i=0;$i<8;$i++) {
$iHex = $iBigDt % 0x100;
$sRes .= pack('c', $iHex);
$iBigDt /= 0x100;
}
return $sRes;
*/
}
function _leapYear($iYear) {
return ((($iYear % 4)==0) && (($iYear % 100) || ($iYear % 400)==0)) ? 1 : 0;
}
function _yearDays($iYear) {
return _leapYear($iYear) ? 366 : 365;
}
function _monthDays($iMon, $iYear) {
if ($iMon == 1 || $iMon == 3 || $iMon == 5 || $iMon == 7 ||
$iMon == 8 || $iMon == 10 || $iMon == 12) {
return 31;
} elseif ($iMon == 4 || $iMon == 6 || $iMon == 9 || $iMon == 11) {
return 30;
} elseif ($iMon == 2) {
return _leapYear($iYear) ? 29 : 28;
}
}
?>