mirror of
https://github.com/shuchkin/simplexlsxgen.git
synced 2023-08-10 21:12:59 +03:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
59cdc277ee | |||
343e549ca1 | |||
61e55d6277 | |||
9b52ff6ac7 | |||
317fb0982e | |||
765001ae96 | |||
c2f3077812 | |||
af53c754c3 |
@ -1,5 +1,8 @@
|
||||
# Changelog
|
||||
|
||||
## 1.3.11 (2023-03-28)
|
||||
* freezePanes( corner_cell ) - freezePanes to keep an area of a worksheet visible while you scroll, corner_cell is not included, thx [Javier](https://github.com/xaviermdq)
|
||||
|
||||
## 1.3.10 (2022-12-14)
|
||||
* added borders ```<style border="medium">Black Border</style>``` see colored [examples](https://github.com/shuchkin/simplexlsxgen#formatting)
|
||||
* added formulas ```<f v="100">SUM(B1:B10)</f>``` see [examples](https://github.com/shuchkin/simplexlsxgen#data-types)
|
||||
|
22
README.md
22
README.md
@ -33,6 +33,7 @@ $ composer require shuchkin/simplexlsxgen
|
||||
or download class [here](https://github.com/shuchkin/simplexlsxgen/blob/master/src/SimpleXLSXGen.php)
|
||||
|
||||
## Examples
|
||||
Use UTF-8 encoded strings.
|
||||
### Data types
|
||||
```php
|
||||
$data = [
|
||||
@ -47,7 +48,7 @@ $data = [
|
||||
['Date', '2020-05-20'],
|
||||
['Time', '02:38:00'],
|
||||
['Datetime PHP', new DateTime('2021-02-06 21:07:00')],
|
||||
['String', 'Long UTF-8 String in autoresized column'],
|
||||
['String', 'Very long UTF-8 string in autoresized column'],
|
||||
['Formula', '<f v="135.35">SUM(B1:B2)</f>'],
|
||||
['Hyperlink', 'https://github.com/shuchkin/simplexlsxgen'],
|
||||
['Hyperlink + Anchor', '<a href="https://github.com/shuchkin/simplexlsxgen">SimpleXLSXGen</a>'],
|
||||
@ -95,6 +96,21 @@ SimpleXLSXGen::fromArray($data)
|
||||
```
|
||||

|
||||
|
||||
### RAW Strings
|
||||
Prefix #0 cell value (use double quotes).
|
||||
```php
|
||||
$PushkinDOB = '1799-07-06';
|
||||
$data = [
|
||||
['Datetime as raw string', "\0".'2023-01-09 11:16:34'],
|
||||
['Date as raw string', "\0".$PushkinDOB],
|
||||
['Disable type detection', "\0".'+12345'],
|
||||
['Insert greater/less them simbols', "\0".'20- short term: <6 month'],
|
||||
|
||||
];
|
||||
SimpleXLSXGen::fromArray($data)
|
||||
->saveAs('test_rawstrings.xlsx');
|
||||
```
|
||||
|
||||
### More examples
|
||||
```php
|
||||
// Fluid interface, output to browser for download
|
||||
@ -117,6 +133,10 @@ exit();
|
||||
// Autofilter
|
||||
$xlsx->autoFilter('A1:B10');
|
||||
|
||||
// Freeze rows and columns from top-left corner up to, but not including,
|
||||
// the row and column of the indicated cell
|
||||
$xlsx->freezePanes('C3');
|
||||
|
||||
```
|
||||
### JS array to Excel (AJAX)
|
||||
```php
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "shuchkin/simplexlsxgen",
|
||||
"description": "Export data to Excel XLSx file. PHP XLSX generator.",
|
||||
"keywords": ["php", "excel", "xlsx", "generator", "creator", "backend"],
|
||||
"keywords": ["php", "excel", "xlsx", "generator", "writer", "creator", "backend"],
|
||||
"homepage": "https://github.com/shuchkin/simplexlsxgen",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
|
@ -215,7 +215,7 @@ class SimpleXLSXGen
|
||||
}
|
||||
}
|
||||
|
||||
$this->sheets[$this->curSheet] = ['name' => $name, 'hyperlinks' => [], 'mergecells' => [], 'colwidth' => [], 'autofilter' => ''];
|
||||
$this->sheets[$this->curSheet] = ['name' => $name, 'hyperlinks' => [], 'mergecells' => [], 'colwidth' => [], 'autofilter' => '', 'frozen' => ''];
|
||||
|
||||
if (isset($rows[0]) && is_array($rows[0])) {
|
||||
$this->sheets[$this->curSheet]['rows'] = $rows;
|
||||
@ -617,7 +617,28 @@ class SimpleXLSXGen
|
||||
setlocale(LC_NUMERIC, 'C');
|
||||
$COLS = [];
|
||||
$ROWS = [];
|
||||
$SHEETVIEWS = '';
|
||||
if (count($this->sheets[$idx]['rows'])) {
|
||||
if ($this->sheets[$idx]['frozen'] !== '' || isset($this->sheets[$idx]['frozen'][0]) || isset($this->sheets[$idx]['frozen'][1])) {
|
||||
$x = $y = 0;
|
||||
if (is_string($this->sheets[$idx]['frozen'])) {
|
||||
$cell = $this->sheets[$idx]['frozen'];
|
||||
self::cell2coord($cell, $x, $y);
|
||||
} else {
|
||||
if (isset($this->sheets[$idx]['frozen'][0])) $x = $this->sheets[$idx]['frozen'][0];
|
||||
if (isset($this->sheets[$idx]['frozen'][1])) $y = $this->sheets[$idx]['frozen'][1];
|
||||
$cell = self::coord2cell($x, $y);
|
||||
}
|
||||
if ($x > 0 || $y > 0) {
|
||||
$split = '';
|
||||
if ($x > 0) $split .= " xSplit=\"{$x}\"";
|
||||
if ($y > 0) $split .= " ySplit=\"{$y}\"";
|
||||
$activepane = 'bottomRight';
|
||||
if ($x > 0 && $y == 0) $activepane = 'topRight';
|
||||
if ($x == 0 && $y > 0) $activepane = 'bottomLeft';
|
||||
$SHEETVIEWS = "<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><pane{$split} topLeftCell=\"{$cell}\" activePane=\"{$activepane}\" state=\"frozen\"/></sheetView></sheetViews>";
|
||||
}
|
||||
}
|
||||
$COLS[] = '<cols>';
|
||||
$CUR_ROW = 0;
|
||||
$COL = [];
|
||||
@ -903,13 +924,15 @@ class SimpleXLSXGen
|
||||
//restore locale
|
||||
setlocale(LC_NUMERIC, $_loc);
|
||||
|
||||
return str_replace(['{REF}', '{COLS}', '{ROWS}', '{AUTOFILTER}', '{MERGECELLS}', '{HYPERLINKS}'],
|
||||
[$REF,
|
||||
return str_replace(['{REF}', '{COLS}', '{ROWS}', '{AUTOFILTER}', '{MERGECELLS}', '{HYPERLINKS}', '{SHEETVIEWS}'],
|
||||
[
|
||||
$REF,
|
||||
implode("\r\n", $COLS),
|
||||
implode("\r\n", $ROWS),
|
||||
$AUTOFILTER,
|
||||
implode("\r\n", $MERGECELLS),
|
||||
implode("\r\n", $HYPERLINKS)
|
||||
implode("\r\n", $HYPERLINKS),
|
||||
$SHEETVIEWS
|
||||
],
|
||||
$template);
|
||||
}
|
||||
@ -1012,4 +1035,37 @@ class SimpleXLSXGen
|
||||
return "\0" . (string)$value;
|
||||
}
|
||||
|
||||
public static function cell2coord($cell, &$x, &$y)
|
||||
{
|
||||
$x = $y = 0;
|
||||
$lettercount = 0;
|
||||
$cell = str_replace([' ', '\t', '\r', '\n', '\v', '\0'], '', $cell);
|
||||
if (empty($cell)) return;
|
||||
$cell = strtoupper($cell);
|
||||
for ($i = 0; $i < strlen($cell); $i++) if ($cell[$i] >= 'A' && $cell[$i] <= 'Z') $lettercount++;
|
||||
if ($lettercount > 0) {
|
||||
$x = ord($cell[$lettercount - 1]) - ord('A');
|
||||
$e = 1;
|
||||
for ($i = $lettercount - 2 ; $i >= 0 ; $i--) {
|
||||
$x += (ord($cell[$i]) - ord('A') + 1) * (26**$e);
|
||||
$e++;
|
||||
}
|
||||
}
|
||||
if ($lettercount < strlen($cell)) $y = ((int)substr($cell, $lettercount)) - 1;
|
||||
}
|
||||
|
||||
public static function coord2cell($x, $y, $absolute = false)
|
||||
{
|
||||
$c = '';
|
||||
for ($i = $x; $i >= 0; $i = ((int)($i / 26)) - 1) $c = chr(ord('A') + $i % 26) . $c;
|
||||
if ($absolute) $absolute = '$'; else $absolute = '';
|
||||
return $absolute . $c . $absolute . ($y+1);
|
||||
}
|
||||
|
||||
public function freezePanes($cell)
|
||||
{
|
||||
$this->sheets[$this->curSheet]['frozen'] = $cell;
|
||||
return $this;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user