2021-05-29 20:21:45 +03:00
# SimpleXLSXGen
2023-07-27 20:12:35 +03:00
2021-05-29 20:21:45 +03:00
[<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
2023-07-27 20:12:35 +03:00
2020-05-19 23:46:52 +03:00
```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
2023-07-27 20:12:35 +03:00
2020-05-19 23:46:52 +03:00
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-07-27 20:12:35 +03:00
2023-02-25 14:14:53 +03:00
Use UTF-8 encoded strings.
2023-07-23 21:41:27 +03:00
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();
2023-07-23 21:41:27 +03:00
$xlsx->addSheet($books, 'Catalog 2021');
$xlsx->addSheet($books2, 'Stephen King catalog');
2021-05-14 13:52:30 +03:00
$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-07-27 20:12:35 +03:00
// Comment cell
$xlsx->setComment("B2", "Comment text", "Comment author");
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
```
2023-07-27 20:12:35 +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
2023-07-23 21:41:27 +03:00
## Notes
* When XLSX file is generated (__toString, saveAs or downloadAs methods), the data matrix of each sheet is traversed by rows and columns using foreach cycles. This implies freedom in the type of indexes used for the data but it also implies paying special attention when using numeric indexes since the array is traversed in the order in which they were defined and not in the numerical order of said indexes.
* The helper methods for setting and getting the styles of a range or cell, implies that the data was defined as a 2-dimensional array (matrix) with consecutive 0-based numeric indexes.
* If you use download or downloadAs methods, make sure you don't generate output before (not important if you use output buffering) and after you call the method. Pay special attention to whitespaces characters (space, cr/lf, tab) in source files before and after PHP code closing tags. If you inadvertently, or on purpose, generate text output, the resulting XLSX file will be corrupted.
2023-07-27 20:12:35 +03:00
* Methods setDefaultFont, setDefaultFontSize, setTitle, setSubject, setAuthor, setCompany, setManager, setKeywords, setDescription, setCategory, setApplication, setLastModifiedBy and rightToLeft apply to the entire book.
* Methods autoFilter, mergeCells, setColWidth, freezePanes and setComment apply to the current sheet (the last addSheet/fromArray used)
2023-07-23 21:41:27 +03:00
2021-05-19 07:21:09 +03:00
## Debug
2023-07-27 20:12:35 +03:00
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
```