xls_export/vendor/biff.php

322 lines
12 KiB
PHP

<?php
define ("XLSDATA_BYTE", 1,true);
define ("XLSDATA_SHORT", 2,true);
define ("XLSDATA_LONG", 3,true);
define ("XLSDATA_FLOAT", 4,true);
define ("XLSDATA_STRING", 5,true);
define ("XLSDATA_LSTRING", 6,true);
define ("XLSDATA_STRING1", 7,true);
define ("XLSDATA_DATA32BIT",8,true);
define ("XLS_BIFF5",0x0809);
define ("XLS_BIFF_EOF",0x000a);
define ("WORKBOOK_SHEET",0x0010);
define ("BIFF_WORKBOOKGLOBALS",0x0005);
define ("BIFF_CALCCOUNT",0x000c);
define ("BIFF_CALCMODE",0x000d);
define ("BIFF_PRECISION",0x000e);
define ("BIFF_REFMODE",0x000f);
define ("BIFF_DELTA",0x0010);
define ("BIFF_ITERATION",0x0011);
define ("BIFF_PROTECT",0x0012);
define ("BIFF_PASSWORD",0x0013);
define ("BIFF_PAGEHEADER",0x0014);
define ("BIFF_PAGEFOOTER",0x0015);
define ("BIFF_EXTERNALREFERENCESCOUNT",0x0016);
define ("BIFF_EXTERNSHEET",0x0017);
define ("BIFF_DEFINEDNAME",0x0018);
define ("BIFF_WINDOWPROTECT",0x0019);
define ("BIFF_SELECTION",0x001d);
define ("BIFF_DATEMODE",0x0022);
define ("BIFF_LEFTMARGIN",0x0026);
define ("BIFF_RIGHTMARGIN",0x0027);
define ("BIFF_TOPMARGIN",0x0028);
define ("BIFF_BOTTOMMARGIN",0x0029);
define ("BIFF_PRINTHEADERS",0x002a);
define ("BIFF_PRINTGRIDLINES",0x002b);
define ("BIFF_FONT",0x0031);
define ("BIFF_CONTINUE",0x003c);
define ("BIFF_WINDOW1",0x003d);
define ("BIFF_BACKUP",0x0040);
define ("BIFF_DEFCOLWIDTH",0x0055);
define ("BIFF_WRITEACCESS",0x005c);
define ("BIFF_OBJECT",0x005d);
define ("BIFF_SAVERECALC",0x005f);
define ("BIFF_COLINFO",0x007d);
define ("BIFF_IMAGEDATA",0x007f);
define ("BIFF_GUTS",0x0080);
define ("BIFF_SHEETPR",0x0081);
define ("BIFF_GRIDSET",0x0082);
define ("BIFF_HCENTER",0x0083);
define ("BIFF_VCENTER",0x0084);
define ("BIFF_BOUNDSHEET",0x0085);
define ("BIFF_COUNTRY",0x008c);
define ("BIFF_OBJECTDISPLAYOPTIONS",0x008d);
define ("BIFF_PALETTE",0x0092);
define ("BIFF_FUNCTIONGROUPCOUNT",0x009c);
define ("BIFF_PAGESETUP",0x00a1);
define ("BIFF_TOOLBARHEADER",0x00bf); // undocumented
define ("BIFF_TOOLBAREND",0x00c0); // undocumented
define ("BIFF_MENURECORDGROUP",0x00c1);
define ("BIFF_DBCELL",0x00d7);
define ("BIFF_BOOKBOOL",0x00da);
define ("BIFF_XFRECORD",0x00e0);
define ("BIFF_INTERFACEHEADER",0x00e1);
define ("BIFF_INTERFACEEND",0x00e2);
define ("BIFF_MERGEDCELLS",0x00e5);
/*
016FH = 367 = ASCII
01B5H = 437 = IBM PC CP-437 (US)
02D0H = 720 = IBM PC CP-720 (OEM Arabic)
02E1H = 737 = IBM PC CP-737 (Greek)
0307H = 775 = IBM PC CP-775 (Baltic)
0352H = 850 = IBM PC CP-850 (Latin I)
0354H = 852 = IBM PC CP-852 (Latin II (Central European))
0357H = 855 = IBM PC CP-855 (Cyrillic)
0359H = 857 = IBM PC CP-857 (Turkish)
035AH = 858 = IBM PC CP-858 (Multilingual Latin I with Euro)
035CH = 860 = IBM PC CP-860 (Portuguese)
035DH = 861 = IBM PC CP-861 (Icelandic)
035EH = 862 = IBM PC CP-862 (Hebrew)
035FH = 863 = IBM PC CP-863 (Canadian (French))
0360H = 864 = IBM PC CP-864 (Arabic)
0361H = 865 = IBM PC CP-865 (Nordic)
0362H = 866 = IBM PC CP-866 (Cyrillic (Russian))
0365H = 869 = IBM PC CP-869 (Greek (Modern))
036AH = 874 = Windows CP-874 (Thai)
03A4H = 932 = Windows CP-932 (Japanese Shift-JIS)
03A8H = 936 = Windows CP-936 (Chinese Simplified GBK)
03B5H = 949 = Windows CP-949 (Korean (Wansung))
03B6H = 950 = Windows CP-950 (Chinese Traditional BIG5)
04B0H = 1200 = UTF-16 (BIFF8)
04E2H = 1250 = Windows CP-1250 (Latin II) (Central European)
04E3H = 1251 = Windows CP-1251 (Cyrillic)
04E4H = 1252 = Windows CP-1252 (Latin I) (BIFF4-BIFF5)
04E5H = 1253 = Windows CP-1253 (Greek)
04E6H = 1254 = Windows CP-1254 (Turkish)
04E7H = 1255 = Windows CP-1255 (Hebrew)
04E8H = 1256 = Windows CP-1256 (Arabic)
04E9H = 1257 = Windows CP-1257 (Baltic)
04EAH = 1258 = Windows CP-1258 (Vietnamese)
0551H = 1361 = Windows CP-1361 (Korean (Johab))
2710H = 10000 = Apple Roman
8000H = 32768 = Apple Roman
8001H = 32769 = Windows CP-1252 (Latin I) (BIFF2-BIFF3)
*/
define ("BIFF_CODEPAGE",0x0042);
define ("BIFF_REFRESHALL",0x01b7);
define ("BIFF_DIMENSIONS",0x0200);
define ("BIFF_NUMBER",0x0203);
define ("BIFF_LABEL",0x0204);
define ("BIFF_ROW",0x0208);
define ("BIFF_INDEX",0x020b);
define ("BIFF_DEFAULTROWHEIGHT",0x0225);
define ("BIFF_WINDOW2",0x023e);
define ("BIFF_STYLEINFORMATION",0x0293);
define ("BIFF_FORMAT",0x041e);
define ("BIFF_SHEETPROTECTION",0x0867);
class xls_bof {
var $data = null;
var $size = 0;
var $type = null;
public function __construct($aboftype=-1) {
if ($aboftype==-1) { die("Error"); }
$this->data = array();
$this->type = $aboftype;
}
public function append($adatatype, $adatarec) {
$new = array();
$new["type"] = $adatatype;
$new["data"] = $adatarec;
$this->data[] = $new;
}
public function clear($aboftype=-1) {
if ($aboftype==-1) { die("Error"); }
$this->type = $aboftype;
$this->data = array();
return true;
}
public function fetch() {
$output = "";
foreach ($this->data as $key => $datarec) {
switch ($datarec["type"]) {
case XLSDATA_BYTE : $output .= pack("C",$datarec["data"]);
$this->size+=1;
break;
case XLSDATA_SHORT: $output .= pack("v",$datarec["data"]);
$this->size+=2;
break;
case XLSDATA_LONG : $output .= pack("V",$datarec["data"]);
$this->size+=4;
break;
case XLSDATA_FLOAT: $output .= pack("d",$datarec["data"]);
$this->size+=8;
break;
case XLSDATA_DATA32BIT :
$ldata = $datarec["data"];
$b3 = $ldata & 0xff;
$b2 = ($ldata >> 8) & 0xff;
$b1 = ($ldata >> 16) & 0xff;
$b0 = ($ldata >> 24) & 0xff;
$output .= pack("CCCC",$b0,$b1,$b2,$b3);
$this->size+=4;
break;
case XLSDATA_STRING:
$output .= pack("C",strlen($datarec["data"]));
$this->size++;
if (strlen($datarec["data"])==0) {
$output .= pack("C",0x00);
$this->size++;
break;
}
case XLSDATA_STRING1:
$this->size+=strlen($datarec["data"]);
//$output .= pack("C",$datarec["data"]);
$output .= $datarec["data"];
break;
case XLSDATA_LSTRING:
$output .= pack("v",strlen($datarec["data"]));
$this->size++;
$this->size++;
$this->size+=strlen($datarec["data"]);
//$output .= pack("C",$datarec["data"]);
$output .= $datarec["data"];
break;
}
}
return pack("vv",$this->bof,$this->size).$output;
}
public function save($afilehd) {
$this->bof = $this->type;
$this->size = 0;
$tmp = $this->fetch();
if ($this->size<2080) {
fwrite($afilehd,$tmp);
}
else {
if (defined("BIFFDEBUG")) {
echo "long record - size : ".$this->size."<br>";
}
$wcount = $this->size;
$tmptype = $this->type;
$tmp = substr($tmp,4);
$tmparr = str_split($tmp,2076);
if (defined("BIFFDEBUG")) {
echo "create parts : ".count($tmparr)."<br>";
}
$tmpout = "";
foreach ($tmparr as $key => $datapart) {
if (defined("BIFFDEBUG")) {
echo "part ($key) size : ".strlen($datapart)."<br>";
}
$tmpout = pack("vv",$tmptype,strlen($datapart)).$datapart;
fwrite($afilehd,$tmpout);
$tmptype = BIFF_CONTINUE;
}
unset($tmparr);
}
return true;
}
public function workbookxfrecords($afilehd) {
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0x00,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0002,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0002,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0xfff5,0xf4,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0x0001,0x00,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x002b,0xfff5,0xf8,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x0029,0xfff5,0xf8,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x002c,0xfff5,0xf8,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x002a,0xfff5,0xf8,0x000020c0);
$this->workbookonexfdata($afilehd,0x0001,0x0009,0xfff5,0xf8,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0x0001,0x10,0x000020c0);
$this->workbookonexfdata($afilehd,0x0000,0x0000,0x0001,0x50,0x00000488);
}
public function workbookonexfdata($afilehd, $fontindex, $formatindex, $xftype, $textorientation, $colorindexs) {
$this->clear(BIFF_XFRECORD);
$this->append(XLSDATA_SHORT,$fontindex);
$this->append(XLSDATA_SHORT,$formatindex);
$this->append(XLSDATA_SHORT,$xftype);
$this->append(XLSDATA_BYTE,0x20); /* alignment
bits mask
2-0 07H XF_HOR_ALIGN ? Horizontal alignment
0 General
1 Left
2 Centred
3 Right
4 Filled
5 Justified (BIFF4-BIFF8)
6 Centred across selection (BIFF4-BIFF8)
7 Distributed (BIFF8, available in Excel 10.0 (Excel XP) and later only)
3 08H 1 = Text is wrapped at right border
6-4 70H XF_VERT_ALIGN ? Vertical alignment
0 Top
1 Centred
2 Bottom
3 Justified (BIFF5-BIFF8)
4 Distributed (BIFF8, available in Excel 10.0 (Excel XP) and later only)
*/
$this->append(XLSDATA_BYTE,$textorientation); /*
bits mask
1-0 03H XF_ORIENTATION ? Text orientation
0 Not rotated
1 Letters are stacked top-to-bottom, but not rotated
2 Text is rotated 90 degrees counterclockwise
3 Text is rotated 90 degrees clockwise
7-2 FCH XF_USED_ATTRIB ? Used attributes
0 01H Flag for number format
1 02H Flag for font
2 04H Flag for horizontal and vertical alignment, text wrap, indentation, orientation, rotation, and text direction
3 08H Flag for border lines
4 10H Flag for background area style
5 20H Flag for cell protection (cell locked and formula hidden)
*/
$this->append(XLSDATA_LONG,$colorindexs); /* Cell border lines and background area:
Bit Mask Contents
6-0 0000007FH Colour index for pattern colour
13-7 00003F80H Colour index for pattern background
21-16 003F0000H Fill pattern
24-22 01C00000H Bottom line style
31-25 FE000000H Colour index for bottom line colour
*/
$this->append(XLSDATA_LONG,0); /* Line styles
Bit Mask Contents
2-0 00000007H Top line style
5-3 00000038H Left line style
8-6 000001C0H Right line style
15-9 0000FE00H Colour index for top line colour
22-16 007F0000H Colour index for left line colour
29-23 3F800000H Colour index for right line colour
*/
$this->save($afilehd);
}
}
?>