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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 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 ); + } }