74 $this->_BIG_BLOCK_SIZE = pow(2,
75 ((isset($this->_BIG_BLOCK_SIZE))? self::_adjust2($this->_BIG_BLOCK_SIZE) : 9));
76 $this->_SMALL_BLOCK_SIZE= pow(2,
77 ((isset($this->_SMALL_BLOCK_SIZE))? self::_adjust2($this->_SMALL_BLOCK_SIZE): 6));
82 if ($this->_tmp_dir === NULL)
84 $this->_tmp_filename = tempnam($this->_tmp_dir,
"OLE_PPS_Root");
85 $this->_FILEH_ = fopen($this->_tmp_filename,
"w+b");
86 if ($this->_FILEH_ ==
false) {
92 if ($this->_FILEH_ ==
false) {
99 list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->
_calcSize($aList);
111 $this->
_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt);
114 fclose($this->_FILEH_);
130 list($iSBDcnt, $iBBcnt, $iPPScnt) =
array(0,0,0);
133 $iCount = count($raList);
134 for ($i = 0; $i < $iCount; ++$i) {
136 $raList[$i]->Size = $raList[$i]->_DataLen();
138 $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE)
139 + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);
141 $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) +
142 (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));
146 $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE;
148 $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0);
149 $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) +
150 (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0));
151 $iCnt = count($raList);
153 $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0));
155 return array($iSBDcnt, $iBBcnt, $iPPScnt);
168 $iWk = log($i2)/log(2);
169 return ($iWk > floor($iWk))? floor($iWk)+1:$iWk;
182 $FILE = $this->_FILEH_;
189 $iAll = $iBBcnt + $iPPScnt + $iSBDcnt;
191 $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);
192 $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);
195 if ($iBdCnt > $i1stBdL) {
199 $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);
200 $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);
201 if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) {
209 "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" 223 . pack(
"V", $iBBcnt+$iSBDcnt)
226 . pack(
"V", $iSBDcnt ? 0 : -2)
227 . pack(
"V", $iSBDcnt)
230 if ($iBdCnt < $i1stBdL) {
236 fwrite($FILE, pack(
"V", $iAll+$iBdCnt) . pack(
"V", $iBdExL));
240 for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; ++$i) {
241 fwrite($FILE, pack(
"V", $iAll+$i));
245 for ($j = 0; $j < $jB; ++$j) {
246 fwrite($FILE, (pack(
"V", -1)));
260 $FILE = $this->_FILEH_;
263 $iCount = count($raList);
264 for ($i = 0; $i < $iCount; ++$i) {
266 $raList[$i]->Size = $raList[$i]->_DataLen();
279 fwrite($FILE, $raList[$i]->_data);
282 if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) {
283 fwrite($FILE, str_repeat(
"\x00", $this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)));
286 $raList[$i]->_StartBlock = $iStBlk;
288 (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) +
289 (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));
310 $FILE = $this->_FILEH_;
313 $iCount = count($raList);
314 for ($i = 0; $i < $iCount; ++$i) {
317 if ($raList[$i]->Size <= 0) {
321 $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE)
322 + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);
325 for ($j = 0; $j < $jB; ++$j) {
326 fwrite($FILE, pack(
"V", $j+$iSmBlk+1));
328 fwrite($FILE, pack(
"V", -2));
337 $sRes .= $raList[$i]->_data;
339 if ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) {
340 $sRes .= str_repeat(
"\x00",$this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE));
343 $raList[$i]->_StartBlock = $iSmBlk;
349 if ($iSmBlk % $iSbCnt) {
350 $iB = $iSbCnt - ($iSmBlk % $iSbCnt);
351 for ($i = 0; $i < $iB; ++$i) {
352 fwrite($FILE, pack(
"V", -1));
367 $iC = count($raList);
368 for ($i = 0; $i < $iC; ++$i) {
369 fwrite($this->_FILEH_, $raList[$i]->
_getPpsWk());
372 $iCnt = count($raList);
374 if ($iCnt % $iBCnt) {
387 public function _saveBbd($iSbdSize, $iBsize, $iPpsCnt)
389 $FILE = $this->_FILEH_;
395 $iAll = $iBsize + $iPpsCnt + $iSbdSize;
397 $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);
398 $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
400 if ($iBdCnt >$i1stBdL) {
404 $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);
405 $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
406 if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) {
415 for ($i = 0; $i < ($iSbdSize - 1); ++$i) {
416 fwrite($FILE, pack(
"V", $i+1));
418 fwrite($FILE, pack(
"V", -2));
421 for ($i = 0; $i < ($iBsize - 1); ++$i) {
422 fwrite($FILE, pack(
"V", $i+$iSbdSize+1));
424 fwrite($FILE, pack(
"V", -2));
427 for ($i = 0; $i < ($iPpsCnt - 1); ++$i) {
428 fwrite($FILE, pack(
"V", $i+$iSbdSize+$iBsize+1));
430 fwrite($FILE, pack(
"V", -2));
432 for ($i = 0; $i < $iBdCnt; ++$i) {
433 fwrite($FILE, pack(
"V", 0xFFFFFFFD));
436 for ($i = 0; $i < $iBdExL; ++$i) {
437 fwrite($FILE, pack(
"V", 0xFFFFFFFC));
440 if (($iAllW + $iBdCnt) % $iBbCnt) {
441 $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt));
442 for ($i = 0; $i < $iBlock; ++$i) {
443 fwrite($FILE, pack(
"V", -1));
447 if ($iBdCnt > $i1stBdL) {
450 for ($i = $i1stBdL;$i < $iBdCnt; $i++, ++$iN) {
451 if ($iN >= ($iBbCnt - 1)) {
454 fwrite($FILE, pack(
"V", $iAll+$iBdCnt+$iNb));
456 fwrite($FILE, pack(
"V", $iBsize+$iSbdSize+$iPpsCnt+$i));
458 if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) {
459 $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1));
460 for ($i = 0; $i < $iB; ++$i) {
461 fwrite($FILE, pack(
"V", -1));
464 fwrite($FILE, pack(
"V", -2));
static Asc2Ucs($ascii)
Utility function to transform ASCII text to Unicode.
_saveBigData($iStBlk, &$raList)
Saving big data (PPS's with data bigger than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) ...
_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt)
Save OLE header.
__construct($time_1st, $time_2nd, $raChild)
_getPpsWk()
Returns a string with the PPS's WK (What is a WK?)
_savePps(&$raList)
Saves all the PPS's WKs.
_calcSize(&$raList)
Calculate some numbers.
save($filename)
Method for saving the whole OLE container (including files).
static sys_get_temp_dir()
Get the systems temporary directory.
const OLE_DATA_SIZE_SMALL
_makeSmallData(&$raList)
get small data (PPS's with data smaller than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) ...
Create styles array
The data for the language used.
static _adjust2($i2)
Helper function for caculating a magic value for block sizes.
static _savePpsSetPnt(&$raList, $to_save, $depth=0)
Updates index and pointers to previous, next and children PPS's for this PPS.
_saveBbd($iSbdSize, $iBsize, $iPpsCnt)
Saving Big Block Depot.