From 17098b57ef62d9170bbeb70dd03e7f43f26ddc3b Mon Sep 17 00:00:00 2001 From: Sergey Shuchkin Date: Mon, 3 May 2021 03:08:41 +0600 Subject: [PATCH] 1.0.10 --- .gitignore | 2 + README.md | 29 +++- datatypes.png | Bin 27542 -> 45801 bytes src/SimpleXLSXGen.php | 346 ++++++++++++++++++++++++++++++------------ 4 files changed, 280 insertions(+), 97 deletions(-) diff --git a/.gitignore b/.gitignore index 2f82d3b..9b777f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ vendor* /books.fw.png /datatypes.fw.png +/styles.fw.png +/styles.png diff --git a/README.md b/README.md index e4c422f..cabef9b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# SimpleXLSXGen class 0.9.25 (Official) +# SimpleXLSXGen class 1.0.10 (Official) [](https://www.patreon.com/shuchkin) [](https://github.com/shuchkin/simplexlsxgen/blob/master/license.md) [](https://github.com/shuchkin/simplexlsxgen/stargazers) [](https://github.com/shuchkin/simplexlsxgen/network) [](https://github.com/shuchkin/simplexlsxgen/issues) Export data to Excel XLSX file. PHP XLSX generator. No external tools and libraries.
@@ -42,9 +42,11 @@ $data = [ ['Time','02:38:00'], ['Datetime PHP', new DateTime('2021-02-06 21:07:00')], ['String', 'Long UTF-8 String in autoresized column'], + ['Hyperlink', 'https://github.com/shuchkin/simplexlsxgen'], + ['Hyperlink + Anchor', 'SimpleXLSXGen'], ['RAW string', "\0".'2020-10-04 16:02:00'] ]; -SimpleXLSXGen::fromArray( $data )->saveAs('datatypes.xlsx'); +SimpleXLSXGen::fromArray( $data )->saveAs('datatypes.xlsx'); // or ->downloadAs('datatypes.xlsx'); ``` ![XLSX screenshot](datatypes.png) ### Fluid examples @@ -60,6 +62,28 @@ $xlsx->addSheet( $books, 'Catalog 2021' ); $xlsx->addSheet( $books2, 'Stephen King catalog'); $xlsx->downloadAs('books_2021.xlsx'); ``` +### Formatting +```php +$data = [ + ['Normal', '12345.67'], + ['Bold', '12345.67'], + ['Italic', '12345.67'], + ['Underline', '12345.67'], + ['Strike', '12345.67'], + ['Bold + Italic', '12345.67'], + ['Hyperlink', 'https://github.com/shuchkin/simplexlsxgen'], + ['Italic + Hyperlink + Anchor', 'SimpleXLSXGen'], + ['Left', '12345.67'], + ['Center', '
12345.67
'], + ['Right', 'Right Text'], + ['Center + Bold', '
Name
'] +]; +SimpleXLSXGen::fromArray( $data ) + ->setDefaultFont( 'Courier New' ) + ->setDefaultFontSize( 14 ) + ->saveAs('styles_and_tags.xlsx'); +``` +![XLSX screenshot](styles.png) ### Debug ```php ini_set('error_reporting', E_ALL ); @@ -73,6 +97,7 @@ SimpleXLSXGen::fromArray( $data )->saveAs('debug.xlsx'); ## History +v1.0.10 (2021-05-03) + Hyperlinks, + Minimal formatting v0.9.25 (2021-02-26) Added PHP Datetime object values in a cells
v0.9.24 (2021-02-26) * Percent
v0.9.23 (2021-01-25) Fix local floats in XML
diff --git a/datatypes.png b/datatypes.png index 89a943fb4922295db208f1eeceb561b6529e192f..9dc3dbaf8aee165e2ab5528a73a19b9792815e9d 100644 GIT binary patch literal 45801 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 B-?ab$ literal 27542 zcmeAS@N?(olHy`uVBq!ia0y~yV02|*VA#mP#=yW3%&`6$0|TRBrn7T^V@iHfszQ*v zlY)k!rKN=?1B1r-wS61C4hM)hobO)rC_tN~u%KeHhQ_v63CEV`x(ckhs(A9+l7(KG zLUD0d>sl5^vx}GSKX5XzAm9(ve}}?X4+IpOn>psaymRXDR=@sZyzcqw zJNNnp8X~H6q8u$kp5NE%nS1~Fqhl44eEEr0L0j%>@3`5}`g+mYu!VbAzdzPLaLoU& z-+qf!1_lPs0*}aI1_o|n5N2eUHAjMhf#q#xNJL45ua8x7ey(03C}j02atjzhz{b9! zATc>RwL~E)H9a%WR_Xoj{Yna%DYi=CroINg16w1-Ypui3%0DIeEoa6}C!XbFK1Xl~0)0b01CW=%eoaY+t1Boi z$^l!RlB}PalbV~FS5mBRsAmXQTab}ol3$#WkHcuVG>Qckxdpzya67QNB{vstMRAF1 zSqXmC#UYgisro^w#rdU0$*Hbosd**JAa55~ITxiSmgE@X{iK&$#s?yYw#FWI6M1qP_lC9G6i*gf7Y?U%|6Vp@m3-Z#H6yU*V<(!|B zU*wygl4`4D40eUDua#$BaYOMY@GC}v^$Q%KbBUzC}inU|PDwmG2u21*iE9+|}@ z`9+n`91)ya2xaADDu7dgRbnzIb=xW>gQ7JxMF}dLNp=W8j4jVd&BGhr5M{;rX(i=} zMX8SIsd*&?las!kf{i{XA42@04^H(+UIfb_ZQvmtw0_ zq-1YrBdn{)z>q5B>EaktaqI2g(uk=)_kDlA@_zBWz2}S1-89|&y`?%Rea^<}H*BIW zg**jW90eQ&T@5xw8*UI5-pC#8Iq_ZF)`$&avE6ll|LqV@wN~Ej{{8R1b>~Z8K6+Pi zcYglf{jp5zVyAp9yRKwryK&Q|9czs2?c;e2j|e=TZ+PPT`RS#cJIXc&vASw?pAPuz z2$j%s)#y@elStab)fKdI%ArF}T-@B68X5wRO)nO$T@sYJ{Eo`b7`?dX@e;b%18TM% zt!S>0>uPOnO-W0eG-HN`msgj>`pzXwRE&&_G&D3`h-fTZwrtXzIXZE#<16}$ii$LJ zbX06@=Pp^I@^M$k$4wQ6BErJLff^!Lu3im{jnzHo?X)r^C@jn^DM`s_=9{^P0@Nl? zoIBUo%ZqF4)~%1e{+oI6!i9zqEmcj;&ZZ`&Ns}k9T(f4$vSn_2?2`6q%xh0_bY#@j z)Vy-#io&a}Ss57$y1H-YiqB6ql8lUuOi54g7XK-}YRQt8DN{sJj3gx`B~8rDyTx6v zoc>az5f&QCc;U(wm1Eva3)ZdcyK?1A)RJZ|pT-kfxr{o797mH#g2IDMR|IMr*S zhst}IuCr&)uGP1?@US)i;(FG`b4|t$E-oz9-`^cQe!M+)ciG;Hm49V4%>K9886^E_ zTX^FRk1wxj$hEM`U(US0;1j!c(yunPS+iX=_Gx%|dv|tqJ$i9*aY{-`KuE|JzXdmf zTKM_-)s>VMnKowyCMPR%wK6RYy7^MS>h#wM9xCrk>KVR%{i+kOp<#FV`$^NMyJuu% zEO*$rbLY&qUr||8wwmnCx~)}Y)-CW;y>-zm#vL2(&a+#5RwE$&mFI!q$C(fSz`_{Er+Z&ULi;X2ECGYGgY+kTHfs2caK|@PR z$;@opoH;VDUca{fdT&dEww6}cg9i`Fx9t~O5xcvr_vYsG;-{xXv$C_J&;O2f7F76l zOz_Tixt#Lrv#sycH*C5i^6n1La>uXVmo0n7ciP<4wCse{?YeyJLeA$GT#|!@&zfw1 z_k6zQ#)|xf91fvs*>`d!*IG_iHoqK|pY@|vc}3xHm+h}&9SlDm z(o567rF}-#94aZq+w@7`N^ujtTPtBWG%(pg%L@Ft( z>NYdEG8*l4irBet&Xyw;pSq)7xk_i|tL4rfrdLu7f<60dHIA{rOM83JVbS}! zhi}#vd*9afN;M8i*_ias>0SD@nt}iwEv=-dueRQ}VOj9u!^P)DZS^G|e?~T(cv{rd z)U>1IrBG#M<@+ynCg$dsFI;d)OjNvj_3GN|i}vlCr|v&bKt$vU*OBs_@ePOD`8O9m z^s8&ewI77%{a%n9VPUc9)@^2C*;18 zUhP}qZ+z_Zdy!9WCph;VxRv_)=FTd~+qM3eIj%f&+mLluXph*=1#6cbZmf=UP<1z7 zmwfx#+cjT5JoC%pyl~=Ls@{uPHy-b+;AUN#H1}D)bk{2On(tk$Z+2_4az!SXx9{Fr znma!$mCO6>^J4qpp9k;yG~C!xvF+W5rF#}V+R5`$KDH*0|Hz#?cft&wK6_U5{G6

ifDiO8& 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�*QmMYYr*27kc|Y+u0vSj6YwTng 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À|V{%?k-4sbOr-Mn?iUOx%#+RB~MYH6<- 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 SPIm`g{^aTE=d#Wzp$PyPkO6)G diff --git a/src/SimpleXLSXGen.php b/src/SimpleXLSXGen.php index 48e8ac2..c223ae0 100644 --- a/src/SimpleXLSXGen.php +++ b/src/SimpleXLSXGen.php @@ -8,27 +8,45 @@ class SimpleXLSXGen { public $curSheet; + protected $defaultFont; + protected $defaultFontSize; protected $sheets; protected $template; - protected $SI, $SI_KEYS; + protected $F, $F_KEYS; // fonts + protected $XF, $XF_KEYS; // cellXfs + protected $SI, $SI_KEYS; // shared strings + const N_NORMAL = 0; // General + const N_INT = 1; // 0 + const N_DEC = 2; // 0.00 + const N_PERCENT_INT = 9; // 0% + const N_PRECENT_DEC = 10; // 0.00% + const N_DATE = 14; // mm-dd-yy + const N_TIME = 20; // h:mm + const N_DATETIME = 22; // m/d/yy h:mm + const F_NORMAL = 0; + const F_HYPERLINK = 1; + const F_BOLD = 2; + const F_ITALIC = 4; + const F_UNDERLINE = 8; + const F_STRIKE = 16; + const A_DEFAULT = 0; + const A_LEFT = 1; + const A_RIGHT = 2; + const A_CENTER = 3; + public function __construct() { $this->curSheet = -1; - $this->sheets = [ ['name' => 'Sheet1', 'rows' => [] ] ]; + $this->defaultFont = 'Calibri'; + $this->sheets = [ ['name' => 'Sheet1', 'rows' => [], 'hyperlinks' => [] ] ]; $this->SI = []; // sharedStrings index $this->SI_KEYS = []; // & keys + $this->F = [ self::F_NORMAL ]; // fonts + $this->F_KEYS = [0]; // & keys + $this->XF = [ [self::N_NORMAL, self::F_NORMAL, self::A_DEFAULT] ]; // styles + $this->XF_KEYS = ['N0F0A0' => 0 ]; // & keys + $this->template = [ - '[Content_Types].xml' => ' - - - - - -{SHEETS} - - - -', '_rels/.rels' => ' @@ -51,33 +69,42 @@ class SimpleXLSXGen { {SHEETS}', 'xl/worksheets/sheet1.xml' => ' -{COLS}{ROWS}', +{COLS}{ROWS}{HYPERLINKS}', + 'xl/worksheets/_rels/sheet1.xml.rels' => ' +{HYPERLINKS}', 'xl/sharedStrings.xml' => ' {STRINGS}', 'xl/styles.xml' => ' - +{FONTS} - - - - - - - - - - - +{XF} + + + ', 'xl/workbook.xml' => ' {SHEETS} -' +', + '[Content_Types].xml' => ' + + + + + + + + +{TYPES} +', ]; + // // 01001200 // Простой шаблонБудем делать генератор @@ -90,7 +117,7 @@ class SimpleXLSXGen { public function addSheet( array $rows, $name = null ) { $this->curSheet++; - $this->sheets[$this->curSheet] = ['name' => $name ?: 'Sheet'.($this->curSheet+1)]; + $this->sheets[$this->curSheet] = ['name' => $name ?: 'Sheet'.($this->curSheet+1), 'hyperlinks' => []]; if ( is_array( $rows ) && isset( $rows[0] ) && is_array($rows[0]) ) { $this->sheets[$this->curSheet]['rows'] = $rows; @@ -177,17 +204,7 @@ class SimpleXLSXGen { $cnt_sheets = count( $this->sheets ); foreach ($this->template as $cfilename => $template ) { - if ( $cfilename === '[Content_Types].xml' ) { - $s = ''; - for ( $i = 0; $i < $cnt_sheets; $i++) { - $s .= ''; - } - $template = str_replace('{SHEETS}', $s, $template); - $this->_writeEntry($fh, $cdrec, $cfilename, $template); - $entries++; - } - elseif ( $cfilename === 'xl/_rels/workbook.xml.rels' ) { + if ( $cfilename === 'xl/_rels/workbook.xml.rels' ) { $s = ''; for ( $i = 0; $i < $cnt_sheets; $i++) { $s .= '_writeEntry($fh, $cdrec, $cfilename, $template); $entries++; - } - elseif ( $cfilename === 'xl/workbook.xml' ) { + } elseif ( $cfilename === 'xl/workbook.xml' ) { $s = ''; foreach ( $this->sheets as $k => $v ) { $s .= ''; @@ -228,8 +244,61 @@ class SimpleXLSXGen { $entries++; } $xml = null; - } - else { + } elseif ( $cfilename === 'xl/worksheets/_rels/sheet1.xml.rels' ) { + $RH = []; + foreach ( $this->sheets as $k => $v ) { + if ( count($v['hyperlinks'])) { + $filename = 'xl/worksheets/_rels/sheet' . ( $k + 1 ) . '.xml.rels'; + foreach ( $v['hyperlinks'] as $h ) { + $RH[] = ''; + } + $xml = str_replace( '{HYPERLINKS}', implode( "\r\n", $RH ), $template ); + $this->_writeEntry( $fh, $cdrec, $filename, $xml ); + $entries++; + } + } + $xml = null; + + } elseif ( $cfilename === '[Content_Types].xml' ) { + $TYPES = ['']; + foreach ( $this->sheets as $k => $v) { + $TYPES[] = ''; + if (count( $v['hyperlinks'])) { + $TYPES[] = ''; + } + } + $template = str_replace('{TYPES}', implode("\r\n", $TYPES), $template); + $this->_writeEntry($fh, $cdrec, $cfilename, $template); + $entries++; + } elseif ( $cfilename === 'xl/styles.xml' ) { + $FONTS = ['']; + foreach ( $this->F as $f ) { + $FONTS[] = '' + . ( $this->defaultFontSize ? '' : '' ) + .( $f & self::F_BOLD ? '' : '') + .( $f & self::F_ITALIC ? '' : '') + .( $f & self::F_UNDERLINE ? '' : '') + .( $f & self::F_STRIKE ? '' : '') + .( $f & self::F_HYPERLINK ? '' : '') + .''; + } + $FONTS[] = ''; + $XF = ['']; + foreach( $this->XF as $xf ) { + $align = ($xf[2] === self::A_LEFT ? ' applyAlignment="1">' : '') + .($xf[2] === self::A_RIGHT ? ' applyAlignment="1">' : '') + .($xf[2] === self::A_CENTER ? ' applyAlignment="1">' : ''); + $XF[] = ' 0 ? ' applyNumberFormat="1"' : '') + .($align ? $align . '' : '/>'); + + } + $XF[] = ''; + $template = str_replace(['{FONTS}','{XF}'], [implode("\r\n", $FONTS), implode("\r\n", $XF)], $template); + $this->_writeEntry($fh, $cdrec, $cfilename, $template); + $entries++; + } else { $this->_writeEntry($fh, $cdrec, $cfilename, $template); $entries++; } @@ -337,6 +406,7 @@ class SimpleXLSXGen { $COLS = []; $ROWS = []; if ( count($this->sheets[$idx]['rows']) ) { + $COLS[] = ''; $CUR_ROW = 0; $COL = []; foreach( $this->sheets[$idx]['rows'] as $r ) { @@ -354,60 +424,106 @@ class SimpleXLSXGen { $cname = $this->num2name($CUR_COL) . $CUR_ROW; - $ct = $cs = null; + $ct = $cv = null; + $N = $F = $A = 0; if ( is_string($v) ) { - $vl = mb_strlen( $v ); - - if ( $v === '0' || preg_match( '/^[-+]?[1-9]\d{0,14}$/', $v ) ) { // Integer as General - $cv = ltrim( $v, '+' ); - if ( $vl > 10 ) { - $cs = 1; // [1] 0 - } - } elseif ( preg_match('/^[-+]?(0|[1-9]\d*)\.\d+$/', $v ) ) { - $cv = ltrim($v,'+'); - } elseif ( preg_match('/^([-+]?\d+)%$/', $v, $m) ) { - $cv = round( $m[1] / 100, 2); - $cs = 2; // [9] 0% - } elseif ( preg_match('/^([-+]\d+\.\d+)%$/', $v, $m) ) { - $cv = round( $m[1] / 100, 4 ); - $cs = 3; // [10] 0.00% - } elseif ( preg_match('/^(\d\d\d\d)-(\d\d)-(\d\d)$/', $v, $m ) ){ - $cv = $this->date2excel($m[1],$m[2],$m[3]); - $cs = 4; // [14] mm-dd-yy - } elseif ( preg_match('/^(\d\d)\/(\d\d)\/(\d\d\d\d)$/', $v, $m ) ){ - $cv = $this->date2excel($m[3],$m[2],$m[1]); - $cs = 4; // [14] mm-dd-yy - } elseif ( preg_match('/^(\d\d):(\d\d):(\d\d)$/', $v, $m ) ){ - $cv = $this->date2excel(0,0,0,$m[1],$m[2],$m[3]); - $cs = 5; // [14] mm-dd-yy - } elseif ( preg_match('/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/', $v, $m ) ) { - $cv = $this->date2excel( $m[1], $m[2], $m[3], $m[4], $m[5], $m[6] ); - $cs = 6; // [22] m/d/yy h:mm - } elseif ( preg_match('/^(\d\d)\/(\d\d)\/(\d\d\d\d) (\d\d):(\d\d):(\d\d)$/', $v, $m ) ) { - $cv = $this->date2excel( $m[3], $m[2], $m[1], $m[4], $m[5], $m[6] ); - $cs = 6; // [22] m/d/yy h:mm - } elseif ( mb_strlen( $v ) > 160 ) { - $ct = 'inlineStr'; - $cv = str_replace(['&','<','>',"\x03"],['&','<','>',''], $v); + if ( $v[0] === "\0" ) { // RAW value as string + $v = substr($v,1); + $vl = mb_strlen( $v ); } else { - if ( preg_match('/^[0-9+-.]+$/', $v ) ) { // Long ? - $cs = 7; // Align Right - } - $v = ltrim($v,"\0"); // disabled type detection - $ct = 's'; // shared string - $v = str_replace(['&','<','>',"\x03"],['&','<','>',''], $v); - $cv = false; - $skey = '~'.$v; - if ( isset($this->SI_KEYS[ $skey ]) ) { - $cv = $this->SI_KEYS[ $skey ]; + if ( strpos( $v, '<' ) !== false ) { // tags? + if ( strpos( $v, '' ) !== false ) { + $F += self::F_BOLD; + } + if ( strpos( $v, '' ) !== false ) { + $F += self::F_ITALIC; + } + if ( strpos( $v, '' ) !== false ) { + $F += self::F_UNDERLINE; + } + if ( strpos( $v, '' ) !== false ) { + $F += self::F_STRIKE; + } + if ( strpos( $v, '' ) !== false ) { + $A += self::A_LEFT; + } + if ( strpos( $v, '

' ) !== false ) { + $A += self::A_CENTER; + } + if ( strpos( $v, '' ) !== false ) { + $A += self::A_RIGHT; + } + if ( preg_match( '/(.*?)<\/a>/i', $v, $m ) ) { + $h = explode( '#', $m[1] ); + $this->sheets[ $idx ]['hyperlinks'][] = ['ID' => 'rId' . ( count( $this->sheets[ $idx ]['hyperlinks'] ) + 1 ), 'R' => $cname, 'H' => $h[0], 'L' => isset( $h[1] ) ? $h[1] : '']; + $F = self::F_HYPERLINK; // Hyperlink + } + $v = strip_tags( $v ); + } // tags + $vl = mb_strlen( $v ); + if ( $v === '0' || preg_match( '/^[-+]?[1-9]\d{0,14}$/', $v ) ) { // Integer as General + $cv = ltrim( $v, '+' ); + if ( $vl > 10 ) { + $N = self::N_INT; // [1] 0 + } + } elseif ( preg_match( '/^[-+]?(0|[1-9]\d*)\.(\d+)$/', $v, $m ) ) { + $cv = ltrim( $v, '+' ); + if ( strlen( $m[2] ) < 3 ) { + $N = self::N_DEC; + } + } elseif ( preg_match( '/^([-+]?\d+)%$/', $v, $m ) ) { + $cv = round( $m[1] / 100, 2 ); + $N = self::N_PERCENT_INT; // [9] 0% + } elseif ( preg_match( '/^([-+]\d+\.\d+)%$/', $v, $m ) ) { + $cv = round( $m[1] / 100, 4 ); + $N = self::N_PRECENT_DEC; // [10] 0.00% + } elseif ( preg_match( '/^(\d\d\d\d)-(\d\d)-(\d\d)$/', $v, $m ) ) { + $cv = $this->date2excel( $m[1], $m[2], $m[3] ); + $N = self::N_DATE; // [14] mm-dd-yy + } elseif ( preg_match( '/^(\d\d)\/(\d\d)\/(\d\d\d\d)$/', $v, $m ) ) { + $cv = $this->date2excel( $m[3], $m[2], $m[1] ); + $N = self::N_DATE; // [14] mm-dd-yy + } elseif ( preg_match( '/^(\d\d):(\d\d):(\d\d)$/', $v, $m ) ) { + $cv = $this->date2excel( 0, 0, 0, $m[1], $m[2], $m[3] ); + $N = self::N_TIME; // time + } elseif ( preg_match( '/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/', $v, $m ) ) { + $cv = $this->date2excel( $m[1], $m[2], $m[3], $m[4], $m[5], $m[6] ); + $N = self::N_DATETIME; // [22] m/d/yy h:mm + } elseif ( preg_match( '/^(\d\d)\/(\d\d)\/(\d\d\d\d) (\d\d):(\d\d):(\d\d)$/', $v, $m ) ) { + $cv = $this->date2excel( $m[3], $m[2], $m[1], $m[4], $m[5], $m[6] ); + $N = self::N_DATETIME; // [22] m/d/yy h:mm + } elseif ( preg_match( '/^[0-9+-.]+$/', $v ) ) { // Long ? + $A = self::A_RIGHT; + } elseif ( preg_match( '/https?:\/\/\S+/i', $v ) ) { + $h = explode( '#', $v ); + $this->sheets[ $idx ]['hyperlinks'][] = ['ID' => 'rId' . ( count( $this->sheets[ $idx ]['hyperlinks'] ) + 1 ), 'R' => $cname, 'H' => $h[0], 'L' => isset( $h[1] ) ? $h[1] : '']; + $F = self::F_HYPERLINK; // Hyperlink + } elseif ( preg_match( "/([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $v ) ) { + $this->sheets[ $idx ]['hyperlinks'][] = ['ID' => 'rId' . ( count( $this->sheets[ $idx ]['hyperlinks'] ) + 1 ), 'R' => $cname, 'H' => 'mailto:' . $v, 'L' => '']; + $F = self::F_HYPERLINK; // Hyperlink } + } + if ( !$cv) { - if ( $cv === false ) { - $this->SI[] = $v; - $cv = count( $this->SI ) - 1; - $this->SI_KEYS[$skey] = $cv; + $v = $this->esc( $v ); + + if ( mb_strlen( $v ) > 160 ) { + $ct = 'inlineStr'; + $cv = $v; + } else { + $ct = 's'; // shared string + $cv = false; + $skey = '~' . $v; + if ( isset( $this->SI_KEYS[ $skey ] ) ) { + $cv = $this->SI_KEYS[ $skey ]; + } + if ( $cv === false ) { + $this->SI[] = $v; + $cv = count( $this->SI ) - 1; + $this->SI_KEYS[ $skey ] = $cv; + } } } } elseif ( is_int( $v ) ) { @@ -419,13 +535,34 @@ class SimpleXLSXGen { } elseif ( $v instanceof DateTime ) { $vl = 16; $cv = $this->date2excel( $v->format('Y'), $v->format('m'), $v->format('d'), $v->format('H'), $v->format('i'), $v->format('s') ); - $cs = 6; // [22] m/d/yy h:mm + $N = self::N_DATETIME; // [22] m/d/yy h:mm } else { continue; } $COL[ $CUR_COL ] = max( $vl, $COL[ $CUR_COL ] ); + $cs = 0; + if ( $N + $F + $A > 0 ) { + + if ( isset($this->F_KEYS[ $F ] ) ) { + $cf = $this->F_KEYS[ $F ]; + } else { + $cf = count($this->F); + $this->F_KEYS[$F] = $cf; + $this->F[] = $F; + } + $NFA = 'N' . $N . 'F' . $cf . 'A' . $A; + if ( isset( $this->XF_KEYS[ $NFA ] ) ) { + $cs = $this->XF_KEYS[ $NFA ]; + } + if ( $cs === 0 ) { + $cs = count( $this->XF ); + $this->XF_KEYS[ $NFA ] = $cs; + $this->XF[] = [$N, $cf, $A]; + } + } + $row .= '' .($ct === 'inlineStr' ? ''.$cv.'' : '' . $cv . '')."\r\n"; } @@ -434,17 +571,25 @@ class SimpleXLSXGen { foreach ( $COL as $k => $max ) { $COLS[] = ''; } + $COLS[] = ''; $REF = 'A1:'.$this->num2name(count($COLS)) . $CUR_ROW; } else { - $COLS[] = ''; $ROWS[] = '0'; $REF = 'A1:A1'; } + $HYPERLINKS = []; + if ( count( $this->sheets[$idx]['hyperlinks']) ) { + $HYPERLINKS[] = ''; + foreach ( $this->sheets[$idx]['hyperlinks'] as $h ) { + $HYPERLINKS[] = ''; + } + $HYPERLINKS[] = ''; + } //restore locale setlocale(LC_NUMERIC, $_loc); - return str_replace(['{REF}','{COLS}','{ROWS}'], - [ $REF, implode("\r\n", $COLS), implode("\r\n",$ROWS) ], + return str_replace(['{REF}','{COLS}','{ROWS}','{HYPERLINKS}'], + [ $REF, implode("\r\n", $COLS), implode("\r\n",$ROWS), implode("\r\n", $HYPERLINKS) ], $template ); } @@ -484,4 +629,15 @@ class SimpleXLSXGen { return (float) $excelDate + $excelTime; } + public function setDefaultFont( $name ) { + $this->defaultFont = $name; + return $this; + } + public function setDefaultFontSize( $size ) { + $this->defaultFontSize = $size; + return $this; + } + public function esc( $str ) { + return str_replace( ['&', '<', '>', "\x03"], ['&', '<', '>', ''], $str ); + } }