2021-05-29 20:21:45 +03:00
# SimpleXLSXGen
[<img src="https://img.shields.io/github/license/shuchkin/simplexlsxgen" /> ](https://github.com/shuchkin/simplexlsxgen/blob/master/license.md ) [<img src="https://img.shields.io/github/stars/shuchkin/simplexlsxgen" /> ](https://github.com/shuchkin/simplexlsxgen/stargazers ) [<img src="https://img.shields.io/github/forks/shuchkin/simplexlsxgen" /> ](https://github.com/shuchkin/simplexlsxgen/network ) [<img src="https://img.shields.io/github/issues/shuchkin/simplexlsxgen" /> ](https://github.com/shuchkin/simplexlsxgen/issues )
2020-05-19 23:46:52 +03:00
2022-02-05 15:32:10 +03:00
Export data to Excel XLSX file. PHP XLSX generator. No external tools and libraries.
- XLSX reader [here ](https://github.com/shuchkin/simplexlsx )
- XLS reader [here ](https://github.com/shuchkin/simplexls )
- CSV reader/writer [here ](https://github.com/shuchkin/simplecsv )
2020-05-19 23:46:52 +03:00
2023-03-31 14:22:19 +03:00
**Sergey Shuchkin** < sergey.shuchkin @ gmail . com > 2020-2023< br / >
2020-05-19 23:46:52 +03:00
2021-05-29 20:21:45 +03:00
*Hey, bro, please ★ the package for my motivation :) and [donate ](https://opencollective.com/simplexlsx ) for more motivation!*
2020-05-19 23:46:52 +03:00
## Basic Usage
```php
$books = [
['ISBN', 'title', 'author', 'publisher', 'ctry' ],
[618260307, 'The Hobbit', 'J. R. R. Tolkien', 'Houghton Mifflin', 'USA'],
[908606664, 'Slinky Malinki', 'Lynley Dodd', 'Mallinson Rendel', 'NZ']
];
2022-02-05 15:32:10 +03:00
$xlsx = Shuchkin\SimpleXLSXGen::fromArray( $books );
2021-02-28 21:09:42 +03:00
$xlsx->saveAs('books.xlsx'); // or downloadAs('books.xlsx') or $xlsx_content = (string) $xlsx
2020-05-19 23:46:52 +03:00
```
![XLSX screenshot ](books.png )
## Installation
The recommended way to install this library is [through Composer ](https://getcomposer.org ).
[New to Composer? ](https://getcomposer.org/doc/00-intro.md )
This will install the latest supported version:
```bash
$ composer require shuchkin/simplexlsxgen
```
or download class [here ](https://github.com/shuchkin/simplexlsxgen/blob/master/src/SimpleXLSXGen.php )
## Examples
2023-02-25 14:14:53 +03:00
Use UTF-8 encoded strings.
2020-05-19 23:46:52 +03:00
### Data types
```php
$data = [
['Integer', 123],
['Float', 12.35],
2021-02-26 09:55:41 +03:00
['Percent', '12%'],
2022-12-14 18:30:23 +03:00
['Currency $', '$500.67'],
['Currency €', '200 €'],
['Currency ₽', '1200.30 ₽'],
['Currency (other)', '< style nf = ""£"#,##0.00" > 500 < / style > '],
2023-04-19 22:11:53 +03:00
['Currency Float (other)', '< style nf = "#,##0.00 \ [$£-1];[Red]#,##0.00 \ [$£-1]" > 500 . 250 </ style > '],
2020-05-19 23:46:52 +03:00
['Datetime', '2020-05-20 02:38:00'],
2022-12-14 18:30:23 +03:00
['Date', '2020-05-20'],
['Time', '02:38:00'],
2021-02-26 18:39:13 +03:00
['Datetime PHP', new DateTime('2021-02-06 21:07:00')],
2023-02-25 14:14:53 +03:00
['String', 'Very long UTF-8 string in autoresized column'],
2022-12-14 18:30:23 +03:00
['Formula', '< f v = "135.35" > SUM(B1:B2)< / f > '],
2021-05-03 00:22:26 +03:00
['Hyperlink', 'https://github.com/shuchkin/simplexlsxgen'],
['Hyperlink + Anchor', '< a href = "https://github.com/shuchkin/simplexlsxgen" > SimpleXLSXGen< / a > '],
2022-12-14 18:30:23 +03:00
['Internal link', '< a href = "sheet2!A1" > Go to second page< / a > '],
['RAW string', "\0" . '2020-10-04 16:02:00']
2020-05-19 23:46:52 +03:00
];
2022-12-14 18:30:23 +03:00
SimpleXLSXGen::fromArray($data)->saveAs('datatypes.xlsx');
2020-05-19 23:46:52 +03:00
```
![XLSX screenshot ](datatypes.png )
2021-05-14 13:52:30 +03:00
2021-05-03 00:08:41 +03:00
### Formatting
```php
$data = [
2021-05-03 00:22:26 +03:00
['Normal', '12345.67'],
['Bold', '< b > 12345.67< / b > '],
['Italic', '< i > 12345.67< / i > '],
['Underline', '< u > 12345.67< / u > '],
['Strike', '< s > 12345.67< / s > '],
['Bold + Italic', '< b > < i > 12345.67< / i > < / b > '],
['Hyperlink', 'https://github.com/shuchkin/simplexlsxgen'],
['Italic + Hyperlink + Anchor', '< i > < a href = "https://github.com/shuchkin/simplexlsxgen" > SimpleXLSXGen< / a > < / i > '],
2022-04-24 11:59:15 +03:00
['Green', '< style color = "#00FF00" > 12345 . 67 < / style > '],
['Bold Red Text', '< b > < style color = "#FF0000" > 12345 . 67 < / style > < / b > '],
2023-03-31 14:15:07 +03:00
['Size 32 Font', '< style font-size = "32" > Big Text < / style > '],
2022-04-24 11:59:15 +03:00
['Blue Text and Yellow Fill', '< style bgcolor = "#FFFF00" color = "#0000FF" > 12345 . 67 < / style > '],
2022-12-14 18:30:23 +03:00
['Border color', '< style border = "#000000" > Black Thin Border < / style > '],
['< top > Border style< / top > ','< style border = "medium" > < wraptext > none , thin , medium , dashed , dotted , thick , double , hair , mediumDashed , dashDot , mediumDashDot , dashDotDot , mediumDashDotDot , slantDashDot < / wraptext > < / style > '],
['Border sides', '< style border = "none dotted#0000FF medium#FF0000 double" > Top No + Right Dotted + Bottom medium + Left double < / style > '],
2021-05-03 00:22:26 +03:00
['Left', '< left > 12345.67< / left > '],
['Center', '< center > 12345.67< / center > '],
['Right', '< right > Right Text< / right > '],
2022-03-15 18:47:33 +03:00
['Center + Bold', '< center > < b > Name< / b > < / center > '],
2022-05-17 09:03:35 +03:00
['Row height', '< style height = "50" > Row Height = 50 < / style > '],
['Top', '< style height = "50" > < top > Top < / top > < / style > '],
['Middle + Center', '< style height = "50" > < middle > < center > Middle + Center < / center > < / middle > < / style > '],
['Bottom + Right', '< style height = "50" > < bottom > < right > Bottom + Right < / right > < / bottom > < / style > '],
2022-06-01 09:54:28 +03:00
['< center > MERGE CELLS MERGE CELLS MERGE CELLS MERGE CELLS MERGE CELLS< / center > ', null],
2023-03-31 14:15:07 +03:00
['< top > Word wrap< / top > ', "< wraptext > Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book< / wraptext > "],
2021-05-03 00:08:41 +03:00
];
2022-12-14 18:30:23 +03:00
SimpleXLSXGen::fromArray($data)
->setDefaultFont('Courier New')
->setDefaultFontSize(14)
->setColWidth(1, 35)
2022-05-17 09:03:35 +03:00
->mergeCells('A20:B20')
2021-05-03 00:22:26 +03:00
->saveAs('styles_and_tags.xlsx');
2021-05-03 00:08:41 +03:00
```
![XLSX screenshot ](styles.png )
2021-05-14 13:52:30 +03:00
2023-01-09 08:51:48 +03:00
### 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');
```
2021-05-14 13:52:30 +03:00
### More examples
```php
// Fluid interface, output to browser for download
2022-02-05 15:32:10 +03:00
Shuchkin\SimpleXLSXGen::fromArray( $books )->downloadAs('table.xlsx');
2021-05-14 13:52:30 +03:00
// Fluid interface, multiple sheets
2022-02-05 15:32:10 +03:00
Shuchkin\SimpleXLSXGen::fromArray( $books )->addSheet( $books2 )->download();
2021-05-14 13:52:30 +03:00
// Alternative interface, sheet name, get xlsx content
2022-02-05 15:32:10 +03:00
$xlsx_cache = (string) (new Shuchkin\SimpleXLSXGen)->addSheet( $books, 'Modern style');
2021-05-14 13:52:30 +03:00
2021-05-19 07:21:09 +03:00
// Classic interface
2022-02-05 15:32:10 +03:00
use Shuchkin\SimpleXLSXGen
2021-05-14 13:52:30 +03:00
$xlsx = new SimpleXLSXGen();
$xlsx->addSheet( $books, 'Catalog 2021' );
$xlsx->addSheet( $books2, 'Stephen King catalog');
$xlsx->downloadAs('books_2021.xlsx');
exit();
2022-08-06 20:13:06 +03:00
2022-08-12 15:57:41 +03:00
// Autofilter
$xlsx->autoFilter('A1:B10');
2022-08-06 20:13:06 +03:00
2023-03-28 13:21:08 +03:00
// Freeze rows and columns from top-left corner up to, but not including,
2023-07-05 04:23:07 +03:00
// the row and column of the indicated cell (in A1 format as string or
// R1C1 format as 2-element integer array)
2023-03-28 13:21:08 +03:00
$xlsx->freezePanes('C3');
2023-04-11 00:18:46 +03:00
// RTL mode
// Column A is on the far right, Column B is one column left of Column A, and so on. Also, information in cells is displayed in the Right to Left format.
$xlsx->rightToLeft();
2023-04-19 09:00:22 +03:00
// Set Meta Data Files
// this data in propertis Files and Info file in Office
2023-04-19 10:38:08 +03:00
$xlsx->setAuthor('Sergey Shuchkin < sergey.shuchkin @ gmail . com > ')
->setCompany('Microsoft < info @ microsoft . com > ')
->setManager('Bill Gates < bill.gates @ microsoft . com > ')
->setLastModifiedBy("Sergey Shuchkin < sergey.shuchkin @ gmail . com > ")
->setTitle('This is Title')
->setSubject('This is Subject')
->setKeywords('Keywords1, Keywords2, Keywords3, KeywordsN')
->setDescription('This is Description')
->setCategory('This is С ategory')
->setApplication('Shuchkin\SimpleXLSXGen')
2021-05-14 13:52:30 +03:00
```
2022-06-10 09:07:39 +03:00
### JS array to Excel (AJAX)
```php
< ?php // array2excel.php
if (isset($_POST['array2excel'])) {
require __DIR__ .'/simplexlsxgen/src/SimpleXLSXGen.php';
$data = json_decode($_POST['array2excel'], false);
\Shuchkin\SimpleXLSXGen::fromArray($data)->downloadAs('file.xlsx');
return;
}
?>
< html lang = "en" >
< head >
< title > JS array to Excel< / title >
< / head >
< script >
function array2excel() {
var books = [
["ISBN", "title", "author", "publisher", "ctry"],
[618260307, "The Hobbit", "J. R. R. Tolkien", "Houghton Mifflin", "USA"],
[908606664, "Slinky Malinki", "Lynley Dodd", "Mallinson Rendel", "NZ"]
];
var json = JSON.stringify(books);
var request = new XMLHttpRequest();
2022-07-28 15:26:11 +03:00
request.onload = function () {
if (this.status === 200) {
var file = new Blob([this.response], {type: this.getResponseHeader('Content-Type')});
var fileURL = URL.createObjectURL(file);
var filename = "", m;
var disposition = this.getResponseHeader('Content-Disposition');
if (disposition & & (m = /"([^"]+)"/.exec(disposition)) !== null) {
filename = m[1];
}
var a = document.createElement("a");
if (typeof a.download === 'undefined') {
window.location = fileURL;
2022-06-10 09:07:39 +03:00
} else {
2022-07-28 15:26:11 +03:00
a.href = fileURL;
a.download = filename;
document.body.appendChild(a);
a.click();
2022-06-10 09:07:39 +03:00
}
2022-07-28 15:26:11 +03:00
} else {
alert("Error: " + this.status + " " + this.statusText);
2022-06-10 09:07:39 +03:00
}
}
2022-07-28 15:26:11 +03:00
2022-06-10 09:07:39 +03:00
request.open('POST', "array2excel.php");
request.responseType = "blob";
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send("array2excel=" + encodeURIComponent(json));
}
< / script >
< body >
< input type = "button" onclick = "array2excel()" value = "array2excel" / >
< / body >
< / html >
```
2021-05-14 13:52:30 +03:00
2021-05-19 07:21:09 +03:00
## Debug
2020-07-14 12:24:51 +03:00
```php
ini_set('error_reporting', E_ALL );
ini_set('display_errors', 1 );
$data = [
['Debug', 123]
2021-11-28 16:48:15 +03:00
];
2022-02-05 15:32:10 +03:00
Shuchkin\SimpleXLSXGen::fromArray( $data )->saveAs('debug.xlsx');
2021-11-28 16:48:15 +03:00
```