35 require_once
'Spreadsheet/Excel/Writer/Format.php';
36 require_once
'Spreadsheet/Excel/Writer/BIFFwriter.php';
37 require_once
'Spreadsheet/Excel/Writer/Worksheet.php';
38 require_once
'Spreadsheet/Excel/Writer/Parser.php';
39 require_once
'OLE/PPS/Root.php';
40 require_once
'OLE/PPS/File.php';
182 $this->_activesheet = 0;
183 $this->_firstsheet = 0;
184 $this->_selected = 0;
185 $this->_xf_index = 16;
186 $this->_fileclosed = 0;
187 $this->_biffsize = 0;
188 $this->_sheetname =
'Sheet';
190 $this->_worksheets = array();
191 $this->_sheetnames = array();
192 $this->_formats = array();
193 $this->_palette = array();
194 $this->_codepage = 0x04E4;
195 $this->_country_code = -1;
196 $this->_string_sizeinfo = 3;
199 $this->_url_format =& $this->
addFormat(array(
'color' =>
'blue',
'underline' => 1));
200 $this->_str_total = 0;
201 $this->_str_unique = 0;
202 $this->_str_table = array();
215 if ($this->_fileclosed) {
222 $this->_fileclosed = 1;
266 $this->_BIFF_version = $version;
268 $this->_limit = 8228;
269 $this->_tmp_format->_BIFF_version = $version;
270 $this->_url_format->_BIFF_version = $version;
271 $this->_parser->_BIFF_version = $version;
272 $this->_codepage = 0x04B0;
274 $total_worksheets = count($this->_worksheets);
276 for ($i = 0; $i < $total_worksheets; $i++) {
277 $this->_worksheets[$i]->_BIFF_version = $version;
280 $total_formats = count($this->_formats);
282 for ($i = 0; $i < $total_formats; $i++) {
283 $this->_formats[$i]->_BIFF_version = $version;
297 $this->_country_code = $code;
312 $index = count($this->_worksheets);
316 $name = $sheetname.($index+1);
320 if ($this->_BIFF_version != 0x0600)
322 if (strlen($name) > 31) {
323 return $this->
raiseError(
"Sheetname $name must be <= 31 chars");
328 $total_worksheets = count($this->_worksheets);
329 for ($i = 0; $i < $total_worksheets; $i++) {
330 if ($this->_worksheets[$i]->getName() == $name) {
331 return $this->
raiseError(
"Worksheet '$name' already exists");
337 $this->_activesheet, $this->_firstsheet,
338 $this->_str_total, $this->_str_unique,
339 $this->_str_table, $this->_url_format,
340 $this->_parser, $this->_tmp_dir);
342 $this->_worksheets[$index] = &$worksheet;
343 $this->_sheetnames[$index] = $name;
344 $this->_parser->setExtSheet($name, $index);
359 $this->_xf_index += 1;
360 $this->_formats[] = &$format;
372 include_once
'Spreadsheet/Excel/Writer/Validator.php';
396 if ($index < 8 or $index > 64) {
398 return $this->
raiseError(
"Color index $index outside range: 8 <= index <= 64");
402 if (($red < 0 or $red > 255) ||
403 ($green < 0 or $green > 255) ||
404 ($blue < 0 or $blue > 255))
406 return $this->
raiseError(
"Color component outside range: 0 <= color <= 255");
412 $this->_palette[$index] = array($red, $green, $blue, 0);
423 $this->_palette = array(
424 array(0x00, 0x00, 0x00, 0x00),
425 array(0xff, 0xff, 0xff, 0x00),
426 array(0xff, 0x00, 0x00, 0x00),
427 array(0x00, 0xff, 0x00, 0x00),
428 array(0x00, 0x00, 0xff, 0x00),
429 array(0xff, 0xff, 0x00, 0x00),
430 array(0xff, 0x00, 0xff, 0x00),
431 array(0x00, 0xff, 0xff, 0x00),
432 array(0x80, 0x00, 0x00, 0x00),
433 array(0x00, 0x80, 0x00, 0x00),
434 array(0x00, 0x00, 0x80, 0x00),
435 array(0x80, 0x80, 0x00, 0x00),
436 array(0x80, 0x00, 0x80, 0x00),
437 array(0x00, 0x80, 0x80, 0x00),
438 array(0xc0, 0xc0, 0xc0, 0x00),
439 array(0x80, 0x80, 0x80, 0x00),
440 array(0x99, 0x99, 0xff, 0x00),
441 array(0x99, 0x33, 0x66, 0x00),
442 array(0xff, 0xff, 0xcc, 0x00),
443 array(0xcc, 0xff, 0xff, 0x00),
444 array(0x66, 0x00, 0x66, 0x00),
445 array(0xff, 0x80, 0x80, 0x00),
446 array(0x00, 0x66, 0xcc, 0x00),
447 array(0xcc, 0xcc, 0xff, 0x00),
448 array(0x00, 0x00, 0x80, 0x00),
449 array(0xff, 0x00, 0xff, 0x00),
450 array(0xff, 0xff, 0x00, 0x00),
451 array(0x00, 0xff, 0xff, 0x00),
452 array(0x80, 0x00, 0x80, 0x00),
453 array(0x80, 0x00, 0x00, 0x00),
454 array(0x00, 0x80, 0x80, 0x00),
455 array(0x00, 0x00, 0xff, 0x00),
456 array(0x00, 0xcc, 0xff, 0x00),
457 array(0xcc, 0xff, 0xff, 0x00),
458 array(0xcc, 0xff, 0xcc, 0x00),
459 array(0xff, 0xff, 0x99, 0x00),
460 array(0x99, 0xcc, 0xff, 0x00),
461 array(0xff, 0x99, 0xcc, 0x00),
462 array(0xcc, 0x99, 0xff, 0x00),
463 array(0xff, 0xcc, 0x99, 0x00),
464 array(0x33, 0x66, 0xff, 0x00),
465 array(0x33, 0xcc, 0xcc, 0x00),
466 array(0x99, 0xcc, 0x00, 0x00),
467 array(0xff, 0xcc, 0x00, 0x00),
468 array(0xff, 0x99, 0x00, 0x00),
469 array(0xff, 0x66, 0x00, 0x00),
470 array(0x66, 0x66, 0x99, 0x00),
471 array(0x96, 0x96, 0x96, 0x00),
472 array(0x00, 0x33, 0x66, 0x00),
473 array(0x33, 0x99, 0x66, 0x00),
474 array(0x00, 0x33, 0x00, 0x00),
475 array(0x33, 0x33, 0x00, 0x00),
476 array(0x99, 0x33, 0x00, 0x00),
477 array(0x99, 0x33, 0x66, 0x00),
478 array(0x33, 0x33, 0x99, 0x00),
479 array(0x33, 0x33, 0x33, 0x00),
492 if (count($this->_worksheets) == 0) {
497 if ($this->_activesheet == 0) {
498 $this->_worksheets[0]->selected = 1;
503 $total_worksheets = count($this->_worksheets);
504 for ($i = 0; $i < $total_worksheets; $i++) {
505 if ($this->_worksheets[$i]->selected) {
508 $this->_worksheets[$i]->close($this->_sheetnames);
514 if ($this->_BIFF_version == 0x0600) {
517 if ($this->_BIFF_version == 0x0500) {
521 if ($this->_BIFF_version == 0x0500) {
533 for ($i = 0; $i < $total_worksheets; $i++) {
534 $this->
_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset);
537 if ($this->_country_code != -1) {
541 if ($this->_BIFF_version == 0x0600) {
568 if($this->_BIFF_version == 0x0600) {
573 if ($this->_tmp_dir !=
'') {
574 $OLE->setTempDir($this->_tmp_dir);
580 $OLE->append($this->_data);
582 $total_worksheets = count($this->_worksheets);
583 for ($i = 0; $i < $total_worksheets; $i++) {
584 while ($tmp = $this->_worksheets[$i]->getData()) {
590 if ($this->_tmp_dir !=
'') {
591 $root->setTempDir($this->_tmp_dir);
594 $res = $root->save($this->_filename);
608 if ($this->_BIFF_version == 0x0600) {
609 $boundsheet_length = 12;
611 $boundsheet_length = 11;
616 if ($this->_BIFF_version == 0x0600) {
620 if ($this->_country_code != -1) {
626 $total_worksheets = count($this->_worksheets);
628 for ($i = 0; $i < $total_worksheets; $i++) {
629 $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name);
633 for ($i = 0; $i < $total_worksheets; $i++) {
634 $this->_worksheets[$i]->offset = $offset;
635 $offset += $this->_worksheets[$i]->_datasize;
637 $this->_biffsize = $offset;
649 $font = $format->getFont();
654 for ($i = 1; $i <= 5; $i++){
664 $key = $format->getFontKey();
667 $total_formats = count($this->_formats);
668 for ($i = 0; $i < $total_formats; $i++) {
669 $key = $this->_formats[$i]->getFontKey();
670 if (isset($fonts[$key])) {
672 $this->_formats[$i]->font_index = $fonts[$key];
675 $fonts[$key] = $index;
676 $this->_formats[$i]->font_index = $index;
678 $font = $this->_formats[$i]->getFont();
692 $hash_num_formats = array();
693 $num_formats = array();
698 $total_formats = count($this->_formats);
699 for ($i = 0; $i < $total_formats; $i++) {
700 $num_format = $this->_formats[$i]->_num_format;
706 if (!preg_match(
"/^0+\d/", $num_format)) {
707 if (preg_match(
"/^\d+$/", $num_format)) {
712 if (isset($hash_num_formats[$num_format])) {
714 $this->_formats[$i]->_num_format = $hash_num_formats[$num_format];
717 $hash_num_formats[$num_format] = $index;
718 $this->_formats[$i]->_num_format = $index;
719 array_push($num_formats,$num_format);
726 foreach ($num_formats as $num_format) {
743 for ($i = 0; $i <= 14; $i++) {
744 $xf = $format->getXf(
'style');
748 $xf = $format->getXf(
'cell');
752 $total_formats = count($this->_formats);
753 for ($i = 0; $i < $total_formats; $i++) {
754 $xf = $this->_formats[$i]->getXf(
'cell');
781 foreach ($this->_sheetnames as $sheetname) {
794 $total_worksheets = count($this->_worksheets);
795 for ($i = 0; $i < $total_worksheets; $i++) {
797 if (isset($this->_worksheets[$i]->print_rowmin)) {
799 $this->_worksheets[$i]->index,
801 $this->_worksheets[$i]->print_rowmin,
802 $this->_worksheets[$i]->print_rowmax,
803 $this->_worksheets[$i]->print_colmin,
804 $this->_worksheets[$i]->print_colmax
810 $total_worksheets = count($this->_worksheets);
811 for ($i = 0; $i < $total_worksheets; $i++) {
812 $rowmin = $this->_worksheets[$i]->title_rowmin;
813 $rowmax = $this->_worksheets[$i]->title_rowmax;
814 $colmin = $this->_worksheets[$i]->title_colmin;
815 $colmax = $this->_worksheets[$i]->title_colmax;
820 if (isset($rowmin) && isset($colmin)) {
824 $this->_worksheets[$i]->index,
831 } elseif (isset($rowmin)) {
834 $this->_worksheets[$i]->index,
841 } elseif (isset($colmin)) {
844 $this->_worksheets[$i]->index,
877 $header = pack(
'vv', $record, $length);
878 $data = pack(
'v', $cv);
880 $this->
_append($header . $data);
905 $header = pack(
"vv", $record, $length);
906 $data = pack(
"vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn,
908 $itabCur, $itabFirst,
909 $ctabsel, $wTabRatio);
910 $this->
_append($header . $data);
924 if ($this->_BIFF_version == 0x0600) {
925 $length = 0x08 + strlen($sheetname);
927 $length = 0x07 + strlen($sheetname);
931 $cch = strlen($sheetname);
933 $header = pack(
"vv", $record, $length);
934 if ($this->_BIFF_version == 0x0600) {
935 $data = pack(
"Vvv", $offset, $grbit, $cch);
937 $data = pack(
"VvC", $offset, $grbit, $cch);
939 $this->
_append($header.$data.$sheetname);
952 $header = pack(
"vv", $record, $length);
953 $data = pack(
"vv", count($this->_worksheets), 0x0104);
954 $this->
_append($header . $data);
966 $total_references = count($this->_parser->_references);
968 $length = 2 + 6 * $total_references;
971 $header = pack(
"vv", $record, $length);
972 $data = pack(
'v', $total_references);
973 for ($i = 0; $i < $total_references; $i++) {
974 $data .= $this->_parser->_references[$i];
976 $this->
_append($header . $data);
993 $header = pack(
"vv", $record, $length);
994 $data = pack(
"vCC", $ixfe, $BuiltIn, $iLevel);
995 $this->
_append($header . $data);
1010 if ($this->_BIFF_version == 0x0600) {
1011 $length = 5 + strlen($format);
1013 } elseif ($this->_BIFF_version == 0x0500) {
1014 $length = 3 + strlen($format);
1017 $cch = strlen($format);
1019 $header = pack(
"vv", $record, $length);
1020 if ($this->_BIFF_version == 0x0600) {
1021 $data = pack(
"vvC", $ifmt, $cch, $encoding);
1022 } elseif ($this->_BIFF_version == 0x0500) {
1023 $data = pack(
"vC", $ifmt, $cch);
1025 $this->
_append($header . $data . $format);
1040 $header = pack(
"vv", $record, $length);
1041 $data = pack(
"v", $f1904);
1042 $this->
_append($header . $data);
1064 $header = pack(
"vv", $record, $length);
1065 $data = pack(
"v", $cxals);
1066 $this->
_append($header . $data);
1083 $length = 0x02 + strlen($sheetname);
1085 $cch = strlen($sheetname);
1088 $header = pack(
"vv", $record, $length);
1089 $data = pack(
"CC", $cch, $rgch);
1090 $this->
_append($header . $data . $sheetname);
1115 $ixals = $index + 1;
1117 $cchCustMenu = 0x00;
1118 $cchDescription = 0x00;
1119 $cchHelptopic = 0x00;
1120 $cchStatustext = 0x00;
1124 $unknown04 = 0xffff-$index;
1125 $unknown05 = 0x0000;
1126 $unknown06 = 0x0000;
1127 $unknown07 = 0x1087;
1128 $unknown08 = 0x8005;
1130 $header = pack(
"vv", $record, $length);
1131 $data = pack(
"v", $grbit);
1132 $data .= pack(
"C", $chKey);
1133 $data .= pack(
"C", $cch);
1134 $data .= pack(
"v", $cce);
1135 $data .= pack(
"v", $ixals);
1136 $data .= pack(
"v", $itab);
1137 $data .= pack(
"C", $cchCustMenu);
1138 $data .= pack(
"C", $cchDescription);
1139 $data .= pack(
"C", $cchHelptopic);
1140 $data .= pack(
"C", $cchStatustext);
1141 $data .= pack(
"C", $rgch);
1142 $data .= pack(
"C", $unknown03);
1143 $data .= pack(
"v", $unknown04);
1144 $data .= pack(
"v", $unknown05);
1145 $data .= pack(
"v", $unknown06);
1146 $data .= pack(
"v", $unknown07);
1147 $data .= pack(
"v", $unknown08);
1148 $data .= pack(
"v", $index);
1149 $data .= pack(
"v", $index);
1150 $data .= pack(
"v", $rowmin);
1151 $data .= pack(
"v", $rowmax);
1152 $data .= pack(
"C", $colmin);
1153 $data .= pack(
"C", $colmax);
1154 $this->
_append($header . $data);
1180 $ixals = $index + 1;
1182 $cchCustMenu = 0x00;
1183 $cchDescription = 0x00;
1184 $cchHelptopic = 0x00;
1185 $cchStatustext = 0x00;
1189 $unknown02 = 0x002b;
1191 $unknown04 = 0xffff-$index;
1192 $unknown05 = 0x0000;
1193 $unknown06 = 0x0000;
1194 $unknown07 = 0x1087;
1195 $unknown08 = 0x8008;
1197 $header = pack(
"vv", $record, $length);
1198 $data = pack(
"v", $grbit);
1199 $data .= pack(
"C", $chKey);
1200 $data .= pack(
"C", $cch);
1201 $data .= pack(
"v", $cce);
1202 $data .= pack(
"v", $ixals);
1203 $data .= pack(
"v", $itab);
1204 $data .= pack(
"C", $cchCustMenu);
1205 $data .= pack(
"C", $cchDescription);
1206 $data .= pack(
"C", $cchHelptopic);
1207 $data .= pack(
"C", $cchStatustext);
1208 $data .= pack(
"C", $rgch);
1209 $data .= pack(
"C", $unknown01);
1210 $data .= pack(
"v", $unknown02);
1212 $data .= pack(
"C", $unknown03);
1213 $data .= pack(
"v", $unknown04);
1214 $data .= pack(
"v", $unknown05);
1215 $data .= pack(
"v", $unknown06);
1216 $data .= pack(
"v", $unknown07);
1217 $data .= pack(
"v", $unknown08);
1218 $data .= pack(
"v", $index);
1219 $data .= pack(
"v", $index);
1220 $data .= pack(
"v", 0x0000);
1221 $data .= pack(
"v", 0x3fff);
1222 $data .= pack(
"C", $colmin);
1223 $data .= pack(
"C", $colmax);
1225 $data .= pack(
"C", $unknown03);
1226 $data .= pack(
"v", $unknown04);
1227 $data .= pack(
"v", $unknown05);
1228 $data .= pack(
"v", $unknown06);
1229 $data .= pack(
"v", $unknown07);
1230 $data .= pack(
"v", $unknown08);
1231 $data .= pack(
"v", $index);
1232 $data .= pack(
"v", $index);
1233 $data .= pack(
"v", $rowmin);
1234 $data .= pack(
"v", $rowmax);
1235 $data .= pack(
"C", 0x00);
1236 $data .= pack(
"C", 0xff);
1238 $data .= pack(
"C", 0x10);
1239 $this->
_append($header . $data);
1252 $header = pack(
'vv', $record, $length);
1254 $data = pack(
'vv', $this->_country_code, $this->_country_code);
1255 $this->
_append($header . $data);
1268 $length = 2 + 4 * count($aref);
1269 $ccv = count($aref);
1273 foreach ($aref as $color) {
1274 foreach ($color as $byte) {
1275 $data .= pack(
"C",$byte);
1279 $header = pack(
"vvv", $record, $length, $ccv);
1280 $this->
_append($header . $data);
1302 $continue_limit = 8208;
1305 $this->_block_sizes = array();
1308 foreach (array_keys($this->_str_table) as $string) {
1309 $string_length = strlen($string);
1310 $headerinfo = unpack(
"vlength/Cencoding", $string);
1311 $encoding = $headerinfo[
"encoding"];
1316 $block_length += $string_length;
1319 if ($block_length < $continue_limit) {
1320 $written += $string_length;
1327 while ($block_length >= $continue_limit) {
1332 $space_remaining = $continue_limit - $written - $continue;
1342 if ($encoding == 1) {
1346 if ($space_remaining > $header_length) {
1348 if (!$split_string && $space_remaining % 2 != 1) {
1353 else if ($split_string && $space_remaining % 2 == 1) {
1363 if ($space_remaining > $header_length) {
1365 $written += $space_remaining;
1368 $block_length -= $continue_limit - $continue - $align;
1371 $this->_block_sizes[] = $continue_limit - $align;
1376 if ($block_length > 0) {
1383 $this->_block_sizes[] = $written + $continue;
1386 $block_length -= $continue_limit - $space_remaining - $continue;
1394 if ($block_length < $continue_limit) {
1395 $written = $block_length;
1403 if ($written + $continue) {
1404 $this->_block_sizes[] = $written + $continue;
1414 $tmp_block_sizes = array();
1415 $tmp_block_sizes = $this->_block_sizes;
1418 if (!empty($tmp_block_sizes)) {
1419 $length += array_shift($tmp_block_sizes);
1421 while (!empty($tmp_block_sizes)) {
1422 $length += 4 + array_shift($tmp_block_sizes);
1446 $continue_limit = 8208;
1452 $tmp_block_sizes = $this->_block_sizes;
1458 if (!empty($tmp_block_sizes)) {
1459 $length = 8 + array_shift($tmp_block_sizes);
1469 $header = pack(
"vv", $record, $length);
1470 $data = pack(
"VV", $this->_str_total, $this->_str_unique);
1471 $this->
_append($header . $data);
1477 foreach (array_keys($this->_str_table) as $string) {
1479 $string_length = strlen($string);
1480 $headerinfo = unpack(
"vlength/Cencoding", $string);
1481 $encoding = $headerinfo[
"encoding"];
1487 $block_length += $string_length;
1491 if ($block_length < $continue_limit) {
1493 $written += $string_length;
1501 while ($block_length >= $continue_limit) {
1507 $space_remaining = $continue_limit - $written - $continue;
1516 if ($encoding == 1) {
1520 if ($space_remaining > $header_length) {
1522 if (!$split_string && $space_remaining % 2 != 1) {
1527 else if ($split_string && $space_remaining % 2 == 1) {
1537 if ($space_remaining > $header_length) {
1539 $tmp = substr($string, 0, $space_remaining);
1543 $string = substr($string, $space_remaining);
1546 $block_length -= $continue_limit - $continue - $align;
1552 if ($block_length > 0) {
1559 $block_length -= $continue_limit - $space_remaining - $continue;
1564 if (!empty($this->_block_sizes)) {
1566 $length = array_shift($tmp_block_sizes);
1568 $header = pack(
'vv', $record, $length);
1570 $header .= pack(
'C', $encoding);
1579 if ($block_length < $continue_limit) {
1581 $written = $block_length;