Merge branch 'develop' of https://github.com/PHPOffice/PhpSpreadsheet into develop

This commit is contained in:
MarkBaker 2017-05-04 14:31:40 +01:00
commit 4ccd0b95da
229 changed files with 8178 additions and 15983 deletions

View File

@ -34,6 +34,7 @@ return PhpCsFixer\Config::create()
'hash_to_slash_comment' => true, 'hash_to_slash_comment' => true,
'header_comment' => false, // We don't use common header in all our files 'header_comment' => false, // We don't use common header in all our files
'heredoc_to_nowdoc' => false, // Not sure about this one 'heredoc_to_nowdoc' => false, // Not sure about this one
'is_null' => false, // Risky
'include' => true, 'include' => true,
'indentation_type' => true, 'indentation_type' => true,
'line_ending' => true, 'line_ending' => true,
@ -46,6 +47,7 @@ return PhpCsFixer\Config::create()
'method_separation' => true, 'method_separation' => true,
'modernize_types_casting' => true, 'modernize_types_casting' => true,
'native_function_casing' => true, 'native_function_casing' => true,
'native_function_invocation'=> false, // This is risky and seems to be micro-optimization that make code uglier so not worth it, at least for now
'new_with_braces' => true, 'new_with_braces' => true,
'no_alias_functions' => true, 'no_alias_functions' => true,
'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_class_opening' => true,
@ -88,7 +90,7 @@ return PhpCsFixer\Config::create()
'php_unit_construct' => true, 'php_unit_construct' => true,
'php_unit_dedicate_assert' => true, 'php_unit_dedicate_assert' => true,
'php_unit_fqcn_annotation' => true, 'php_unit_fqcn_annotation' => true,
'php_unit_strict' => false, // We sometime actually need assertEquals 'phpdoc_align' => false, // Waste of time 'php_unit_strict' => false, // We sometime actually need assertEquals
'phpdoc_add_missing_param_annotation' => true, 'phpdoc_add_missing_param_annotation' => true,
'phpdoc_align' => false, // Waste of time 'phpdoc_align' => false, // Waste of time
'phpdoc_annotation_without_dot' => true, 'phpdoc_annotation_without_dot' => true,
@ -98,7 +100,9 @@ return PhpCsFixer\Config::create()
'phpdoc_no_alias_tag' => true, 'phpdoc_no_alias_tag' => true,
'phpdoc_no_empty_return' => true, 'phpdoc_no_empty_return' => true,
'phpdoc_no_package' => true, 'phpdoc_no_package' => true,
'phpdoc_no_useless_inheritdoc' => true,
'phpdoc_order' => true, 'phpdoc_order' => true,
'phpdoc_return_self_reference' => true,
'phpdoc_scalar' => true, 'phpdoc_scalar' => true,
'phpdoc_separation' => true, 'phpdoc_separation' => true,
'phpdoc_single_line_var_spacing' => true, 'phpdoc_single_line_var_spacing' => true,
@ -132,6 +136,7 @@ return PhpCsFixer\Config::create()
'switch_case_semicolon_to_colon' => true, 'switch_case_semicolon_to_colon' => true,
'switch_case_space' => true, 'switch_case_space' => true,
'ternary_operator_spaces' => true, 'ternary_operator_spaces' => true,
'ternary_to_null_coalescing' => false, // Cannot use that with PHP 5.6
'trailing_comma_in_multiline_array' => true, 'trailing_comma_in_multiline_array' => true,
'trim_array_spaces' => true, 'trim_array_spaces' => true,
'unary_operator_spaces' => true, 'unary_operator_spaces' => true,

View File

@ -1,4 +1,6 @@
language: php language: php
dist: trusty
sudo: false
php: php:
- 5.6 - 5.6
@ -11,7 +13,6 @@ matrix:
- php: 7.0 - php: 7.0
env: COVERAGE=1 env: COVERAGE=1
allow_failures: allow_failures:
- php: 7.1
- php: hhvm - php: hhvm
cache: cache:

1626
CHANGELOG.PHPExcel.md Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -34,14 +34,10 @@ PhpSpreadsheet is a library written in pure PHP and providing a set of classes t
## Requirements ## Requirements
* PHP version 5.6 or higher * PHP version 5.6 or higher
* PHP extension php_zip enabled (required if you need PhpSpreadsheet to handle .xlsx .ods or .gnumeric files) * PHP extension php_zip enabled
* PHP extension php_xml enabled * PHP extension php_xml enabled
* PHP extension php_gd2 enabled (optional, but required for exact column width autocalculation) * PHP extension php_gd2 enabled (optional, but required for exact column width autocalculation)
*Note:* PHP 5.6.29 has [a bug](https://bugs.php.net/bug.php?id=735300) that
prevents SQLite3 caching to work correctly. Use a newer (or older) versions of
PHP if you need SQLite3 caching.
## PHP version support ## PHP version support
Support for PHP versions will only be maintained for a period of six months beyond the end-of-life of that PHP version Support for PHP versions will only be maintained for a period of six months beyond the end-of-life of that PHP version

View File

@ -27,18 +27,19 @@
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-iconv": "*", "ext-iconv": "*",
"ext-xml": "*", "ext-xml": "*",
"ext-xmlwriter": "*" "ext-xmlwriter": "*",
"ext-zip": "*",
"psr/simple-cache": "^1.0"
}, },
"require-dev": { "require-dev": {
"dompdf/dompdf": "^0.7.0",
"mpdf/mpdf": "^6.1", "mpdf/mpdf": "^6.1",
"tecnickcom/tcpdf": "^6.2", "tecnickcom/tcpdf": "^6.2",
"squizlabs/php_codesniffer": "^2.7", "squizlabs/php_codesniffer": "^2.7",
"phpunit/phpunit": "^5.7", "phpunit/phpunit": "^5.7",
"friendsofphp/php-cs-fixer": "^2.0" "friendsofphp/php-cs-fixer": "^2.0",
"dompdf/dompdf": "^0.8.0"
}, },
"suggest": { "suggest": {
"ext-zip": "Required to handle .xlsx .ods or .gnumeric files",
"ext-gd": "Required for exact column width autocalculation", "ext-gd": "Required for exact column width autocalculation",
"ext-dom": "Option to read and write HTML files", "ext-dom": "Option to read and write HTML files",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer", "mpdf/mpdf": "Option for rendering PDF with PDF Writer",

559
composer.lock generated
View File

@ -4,8 +4,57 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "97eae2a53946fe7524d2f8840bcc791e", "content-hash": "81b6f3fcd32849e29ea13dd37c9af17f",
"packages": [], "packages": [
{
"name": "psr/simple-cache",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/simple-cache.git",
"reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
"reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\SimpleCache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interfaces for simple caching",
"keywords": [
"cache",
"caching",
"psr",
"psr-16",
"simple-cache"
],
"time": "2017-01-02T13:31:39+00:00"
}
],
"packages-dev": [ "packages-dev": [
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
@ -63,28 +112,29 @@
}, },
{ {
"name": "dompdf/dompdf", "name": "dompdf/dompdf",
"version": "v0.7.0", "version": "v0.8.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/dompdf/dompdf.git", "url": "https://github.com/dompdf/dompdf.git",
"reference": "5c98652b1a5beb7e3cc8ec35419b2828dd63ab14" "reference": "0f418c6b58fdeafc2a0e80eb1fa5e644e185089c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/dompdf/dompdf/zipball/5c98652b1a5beb7e3cc8ec35419b2828dd63ab14", "url": "https://api.github.com/repos/dompdf/dompdf/zipball/0f418c6b58fdeafc2a0e80eb1fa5e644e185089c",
"reference": "5c98652b1a5beb7e3cc8ec35419b2828dd63ab14", "reference": "0f418c6b58fdeafc2a0e80eb1fa5e644e185089c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-gd": "*", "ext-gd": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"phenx/php-font-lib": "0.4.*", "phenx/php-font-lib": "0.5.*",
"phenx/php-svg-lib": "0.1.*", "phenx/php-svg-lib": "0.2.*",
"php": ">=5.3.0" "php": ">=5.3.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "3.7.*" "phpunit/phpunit": "4.8.*",
"squizlabs/php_codesniffer": "2.*"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -120,20 +170,20 @@
], ],
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
"homepage": "https://github.com/dompdf/dompdf", "homepage": "https://github.com/dompdf/dompdf",
"time": "2016-05-11T00:36:29+00:00" "time": "2017-02-16T02:40:40+00:00"
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v2.0.0", "version": "v2.1.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
"reference": "f3baf72eb2f58bf275b372540f5b47d25aed910f" "reference": "c7de769d7b44f2c9de68e1f678b65efd8126f60b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/f3baf72eb2f58bf275b372540f5b47d25aed910f", "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c7de769d7b44f2c9de68e1f678b65efd8126f60b",
"reference": "f3baf72eb2f58bf275b372540f5b47d25aed910f", "reference": "c7de769d7b44f2c9de68e1f678b65efd8126f60b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -145,6 +195,8 @@
"symfony/filesystem": "^2.4 || ^3.0", "symfony/filesystem": "^2.4 || ^3.0",
"symfony/finder": "^2.2 || ^3.0", "symfony/finder": "^2.2 || ^3.0",
"symfony/polyfill-php54": "^1.0", "symfony/polyfill-php54": "^1.0",
"symfony/polyfill-php55": "^1.3",
"symfony/polyfill-xml": "^1.3",
"symfony/process": "^2.3 || ^3.0", "symfony/process": "^2.3 || ^3.0",
"symfony/stopwatch": "^2.5 || ^3.0" "symfony/stopwatch": "^2.5 || ^3.0"
}, },
@ -153,18 +205,18 @@
}, },
"require-dev": { "require-dev": {
"gecko-packages/gecko-php-unit": "^2.0", "gecko-packages/gecko-php-unit": "^2.0",
"phpunit/phpunit": "^4.5|^5", "justinrainbow/json-schema": "^5.0",
"satooshi/php-coveralls": "^1.0" "phpunit/phpunit": "^4.5 || ^5.0",
"satooshi/php-coveralls": "^1.0",
"symfony/phpunit-bridge": "^3.2"
},
"suggest": {
"ext-xml": "For better performance."
}, },
"bin": [ "bin": [
"php-cs-fixer" "php-cs-fixer"
], ],
"type": "application", "type": "application",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"PhpCsFixer\\": "src/" "PhpCsFixer\\": "src/"
@ -185,7 +237,49 @@
} }
], ],
"description": "A tool to automatically fix PHP code style", "description": "A tool to automatically fix PHP code style",
"time": "2016-12-01T06:18:06+00:00" "time": "2017-03-15T17:13:07+00:00"
},
{
"name": "ircmaxell/password-compat",
"version": "v1.0.4",
"source": {
"type": "git",
"url": "https://github.com/ircmaxell/password_compat.git",
"reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c",
"reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c",
"shasum": ""
},
"require-dev": {
"phpunit/phpunit": "4.*"
},
"type": "library",
"autoload": {
"files": [
"lib/password.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Anthony Ferrara",
"email": "ircmaxell@php.net",
"homepage": "http://blog.ircmaxell.com"
}
],
"description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
"homepage": "https://github.com/ircmaxell/password_compat",
"keywords": [
"hashing",
"password"
],
"time": "2014-11-20T16:49:30+00:00"
}, },
{ {
"name": "mpdf/mpdf", "name": "mpdf/mpdf",
@ -240,16 +334,16 @@
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.5.5", "version": "1.6.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108" "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe",
"reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108", "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -278,26 +372,29 @@
"object", "object",
"object graph" "object graph"
], ],
"time": "2016-10-31T17:19:45+00:00" "time": "2017-01-26T22:05:40+00:00"
}, },
{ {
"name": "phenx/php-font-lib", "name": "phenx/php-font-lib",
"version": "0.4", "version": "0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PhenX/php-font-lib.git", "url": "https://github.com/PhenX/php-font-lib.git",
"reference": "b8af0cacdc3cbf1e41a586fcb78f506f4121a088" "reference": "19ad2bebc35be028fcc0221025fcbf3d436a3962"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/b8af0cacdc3cbf1e41a586fcb78f506f4121a088", "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/19ad2bebc35be028fcc0221025fcbf3d436a3962",
"reference": "b8af0cacdc3cbf1e41a586fcb78f506f4121a088", "reference": "19ad2bebc35be028fcc0221025fcbf3d436a3962",
"shasum": "" "shasum": ""
}, },
"require-dev": {
"phpunit/phpunit": "^4.8"
},
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-0": { "psr-4": {
"FontLib\\": "src/" "FontLib\\": "src/FontLib"
} }
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@ -312,22 +409,25 @@
], ],
"description": "A library to read, parse, export and make subsets of different types of font files.", "description": "A library to read, parse, export and make subsets of different types of font files.",
"homepage": "https://github.com/PhenX/php-font-lib", "homepage": "https://github.com/PhenX/php-font-lib",
"time": "2015-05-06T20:02:39+00:00" "time": "2017-02-11T10:58:43+00:00"
}, },
{ {
"name": "phenx/php-svg-lib", "name": "phenx/php-svg-lib",
"version": "0.1", "version": "v0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PhenX/php-svg-lib.git", "url": "https://github.com/PhenX/php-svg-lib.git",
"reference": "b419766515b3426c6da74b0e29e93d71c4f17099" "reference": "de291bec8449b89acfe85691b5c71434797959dc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/b419766515b3426c6da74b0e29e93d71c4f17099", "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/de291bec8449b89acfe85691b5c71434797959dc",
"reference": "b419766515b3426c6da74b0e29e93d71c4f17099", "reference": "de291bec8449b89acfe85691b5c71434797959dc",
"shasum": "" "shasum": ""
}, },
"require": {
"sabberworm/php-css-parser": "6.0.*"
},
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-0": { "psr-0": {
@ -346,7 +446,7 @@
], ],
"description": "A library to read, parse and export to PDF SVG files.", "description": "A library to read, parse and export to PDF SVG files.",
"homepage": "https://github.com/PhenX/php-svg-lib", "homepage": "https://github.com/PhenX/php-svg-lib",
"time": "2015-05-06T18:49:49+00:00" "time": "2016-12-13T20:25:45+00:00"
}, },
{ {
"name": "phpdocumentor/reflection-common", "name": "phpdocumentor/reflection-common",
@ -496,27 +596,27 @@
}, },
{ {
"name": "phpspec/prophecy", "name": "phpspec/prophecy",
"version": "v1.6.2", "version": "v1.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpspec/prophecy.git", "url": "https://github.com/phpspec/prophecy.git",
"reference": "6c52c2722f8460122f96f86346600e1077ce22cb" "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
"reference": "6c52c2722f8460122f96f86346600e1077ce22cb", "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/instantiator": "^1.0.2", "doctrine/instantiator": "^1.0.2",
"php": "^5.3|^7.0", "php": "^5.3|^7.0",
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
"sebastian/comparator": "^1.1", "sebastian/comparator": "^1.1|^2.0",
"sebastian/recursion-context": "^1.0|^2.0" "sebastian/recursion-context": "^1.0|^2.0|^3.0"
}, },
"require-dev": { "require-dev": {
"phpspec/phpspec": "^2.0", "phpspec/phpspec": "^2.5|^3.2",
"phpunit/phpunit": "^4.8 || ^5.6.5" "phpunit/phpunit": "^4.8 || ^5.6.5"
}, },
"type": "library", "type": "library",
@ -555,39 +655,39 @@
"spy", "spy",
"stub" "stub"
], ],
"time": "2016-11-21T14:58:47+00:00" "time": "2017-03-02T20:05:34+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "4.0.5", "version": "4.0.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "c19cfc7cbb0e9338d8c469c7eedecc2a428b0971" "reference": "09e2277d14ea467e5a984010f501343ef29ffc69"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c19cfc7cbb0e9338d8c469c7eedecc2a428b0971", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/09e2277d14ea467e5a984010f501343ef29ffc69",
"reference": "c19cfc7cbb0e9338d8c469c7eedecc2a428b0971", "reference": "09e2277d14ea467e5a984010f501343ef29ffc69",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*",
"ext-xmlwriter": "*",
"php": "^5.6 || ^7.0", "php": "^5.6 || ^7.0",
"phpunit/php-file-iterator": "~1.3", "phpunit/php-file-iterator": "^1.3",
"phpunit/php-text-template": "~1.2", "phpunit/php-text-template": "^1.2",
"phpunit/php-token-stream": "^1.4.2", "phpunit/php-token-stream": "^1.4.2 || ^2.0",
"sebastian/code-unit-reverse-lookup": "~1.0", "sebastian/code-unit-reverse-lookup": "^1.0",
"sebastian/environment": "^1.3.2 || ^2.0", "sebastian/environment": "^1.3.2 || ^2.0",
"sebastian/version": "~1.0|~2.0" "sebastian/version": "^1.0 || ^2.0"
}, },
"require-dev": { "require-dev": {
"ext-xdebug": ">=2.1.4", "ext-xdebug": "^2.1.4",
"phpunit/phpunit": "^5.4" "phpunit/phpunit": "^5.7"
}, },
"suggest": { "suggest": {
"ext-dom": "*", "ext-xdebug": "^2.5.1"
"ext-xdebug": ">=2.4.0",
"ext-xmlwriter": "*"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -618,7 +718,7 @@
"testing", "testing",
"xunit" "xunit"
], ],
"time": "2017-01-20T15:06:43+00:00" "time": "2017-03-01T09:12:17+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -710,25 +810,30 @@
}, },
{ {
"name": "phpunit/php-timer", "name": "phpunit/php-timer",
"version": "1.0.8", "version": "1.0.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git", "url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3.3" "php": "^5.3.3 || ^7.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~4|~5" "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": { "autoload": {
"classmap": [ "classmap": [
"src/" "src/"
@ -750,20 +855,20 @@
"keywords": [ "keywords": [
"timer" "timer"
], ],
"time": "2016-05-12T18:03:57+00:00" "time": "2017-02-26T11:10:40+00:00"
}, },
{ {
"name": "phpunit/php-token-stream", "name": "phpunit/php-token-stream",
"version": "1.4.9", "version": "1.4.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git", "url": "https://github.com/sebastianbergmann/php-token-stream.git",
"reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
"reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -799,20 +904,20 @@
"keywords": [ "keywords": [
"tokenizer" "tokenizer"
], ],
"time": "2016-11-15T14:06:22+00:00" "time": "2017-02-27T10:12:30+00:00"
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "5.7.6", "version": "5.7.17",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "caf8141b89691498d91aaac6c82e9cd5f685ae86" "reference": "68752b665d3875f9a38a357e3ecb35c79f8673bf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/caf8141b89691498d91aaac6c82e9cd5f685ae86", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/68752b665d3875f9a38a357e3ecb35c79f8673bf",
"reference": "caf8141b89691498d91aaac6c82e9cd5f685ae86", "reference": "68752b665d3875f9a38a357e3ecb35c79f8673bf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -829,14 +934,14 @@
"phpunit/php-text-template": "~1.2", "phpunit/php-text-template": "~1.2",
"phpunit/php-timer": "^1.0.6", "phpunit/php-timer": "^1.0.6",
"phpunit/phpunit-mock-objects": "^3.2", "phpunit/phpunit-mock-objects": "^3.2",
"sebastian/comparator": "~1.2.2", "sebastian/comparator": "^1.2.4",
"sebastian/diff": "~1.2", "sebastian/diff": "~1.2",
"sebastian/environment": "^1.3.4 || ^2.0", "sebastian/environment": "^1.3.4 || ^2.0",
"sebastian/exporter": "~2.0", "sebastian/exporter": "~2.0",
"sebastian/global-state": "^1.0 || ^2.0", "sebastian/global-state": "^1.1",
"sebastian/object-enumerator": "~2.0", "sebastian/object-enumerator": "~2.0",
"sebastian/resource-operations": "~1.0", "sebastian/resource-operations": "~1.0",
"sebastian/version": "~1.0|~2.0", "sebastian/version": "~1.0.3|~2.0",
"symfony/yaml": "~2.1|~3.0" "symfony/yaml": "~2.1|~3.0"
}, },
"conflict": { "conflict": {
@ -881,7 +986,7 @@
"testing", "testing",
"xunit" "xunit"
], ],
"time": "2017-01-22T08:39:59+00:00" "time": "2017-03-19T16:52:12+00:00"
}, },
{ {
"name": "phpunit/phpunit-mock-objects", "name": "phpunit/phpunit-mock-objects",
@ -990,24 +1095,65 @@
"time": "2016-10-10T12:19:37+00:00" "time": "2016-10-10T12:19:37+00:00"
}, },
{ {
"name": "sebastian/code-unit-reverse-lookup", "name": "sabberworm/php-css-parser",
"version": "1.0.0", "version": "6.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
"reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" "reference": "9ea4b00c569b19f731d0c2e0e802055877ff40c2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/9ea4b00c569b19f731d0c2e0e802055877ff40c2",
"reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", "reference": "9ea4b00c569b19f731d0c2e0e802055877ff40c2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.6" "php": ">=5.3.2"
},
"type": "library",
"autoload": {
"psr-0": {
"Sabberworm\\CSS": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Raphael Schweikert"
}
],
"description": "Parser for CSS Files written in PHP",
"homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
"keywords": [
"css",
"parser",
"stylesheet"
],
"time": "2015-08-24T08:48:52+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
"reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
"reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
"shasum": ""
},
"require": {
"php": "^5.6 || ^7.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~5" "phpunit/phpunit": "^5.7 || ^6.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -1032,20 +1178,20 @@
], ],
"description": "Looks up which function or method a line of code belongs to", "description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"time": "2016-02-13T06:45:14+00:00" "time": "2017-03-04T06:30:41+00:00"
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "1.2.2", "version": "1.2.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
"reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1096,7 +1242,7 @@
"compare", "compare",
"equality" "equality"
], ],
"time": "2016-11-19T09:18:40+00:00" "time": "2017-01-29T09:50:25+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
@ -1320,16 +1466,16 @@
}, },
{ {
"name": "sebastian/object-enumerator", "name": "sebastian/object-enumerator",
"version": "2.0.0", "version": "2.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git", "url": "https://github.com/sebastianbergmann/object-enumerator.git",
"reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35" "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
"reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1362,7 +1508,7 @@
], ],
"description": "Traverses array structures and object graphs to enumerate all referenced objects", "description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/", "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"time": "2016-11-19T07:35:10+00:00" "time": "2017-02-18T15:18:39+00:00"
}, },
{ {
"name": "sebastian/recursion-context", "name": "sebastian/recursion-context",
@ -1553,16 +1699,16 @@
}, },
{ {
"name": "squizlabs/php_codesniffer", "name": "squizlabs/php_codesniffer",
"version": "2.7.1", "version": "2.8.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
"reference": "9b324f3a1132459a7274a0ace2e1b766ba80930f" "reference": "d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9b324f3a1132459a7274a0ace2e1b766ba80930f", "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d",
"reference": "9b324f3a1132459a7274a0ace2e1b766ba80930f", "reference": "d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1627,20 +1773,20 @@
"phpcs", "phpcs",
"standards" "standards"
], ],
"time": "2016-11-30T04:02:31+00:00" "time": "2017-03-01T22:17:45+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "4f9e449e76996adf310498a8ca955c6deebe29dd" "reference": "28fb243a2b5727774ca309ec2d92da240f1af0dd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/4f9e449e76996adf310498a8ca955c6deebe29dd", "url": "https://api.github.com/repos/symfony/console/zipball/28fb243a2b5727774ca309ec2d92da240f1af0dd",
"reference": "4f9e449e76996adf310498a8ca955c6deebe29dd", "reference": "28fb243a2b5727774ca309ec2d92da240f1af0dd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1690,20 +1836,20 @@
], ],
"description": "Symfony Console Component", "description": "Symfony Console Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-08T20:47:33+00:00" "time": "2017-03-06T19:30:27+00:00"
}, },
{ {
"name": "symfony/debug", "name": "symfony/debug",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/debug.git", "url": "https://github.com/symfony/debug.git",
"reference": "810ba5c1c5352a4ddb15d4719e8936751dff0b05" "reference": "b90c9f91ad8ac37d9f114e369042d3226b34dc1a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/debug/zipball/810ba5c1c5352a4ddb15d4719e8936751dff0b05", "url": "https://api.github.com/repos/symfony/debug/zipball/b90c9f91ad8ac37d9f114e369042d3226b34dc1a",
"reference": "810ba5c1c5352a4ddb15d4719e8936751dff0b05", "reference": "b90c9f91ad8ac37d9f114e369042d3226b34dc1a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1747,20 +1893,20 @@
], ],
"description": "Symfony Debug Component", "description": "Symfony Debug Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-02T20:32:22+00:00" "time": "2017-02-18T17:28:00+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "9137eb3a3328e413212826d63eeeb0217836e2b6" "reference": "b7a1b9e0a0f623ce43b4c8d775eb138f190c9d8d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9137eb3a3328e413212826d63eeeb0217836e2b6", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7a1b9e0a0f623ce43b4c8d775eb138f190c9d8d",
"reference": "9137eb3a3328e413212826d63eeeb0217836e2b6", "reference": "b7a1b9e0a0f623ce43b4c8d775eb138f190c9d8d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1807,20 +1953,20 @@
], ],
"description": "Symfony EventDispatcher Component", "description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-02T20:32:22+00:00" "time": "2017-02-21T09:12:04+00:00"
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4" "reference": "bc0f17bed914df2cceb989972c3b996043c4da4a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/a0c6ef2dc78d33b58d91d3a49f49797a184d06f4", "url": "https://api.github.com/repos/symfony/filesystem/zipball/bc0f17bed914df2cceb989972c3b996043c4da4a",
"reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4", "reference": "bc0f17bed914df2cceb989972c3b996043c4da4a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1856,20 +2002,20 @@
], ],
"description": "Symfony Filesystem Component", "description": "Symfony Filesystem Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-08T20:47:33+00:00" "time": "2017-03-06T19:30:27+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "8c71141cae8e2957946b403cc71a67213c0380d6" "reference": "92d7476d2df60cd851a3e13e078664b1deb8ce10"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/8c71141cae8e2957946b403cc71a67213c0380d6", "url": "https://api.github.com/repos/symfony/finder/zipball/92d7476d2df60cd851a3e13e078664b1deb8ce10",
"reference": "8c71141cae8e2957946b403cc71a67213c0380d6", "reference": "92d7476d2df60cd851a3e13e078664b1deb8ce10",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1905,7 +2051,7 @@
], ],
"description": "Symfony Finder Component", "description": "Symfony Finder Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-02T20:32:22+00:00" "time": "2017-02-21T09:12:04+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
@ -2025,17 +2171,131 @@
"time": "2016-11-14T01:06:16+00:00" "time": "2016-11-14T01:06:16+00:00"
}, },
{ {
"name": "symfony/process", "name": "symfony/polyfill-php55",
"version": "v3.2.2", "version": "v1.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/polyfill-php55.git",
"reference": "350e810019fc52dd06ae844b6a6d382f8a0e8893" "reference": "03e3f0350bca2220e3623a0e340eef194405fc67"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/350e810019fc52dd06ae844b6a6d382f8a0e8893", "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67",
"reference": "350e810019fc52dd06ae844b6a6d382f8a0e8893", "reference": "03e3f0350bca2220e3623a0e340eef194405fc67",
"shasum": ""
},
"require": {
"ircmaxell/password-compat": "~1.0",
"php": ">=5.3.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.3-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Polyfill\\Php55\\": ""
},
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"time": "2016-11-14T01:06:16+00:00"
},
{
"name": "symfony/polyfill-xml",
"version": "v1.3.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-xml.git",
"reference": "64b6a864f18ab4fddad49f5025f805f6781dfabd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-xml/zipball/64b6a864f18ab4fddad49f5025f805f6781dfabd",
"reference": "64b6a864f18ab4fddad49f5025f805f6781dfabd",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"suggest": {
"ext-xml": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.3-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Polyfill\\Xml\\": ""
},
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for xml's utf8_encode and utf8_decode functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"time": "2016-11-14T01:06:16+00:00"
},
{
"name": "symfony/process",
"version": "v3.2.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "68bfa8c83f24c0ac04ea7193bcdcda4519f41892"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/68bfa8c83f24c0ac04ea7193bcdcda4519f41892",
"reference": "68bfa8c83f24c0ac04ea7193bcdcda4519f41892",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2071,20 +2331,20 @@
], ],
"description": "Symfony Process Component", "description": "Symfony Process Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-02T20:32:22+00:00" "time": "2017-03-04T12:23:14+00:00"
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "9aa0b51889c01bca474853ef76e9394b02264464" "reference": "c5ee0f8650c84b4d36a5f76b3b504233feaabf75"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/9aa0b51889c01bca474853ef76e9394b02264464", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/c5ee0f8650c84b4d36a5f76b3b504233feaabf75",
"reference": "9aa0b51889c01bca474853ef76e9394b02264464", "reference": "c5ee0f8650c84b4d36a5f76b3b504233feaabf75",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2120,20 +2380,20 @@
], ],
"description": "Symfony Stopwatch Component", "description": "Symfony Stopwatch Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-02T20:32:22+00:00" "time": "2017-02-18T17:28:00+00:00"
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v3.2.2", "version": "v3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "50eadbd7926e31842893c957eca362b21592a97d" "reference": "093e416ad096355149e265ea2e4cc1f9ee40ab1a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/50eadbd7926e31842893c957eca362b21592a97d", "url": "https://api.github.com/repos/symfony/yaml/zipball/093e416ad096355149e265ea2e4cc1f9ee40ab1a",
"reference": "50eadbd7926e31842893c957eca362b21592a97d", "reference": "093e416ad096355149e265ea2e4cc1f9ee40ab1a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2175,7 +2435,7 @@
], ],
"description": "Symfony Yaml Component", "description": "Symfony Yaml Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2017-01-03T13:51:32+00:00" "time": "2017-03-07T16:47:02+00:00"
}, },
{ {
"name": "tecnickcom/tcpdf", "name": "tecnickcom/tcpdf",
@ -2301,7 +2561,8 @@
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-iconv": "*", "ext-iconv": "*",
"ext-xml": "*", "ext-xml": "*",
"ext-xmlwriter": "*" "ext-xmlwriter": "*",
"ext-zip": "*"
}, },
"platform-dev": [] "platform-dev": []
} }

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Returns the average of selected database entries.</h2> <h2>Returns the average of selected database entries.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Counts the cells that contain numbers in a database.</h2> <h2>Counts the cells that contain numbers in a database.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Extracts a single value from a column of a list or database that matches conditions that you specify.</h2> <h2>Extracts a single value from a column of a list or database that matches conditions that you specify.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Returns the maximum value from selected database entries.</h2> <h2>Returns the maximum value from selected database entries.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */
include 'PHPExcel.php';
// Create new PhpSpreadsheet object // Create new PhpSpreadsheet object
$spreadsheet = new PHPExcel(); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Returns the minimum value from selected database entries.</h2> <h2>Returns the minimum value from selected database entries.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */
include 'PHPExcel.php';
// Create new PhpSpreadsheet object // Create new PhpSpreadsheet object
$spreadsheet = new PHPExcel(); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Multiplies the values in a column of a list or database that match conditions that you specify.</h2> <h2>Multiplies the values in a column of a list or database that match conditions that you specify.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */
include 'PHPExcel.php';
// Create new PhpSpreadsheet object // Create new PhpSpreadsheet object
$spreadsheet = new PHPExcel(); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Estimates the standard deviation based on a sample of selected database entries.</h2> <h2>Estimates the standard deviation based on a sample of selected database entries.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */
include 'PHPExcel.php';
// Create new PhpSpreadsheet object // Create new PhpSpreadsheet object
$spreadsheet = new PHPExcel(); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Calculates the standard deviation based on the entire population of selected database entries.</h2> <h2>Calculates the standard deviation based on the entire population of selected database entries.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */
include 'PHPExcel.php';
// Create new PhpSpreadsheet object // Create new PhpSpreadsheet object
$spreadsheet = new PHPExcel(); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Estimates variance based on a sample from selected database entries.</h2> <h2>Estimates variance based on a sample from selected database entries.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PhpSpreadsheet */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PhpSpreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -10,7 +10,7 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Calculation Examples</title> <title>PhpSpreadsheet Calculation Examples</title>
</head> </head>
<body> <body>
@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Calculates variance based on the entire population of selected database entries,</h2> <h2>Calculates variance based on the entire population of selected database entries,</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PHPExcel */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data

View File

@ -10,7 +10,7 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Calculation Examples</title> <title>PhpSpreadsheet Calculation Examples</title>
</head> </head>
<body> <body>
@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Returns the serial number of a particular date.</h2> <h2>Returns the serial number of a particular date.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PHPExcel */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data
@ -76,4 +72,6 @@ echo '<hr />';
echo '</tr>'; echo '</tr>';
} }
?> ?>
</table> </table>
</body>
</html>

View File

@ -10,7 +10,7 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Calculation Examples</title> <title>PhpSpreadsheet Calculation Examples</title>
</head> </head>
<body> <body>
@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Converts a date in the form of text to a serial number.</h2> <h2>Converts a date in the form of text to a serial number.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PHPExcel */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data
@ -51,7 +47,7 @@ echo '<hr />';
// Test the formulae // Test the formulae
?> ?>
<p><strong>Warning: </strong>The PHPExcel DATEVALUE() function accepts a wider range of date formats than MS Excel's DATEFORMAT() function.</p> <p><strong>Warning: </strong>The PhpSpreadsheet DATEVALUE() function accepts a wider range of date formats than MS Excel's DATEFORMAT() function.</p>
<table border="1" cellspacing="0"> <table border="1" cellspacing="0">
<tr> <tr>
<th>Date String</th> <th>Date String</th>
@ -69,4 +65,6 @@ echo '<hr />';
echo '</tr>'; echo '</tr>';
} }
?> ?>
</table> </table>
</body>
</html>

View File

@ -10,7 +10,7 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Calculation Examples</title> <title>PhpSpreadsheet Calculation Examples</title>
</head> </head>
<body> <body>
@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Returns the serial number of a particular time.</h2> <h2>Returns the serial number of a particular time.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PHPExcel */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data
@ -74,4 +70,6 @@ echo '<hr />';
echo '</tr>'; echo '</tr>';
} }
?> ?>
</table> </table>
</body>
</html>

View File

@ -10,7 +10,7 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Calculation Examples</title> <title>PhpSpreadsheet Calculation Examples</title>
</head> </head>
<body> <body>
@ -19,14 +19,10 @@ date_default_timezone_set('Europe/London');
<h2>Converts a time in the form of text to a serial number.</h2> <h2>Converts a time in the form of text to a serial number.</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../../Classes/');
/** Include PHPExcel */ // Create new PhpSpreadsheet object
include 'PHPExcel.php'; $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Create new PHPExcel object
$spreadsheet = new PHPExcel();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
// Add some data // Add some data
@ -65,4 +61,6 @@ echo '<hr />';
echo '</tr>'; echo '</tr>';
} }
?> ?>
</table> </table>
</body>
</html>

View File

@ -10,14 +10,14 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Calculation Function Examples</title> <title>PhpSpreadsheet Calculation Function Examples</title>
</head> </head>
<body> <body>
<?php <?php
echo '<h1>PHPExcel Calculation Function Examples</h1>'; echo '<h1>PhpSpreadsheet Calculation Function Examples</h1>';
$exampleTypeList = glob('./*', GLOB_ONLYDIR); $exampleTypeList = glob('./*', GLOB_ONLYDIR);

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #01</title> <title>PhpSpreadsheet Reader Example #01</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #01</h1> <h1>PhpSpreadsheet Reader Example #01</h1>
<h2>Simple File Reader using \PhpOffice\PhpSpreadsheet\IOFactory::load()</h2> <h2>Simple File Reader using \PhpOffice\PhpSpreadsheet\IOFactory::load()</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileName = './sampleData/example1.xls'; $inputFileName = './sampleData/example1.xls';
echo 'Loading file ',pathinfo($inputFileName, PATHINFO_BASENAME),' using IOFactory to identify the format<br />'; echo 'Loading file ',pathinfo($inputFileName, PATHINFO_BASENAME),' using IOFactory to identify the format<br />';

View File

@ -5,23 +5,19 @@ set_time_limit(0);
date_default_timezone_set('Europe/London'); date_default_timezone_set('Europe/London');
/* Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
?> ?>
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #02</title> <title>PhpSpreadsheet Reader Example #02</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #02</h1> <h1>PhpSpreadsheet Reader Example #02</h1>
<h2>Simple File Reader using a Specified Reader</h2> <h2>Simple File Reader using a Specified Reader</h2>
<?php <?php

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #03</title> <title>PhpSpreadsheet Reader Example #03</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #03</h1> <h1>PhpSpreadsheet Reader Example #03</h1>
<h2>Simple File Reader using the \PhpOffice\PhpSpreadsheet\IOFactory to Return a Reader</h2> <h2>Simple File Reader using the \PhpOffice\PhpSpreadsheet\IOFactory to Return a Reader</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #04</title> <title>PhpSpreadsheet Reader Example #04</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #04</h1> <h1>PhpSpreadsheet Reader Example #04</h1>
<h2>Simple File Reader using the \PhpOffice\PhpSpreadsheet\IOFactory to Identify a Reader to Use</h2> <h2>Simple File Reader using the \PhpOffice\PhpSpreadsheet\IOFactory to Identify a Reader to Use</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileName = './sampleData/example1.xls'; $inputFileName = './sampleData/example1.xls';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #05</title> <title>PhpSpreadsheet Reader Example #05</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #05</h1> <h1>PhpSpreadsheet Reader Example #05</h1>
<h2>Simple File Reader using the "Read Data Only" Option</h2> <h2>Simple File Reader using the "Read Data Only" Option</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #06</title> <title>PhpSpreadsheet Reader Example #06</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #06</h1> <h1>PhpSpreadsheet Reader Example #06</h1>
<h2>Simple File Reader Loading All WorkSheets</h2> <h2>Simple File Reader Loading All WorkSheets</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #07</title> <title>PhpSpreadsheet Reader Example #07</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #07</h1> <h1>PhpSpreadsheet Reader Example #07</h1>
<h2>Simple File Reader Loading a Single Named WorkSheet</h2> <h2>Simple File Reader Loading a Single Named WorkSheet</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #08</title> <title>PhpSpreadsheet Reader Example #08</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #08</h1> <h1>PhpSpreadsheet Reader Example #08</h1>
<h2>Simple File Reader Loading Several Named WorkSheets</h2> <h2>Simple File Reader Loading Several Named WorkSheets</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #09</title> <title>PhpSpreadsheet Reader Example #09</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #09</h1> <h1>PhpSpreadsheet Reader Example #09</h1>
<h2>Simple File Reader Using a Read Filter</h2> <h2>Simple File Reader Using a Read Filter</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #10</title> <title>PhpSpreadsheet Reader Example #10</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #10</h1> <h1>PhpSpreadsheet Reader Example #10</h1>
<h2>Simple File Reader Using a Configurable Read Filter</h2> <h2>Simple File Reader Using a Configurable Read Filter</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #11</title> <title>PhpSpreadsheet Reader Example #11</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #11</h1> <h1>PhpSpreadsheet Reader Example #11</h1>
<h2>Reading a Workbook in "Chunks" Using a Configurable Read Filter (Version 1)</h2> <h2>Reading a Workbook in "Chunks" Using a Configurable Read Filter (Version 1)</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';
@ -78,7 +74,7 @@ for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
$chunkFilter = new chunkReadFilter($startRow, $chunkSize); $chunkFilter = new chunkReadFilter($startRow, $chunkSize);
/* Tell the Reader that we want to use the new Read Filter that we've just Instantiated **/ /* Tell the Reader that we want to use the new Read Filter that we've just Instantiated **/
$reader->setReadFilter($chunkFilter); $reader->setReadFilter($chunkFilter);
/* Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/ /* Load only the rows that match our filter from $inputFileName to a PhpSpreadsheet Object **/
$spreadsheet = $reader->load($inputFileName); $spreadsheet = $reader->load($inputFileName);
// Do some processing here // Do some processing here

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #12</title> <title>PhpSpreadsheet Reader Example #12</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #12</h1> <h1>PhpSpreadsheet Reader Example #12</h1>
<h2>Reading a Workbook in "Chunks" Using a Configurable Read Filter (Version 2)</h2> <h2>Reading a Workbook in "Chunks" Using a Configurable Read Filter (Version 2)</h2>
<?php <?php
/** Set Include path to point at the PHPExcel Classes folder **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** Include \PhpOffice\PhpSpreadsheet\IOFactory **/
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';
@ -81,7 +77,7 @@ for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ', $startRow, ' to ', ($startRow + $chunkSize - 1), '<br />'; echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ', $startRow, ' to ', ($startRow + $chunkSize - 1), '<br />';
/* Tell the Read Filter, the limits on which rows we want to read this iteration **/ /* Tell the Read Filter, the limits on which rows we want to read this iteration **/
$chunkFilter->setRows($startRow, $chunkSize); $chunkFilter->setRows($startRow, $chunkSize);
/* Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/ /* Load only the rows that match our filter from $inputFileName to a PhpSpreadsheet Object **/
$spreadsheet = $reader->load($inputFileName); $spreadsheet = $reader->load($inputFileName);
// Do some processing here // Do some processing here

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #13</title> <title>PhpSpreadsheet Reader Example #13</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #13</h1> <h1>PhpSpreadsheet Reader Example #13</h1>
<h2>Simple File Reader for Multiple CSV Files</h2> <h2>Simple File Reader for Multiple CSV Files</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Csv'; $inputFileType = 'Csv';
$inputFileNames = ['./sampleData/example1.csv', './sampleData/example2.csv']; $inputFileNames = ['./sampleData/example1.csv', './sampleData/example2.csv'];

View File

@ -1,24 +1,25 @@
<?php <?php
error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set('Europe/London');
?> ?>
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #15</title> <title>PhpSpreadsheet Reader Example #14</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #14</h1> <h1>PhpSpreadsheet Reader Example #14</h1>
<h2>Reading a Large CSV file in "Chunks" to split across multiple Worksheets</h2> <h2>Reading a Large CSV file in "Chunks" to split across multiple Worksheets</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Csv'; $inputFileType = 'Csv';
$inputFileName = './sampleData/example2.csv'; $inputFileName = './sampleData/example2.csv';
@ -69,8 +70,8 @@ $chunkFilter = new chunkReadFilter();
$reader->setReadFilter($chunkFilter) $reader->setReadFilter($chunkFilter)
->setContiguous(true); ->setContiguous(true);
/* Instantiate a new PHPExcel object manually **/ /* Instantiate a new PhpSpreadsheet object manually **/
$spreadsheet = new PHPExcel(); $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
/* Set a sheet index **/ /* Set a sheet index **/
$sheet = 0; $sheet = 0;
@ -83,7 +84,7 @@ for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
/* Increment the worksheet index pointer for the Reader **/ /* Increment the worksheet index pointer for the Reader **/
$reader->setSheetIndex($sheet); $reader->setSheetIndex($sheet);
/* Load only the rows that match our filter into a new worksheet in the PHPExcel Object **/ /* Load only the rows that match our filter into a new worksheet in the PhpSpreadsheet Object **/
$reader->loadIntoExisting($inputFileName, $spreadsheet); $reader->loadIntoExisting($inputFileName, $spreadsheet);
/* Set the worksheet title (to reference the "sheet" of data that we've loaded) **/ /* Set the worksheet title (to reference the "sheet" of data that we've loaded) **/
/* and increment the sheet index as well **/ /* and increment the sheet index as well **/

View File

@ -1,24 +1,25 @@
<?php <?php
error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set('Europe/London');
?> ?>
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #15</title> <title>PhpSpreadsheet Reader Example #15</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #15</h1> <h1>PhpSpreadsheet Reader Example #15</h1>
<h2>Simple File Reader for Tab-Separated Value File using the Advanced Value Binder</h2> <h2>Simple File Reader for Tab-Separated Value File using the Advanced Value Binder</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
\PhpOffice\PhpSpreadsheet\Cell::setValueBinder(new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder()); \PhpOffice\PhpSpreadsheet\Cell::setValueBinder(new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder());

View File

@ -10,26 +10,22 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #16</title> <title>PhpSpreadsheet Reader Example #16</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #16</h1> <h1>PhpSpreadsheet Reader Example #16</h1>
<h2>Handling Loader Exceptions using Try/Catch</h2> <h2>Handling Loader Exceptions using Try/Catch</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileName = './sampleData/example_1.xls'; $inputFileName = './sampleData/example_1.xls';
echo 'Loading file ',pathinfo($inputFileName, PATHINFO_BASENAME),' using IOFactory to identify the format<br />'; echo 'Loading file ',pathinfo($inputFileName, PATHINFO_BASENAME),' using IOFactory to identify the format<br />';
try { try {
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName); $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
} catch (\PHPExcel\Reader\Exception $e) { } catch (\InvalidArgumentException $e) {
die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) . '": ' . $e->getMessage()); die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) . '": ' . $e->getMessage());
} }

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #17</title> <title>PhpSpreadsheet Reader Example #17</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #17</h1> <h1>PhpSpreadsheet Reader Example #17</h1>
<h2>Simple File Reader Loading Several Named WorkSheets</h2> <h2>Simple File Reader Loading Several Named WorkSheets</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #18</title> <title>PhpSpreadsheet Reader Example #18</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #18</h1> <h1>PhpSpreadsheet Reader Example #18</h1>
<h2>Reading list of WorkSheets without loading entire file</h2> <h2>Reading list of WorkSheets without loading entire file</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,20 +10,16 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reader Example #19</title> <title>PhpSpreadsheet Reader Example #19</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reader Example #19</h1> <h1>PhpSpreadsheet Reader Example #19</h1>
<h2>Reading WorkSheet information without loading entire file</h2> <h2>Reading WorkSheet information without loading entire file</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
// $inputFileType = 'Xlsx'; // $inputFileType = 'Xlsx';

View File

@ -10,27 +10,23 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reading WorkBook Data Example #01</title> <title>PhpSpreadsheet Reading WorkBook Data Example #01</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reading WorkBook Data Example #01</h1> <h1>PhpSpreadsheet Reading WorkBook Data Example #01</h1>
<h2>Read the WorkBook Properties</h2> <h2>Read the WorkBook Properties</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
$inputFileName = './sampleData/example1.xls'; $inputFileName = './sampleData/example1.xls';
/* Create a new Reader of the type defined in $inputFileType **/ /* Create a new Reader of the type defined in $inputFileType **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/* Load $inputFileName to a PHPExcel Object **/ /* Load $inputFileName to a PhpSpreadsheet Object **/
$spreadsheet = $reader->load($inputFileName); $spreadsheet = $reader->load($inputFileName);
echo '<hr />'; echo '<hr />';

View File

@ -10,27 +10,23 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reading WorkBook Data Example #02</title> <title>PhpSpreadsheet Reading WorkBook Data Example #02</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reading WorkBook Data Example #02</h1> <h1>PhpSpreadsheet Reading WorkBook Data Example #02</h1>
<h2>Read a list of Custom Properties for a WorkBook</h2> <h2>Read a list of Custom Properties for a WorkBook</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xlsx'; $inputFileType = 'Xlsx';
$inputFileName = './sampleData/example1.xlsx'; $inputFileName = './sampleData/example1.xlsx';
/* Create a new Reader of the type defined in $inputFileType **/ /* Create a new Reader of the type defined in $inputFileType **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/* Load $inputFileName to a PHPExcel Object **/ /* Load $inputFileName to a PhpSpreadsheet Object **/
$spreadsheet = $reader->load($inputFileName); $spreadsheet = $reader->load($inputFileName);
echo '<hr />'; echo '<hr />';

View File

@ -10,27 +10,23 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reading WorkBook Data Example #03</title> <title>PhpSpreadsheet Reading WorkBook Data Example #03</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reading WorkBook Data Example #03</h1> <h1>PhpSpreadsheet Reading WorkBook Data Example #03</h1>
<h2>Read Custom Property Values for a WorkBook</h2> <h2>Read Custom Property Values for a WorkBook</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xlsx'; $inputFileType = 'Xlsx';
$inputFileName = './sampleData/example1.xlsx'; $inputFileName = './sampleData/example1.xlsx';
/* Create a new Reader of the type defined in $inputFileType **/ /* Create a new Reader of the type defined in $inputFileType **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/* Load $inputFileName to a PHPExcel Object **/ /* Load $inputFileName to a PhpSpreadsheet Object **/
$spreadsheet = $reader->load($inputFileName); $spreadsheet = $reader->load($inputFileName);
echo '<hr />'; echo '<hr />';

View File

@ -10,38 +10,34 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Reading WorkBook Data Example #04</title> <title>PhpSpreadsheet Reading WorkBook Data Example #04</title>
</head> </head>
<body> <body>
<h1>PHPExcel Reading WorkBook Data Example #04</h1> <h1>PhpSpreadsheet Reading WorkBook Data Example #04</h1>
<h2>Get a List of the Worksheets in a WorkBook</h2> <h2>Get a List of the Worksheets in a WorkBook</h2>
<?php <?php
/** Include path **/ require_once __DIR__ . '/../../../src/Bootstrap.php';
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** \PhpOffice\PhpSpreadsheet\IOFactory */
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Xls'; $inputFileType = 'Xls';
$inputFileName = './sampleData/example2.xls'; $inputFileName = './sampleData/example2.xls';
/* Create a new Reader of the type defined in $inputFileType **/ /* Create a new Reader of the type defined in $inputFileType **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/* Load $inputFileName to a PHPExcel Object **/ /* Load $inputFileName to a PhpSpreadsheet Object **/
$spreadsheet = $reader->load($inputFileName); $spreadsheet = $reader->load($inputFileName);
echo '<hr />'; echo '<hr />';
echo 'Reading the number of Worksheets in the WorkBook<br />'; echo 'Reading the number of Worksheets in the WorkBook<br />';
/* Use the PHPExcel object's getSheetCount() method to get a count of the number of WorkSheets in the WorkBook */ /* Use the PhpSpreadsheet object's getSheetCount() method to get a count of the number of WorkSheets in the WorkBook */
$sheetCount = $spreadsheet->getSheetCount(); $sheetCount = $spreadsheet->getSheetCount();
echo 'There ',(($sheetCount == 1) ? 'is' : 'are'),' ',$sheetCount,' WorkSheet',(($sheetCount == 1) ? '' : 's'),' in the WorkBook<br /><br />'; echo 'There ',(($sheetCount == 1) ? 'is' : 'are'),' ',$sheetCount,' WorkSheet',(($sheetCount == 1) ? '' : 's'),' in the WorkBook<br /><br />';
echo 'Reading the names of Worksheets in the WorkBook<br />'; echo 'Reading the names of Worksheets in the WorkBook<br />';
/* Use the PHPExcel object's getSheetNames() method to get an array listing the names/titles of the WorkSheets in the WorkBook */ /* Use the PhpSpreadsheet object's getSheetNames() method to get an array listing the names/titles of the WorkSheets in the WorkBook */
$sheetNames = $spreadsheet->getSheetNames(); $sheetNames = $spreadsheet->getSheetNames();
foreach ($sheetNames as $sheetIndex => $sheetName) { foreach ($sheetNames as $sheetIndex => $sheetName) {
echo 'WorkSheet #',$sheetIndex,' is named "',$sheetName,'"<br />'; echo 'WorkSheet #',$sheetIndex,' is named "',$sheetName,'"<br />';

View File

@ -10,7 +10,7 @@ date_default_timezone_set('Europe/London');
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPExcel Examples</title> <title>PhpSpreadsheet Examples</title>
</head> </head>
<body> <body>
@ -20,7 +20,7 @@ date_default_timezone_set('Europe/London');
$exampleTypeList = glob('./*', GLOB_ONLYDIR); $exampleTypeList = glob('./*', GLOB_ONLYDIR);
foreach ($exampleTypeList as $exampleType) { foreach ($exampleTypeList as $exampleType) {
echo '<h1>PHPExcel ' . pathinfo($exampleType, PATHINFO_BASENAME) . ' Examples</h1>'; echo '<h1>PhpSpreadsheet ' . pathinfo($exampleType, PATHINFO_BASENAME) . ' Examples</h1>';
$exampleList = glob('./' . $exampleType . '/*.php'); $exampleList = glob('./' . $exampleType . '/*.php');

View File

@ -1,48 +1,18 @@
# Frequently asked questions # Frequently asked questions
The up-to-date F.A.Q. page for PHPExcel can be found on
<http://www.codeplex.com/PHPExcel/Wiki/View.aspx?title=FAQ&referringTitle=Requirements>.
## There seems to be a problem with character encoding... ## There seems to be a problem with character encoding...
It is necessary to use UTF-8 encoding for all texts in PhpSpreadsheet. It is necessary to use UTF-8 encoding for all texts in PhpSpreadsheet.
If the script uses different encoding then you can convert those texts If the script uses different encoding then you can convert those texts
with PHP's iconv() or mb\_convert\_encoding() functions. with PHP's `iconv()` or `mb_convert_encoding()` functions.
## PHP complains about ZipArchive not being found
Make sure you meet all requirements, especially php\_zip extension
should be enabled.
The ZipArchive class is only required when reading or writing formats
that use Zip compression (Xlsx and Ods). Since version 1.7.6 the PCLZip
library has been bundled with PhpSpreadsheet as an alternative to the
ZipArchive class.
This can be enabled by calling:
``` php
\PhpOffice\PhpSpreadsheet\Settings::setZipClass(\PhpOffice\PhpSpreadsheet\Settings::PCLZIP);
```
*before* calling the save method of the Xlsx Writer.
You can revert to using ZipArchive by calling:
``` php
\PhpOffice\PhpSpreadsheet\Settings::setZipClass(\PhpOffice\PhpSpreadsheet\Settings::ZIPARCHIVE);
```
At present, this only allows you to write Xlsx files without the need
for ZipArchive (not to read Xlsx or Ods)
## Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa ## Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa
PhpSpreadsheet holds an "in memory" representation of a spreadsheet, so PhpSpreadsheet holds an "in memory" representation of a spreadsheet, so
it is susceptible to PHP's memory limitations. The memory made available it is susceptible to PHP's memory limitations. The memory made available
to PHP can be increased by editing the value of the memory\_limit to PHP can be increased by editing the value of the `memory_limit`
directive in your php.ini file, or by using ini\_set('memory\_limit', directive in your php.ini file, or by using
'128M') within your code (ISP permitting). `ini_set('memory_limit', '128M')` within your code.
Some Readers and Writers are faster than others, and they also use Some Readers and Writers are faster than others, and they also use
differing amounts of memory. You can find some indication of the differing amounts of memory. You can find some indication of the
@ -83,8 +53,8 @@ reference](./references/features-cross-reference.md).
## Formulas don't seem to be calculated in Excel2003 using compatibility pack? ## Formulas don't seem to be calculated in Excel2003 using compatibility pack?
This is normal behaviour of the compatibility pack, Xlsx displays this This is normal behaviour of the compatibility pack, `Xlsx` displays this
correctly. Use \PhpOffice\PhpSpreadsheet\Writer\Xls if you really need correctly. Use `\PhpOffice\PhpSpreadsheet\Writer\Xls` if you really need
calculated values, or force recalculation in Excel2003. calculated values, or force recalculation in Excel2003.
## Setting column width is not 100% accurate ## Setting column width is not 100% accurate
@ -93,7 +63,8 @@ Trying to set column width, I experience one problem. When I open the
file in Excel, the actual width is 0.71 less than it should be. file in Excel, the actual width is 0.71 less than it should be.
The short answer is that PhpSpreadsheet uses a measure where padding is The short answer is that PhpSpreadsheet uses a measure where padding is
included. See section: "Setting a column's width" for more details. included. See [how to seta column's width](./topics/recipes.md#setting-a-columns-width)
for more details.
## How do I use PhpSpreadsheet with my framework ## How do I use PhpSpreadsheet with my framework
@ -108,8 +79,8 @@ included. See section: "Setting a column's width" for more details.
within CakePHP within CakePHP
- Integrating [PhpSpreadsheet into Kohana - Integrating [PhpSpreadsheet into Kohana
3](http://www.flynsarmy.com/2010/07/phpexcel-module-for-kohana-3/) 3](http://www.flynsarmy.com/2010/07/phpexcel-module-for-kohana-3/)
and \[Интеграция PHPExcel и Kohana and [Интеграция PHPExcel и Kohana
Framework\]\[http://szpargalki.blogspot.com/2011/02/phpexcel-kohana-framework.html\] Framework](http://szpargalki.blogspot.com/2011/02/phpexcel-kohana-framework.html)
- Using [PhpSpreadsheet with - Using [PhpSpreadsheet with
TYPO3](http://typo3.org/documentation/document-library/extension-manuals/phpexcel_library/1.1.1/view/toc/0/) TYPO3](http://typo3.org/documentation/document-library/extension-manuals/phpexcel_library/1.1.1/view/toc/0/)

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,15 @@
# Features cross reference # Features cross reference
- <span style="text-align: center; color: green;"></span> Supported
- <span style="text-align: center; color: orange;"></span> Partially supported
- <span style="text-align: center; color: red;"></span> Not supported
- N/A Cannot be supported
<table> <table>
<tr> <tr>
<th></th> <th></th>
<th colspan="7">Writers</th> <th colspan="7">Readers</th>
<th colspan="5">Writers</th> <th colspan="6">Writers</th>
<th colspan="2">Methods</th> <th colspan="2">Methods</th>
</tr> </tr>
<tr> <tr>
@ -12,12 +17,13 @@
<th>XLS</th> <th>XLS</th>
<th>XLSX</th> <th>XLSX</th>
<th>Excel2003XML</th> <th>Excel2003XML</th>
<th>OOCalc</th> <th>Ods</th>
<th>Gnumeric</th> <th>Gnumeric</th>
<th>CSV</th> <th>CSV</th>
<th>SYLK</th> <th>SYLK</th>
<th>XLS</th> <th>XLS</th>
<th>XLSX</th> <th>XLSX</th>
<th>Ods</th>
<th>CSV</th> <th>CSV</th>
<th>HTML</th> <th>HTML</th>
<th>PDF</th> <th>PDF</th>
@ -33,11 +39,12 @@
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td></td> <td></td>
</tr> </tr>
@ -50,11 +57,12 @@
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td>
<td>$reader-&gt;getReadDataOnly()</td> <td>$reader-&gt;getReadDataOnly()</td>
<td>$reader-&gt;setReadDataOnly()</td> <td>$reader-&gt;setReadDataOnly()</td>
</tr> </tr>
@ -67,11 +75,12 @@
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td>
<td>$reader-&gt;getLoadSheetsOnly()</td> <td>$reader-&gt;getLoadSheetsOnly()</td>
<td>$reader-&gt;setLoadSheetsOnly()<br>$reader-&gt;setLoadAllSheets()</td> <td>$reader-&gt;setLoadSheetsOnly()<br>$reader-&gt;setLoadAllSheets()</td>
</tr> </tr>
@ -84,11 +93,12 @@
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">-</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td>
<td>$reader-&gt;getReadFilter()</td> <td>$reader-&gt;getReadFilter()</td>
<td>$reader-&gt;setReadFilter()</td> <td>$reader-&gt;setReadFilter()</td>
</tr> </tr>
@ -103,6 +113,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>
@ -120,6 +131,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: orange;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>
@ -137,6 +149,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
@ -154,6 +167,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
@ -171,6 +185,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
@ -188,6 +203,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
@ -205,6 +221,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
@ -222,6 +239,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
@ -239,6 +257,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
@ -256,6 +275,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
@ -273,6 +293,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: orange;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -290,6 +311,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -307,6 +329,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -324,7 +347,8 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td>$spreadsheet-&gt;getProperties()-&gt;getManager()</td> <td>$spreadsheet-&gt;getProperties()-&gt;getManager()</td>
@ -341,6 +365,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -358,6 +383,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -375,6 +401,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -392,6 +419,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -409,6 +437,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -448,6 +477,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Boolean</td> <td style="padding-left: 1em;">Boolean</td>
@ -465,6 +495,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Integer</td> <td style="padding-left: 1em;">Integer</td>
@ -482,6 +513,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Floating Point</td> <td style="padding-left: 1em;">Floating Point</td>
@ -499,6 +531,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">String</td> <td style="padding-left: 1em;">String</td>
@ -516,6 +549,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Error</td> <td style="padding-left: 1em;">Error</td>
@ -533,6 +567,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Formula</td> <td style="padding-left: 1em;">Formula</td>
@ -550,6 +585,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Array</td> <td style="padding-left: 1em;">Array</td>
@ -567,6 +603,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Rich Text</td> <td style="padding-left: 1em;">Rich Text</td>
@ -578,6 +615,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: green;"></td>
<td></td> <td></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
@ -601,6 +639,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td><strong>Rows and Column Properties</strong></td> <td><strong>Rows and Column Properties</strong></td>
@ -618,6 +657,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Row Height/Column Width</td> <td style="padding-left: 1em;">Row Height/Column Width</td>
@ -635,6 +675,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Hidden</td> <td style="padding-left: 1em;">Hidden</td>
@ -652,6 +693,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td><strong>Worksheet Properties</strong></td> <td><strong>Worksheet Properties</strong></td>
@ -669,6 +711,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Frozen Panes</td> <td style="padding-left: 1em;">Frozen Panes</td>
@ -686,6 +729,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Coloured Tabs</td> <td style="padding-left: 1em;">Coloured Tabs</td>
@ -703,6 +747,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td><strong>Cell Formatting</strong></td> <td><strong>Cell Formatting</strong></td>
@ -720,6 +765,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Number Format Mask</td> <td style="padding-left: 1em;">Number Format Mask</td>
@ -737,6 +783,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Alignment</td> <td style="padding-left: 1em;">Alignment</td>
@ -754,6 +801,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Horizontal</td> <td style="padding-left: 2em;">Horizontal</td>
@ -771,6 +819,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Vertical</td> <td style="padding-left: 2em;">Vertical</td>
@ -788,6 +837,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Wrapping</td> <td style="padding-left: 1em;">Wrapping</td>
@ -805,6 +855,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Shring-to-Fit</td> <td style="padding-left: 1em;">Shring-to-Fit</td>
@ -822,6 +873,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Indent</td> <td style="padding-left: 1em;">Indent</td>
@ -839,6 +891,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Background Colour</td> <td style="padding-left: 1em;">Background Colour</td>
@ -856,6 +909,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Patterned</td> <td style="padding-left: 2em;">Patterned</td>
@ -873,6 +927,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Font Attributes</td> <td style="padding-left: 1em;">Font Attributes</td>
@ -885,6 +940,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: orange;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -902,6 +958,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -919,6 +976,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -936,6 +994,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -953,6 +1012,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -970,6 +1030,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: red;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -987,6 +1048,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: green;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -1004,6 +1066,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: red;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -1021,6 +1084,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td style="text-align: center; color: red;"></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -1043,6 +1107,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Line Style</td> <td style="padding-left: 2em;">Line Style</td>
@ -1060,6 +1125,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Position</td> <td style="padding-left: 2em;">Position</td>
@ -1077,6 +1143,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 3em;">Diagonal</td> <td style="padding-left: 3em;">Diagonal</td>
@ -1094,23 +1161,25 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Hyperlinks</td> <td style="padding-left: 1em;">Hyperlinks</td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td>
<td></td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td>$cell->getHyperlink()->getUrl($url)</td>
<td>$cell->getHyperlink()->setUrl($url)</td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">http</td> <td style="padding-left: 2em;">http</td>
@ -1128,6 +1197,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">Merged Cells</td> <td style="padding-left: 1em;">Merged Cells</td>
@ -1145,6 +1215,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td><strong>Cell Comments</strong></td> <td><strong>Cell Comments</strong></td>
@ -1157,6 +1228,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: orange;"></td> <td style="text-align: center; color: orange;"></td>
<td style="text-align: center; color: orange;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
@ -1174,6 +1246,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: green;"></td> <td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
@ -1191,6 +1264,7 @@
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
<td></td> <td></td>
<td style="text-align: center;">N/A</td> <td style="text-align: center;">N/A</td>
@ -1199,20 +1273,21 @@
</tr> </tr>
<tr> <tr>
<td><strong>Cell Validation</strong></td> <td><strong>Cell Validation</strong></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td>
<td></td>
<td style="text-align: center; color: red;"></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center;">N/A</td>
<td></td> <td style="text-align: center;">N/A</td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: green;"></td>
<td></td> <td style="text-align: center; color: red;"></td>
<td></td> <td style="text-align: center;">N/A</td>
<td></td> <td style="text-align: center;">N/A</td>
<td style="text-align: center;">N/A</td>
<td>$cell->getDataValidation()</td>
<td>$cell->setDataValidation()</td>
</tr> </tr>
<tr> <tr>
<td><strong>AutoFilters</strong></td> <td><strong>AutoFilters</strong></td>
@ -1228,8 +1303,9 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td>$spreadsheet-&gt;getActivesheet()-&gt;getAutoFilter()</td> <td></td>
<td>$spreadsheet-&gt;getActivesheet()-&gt;setAutoFilter()</td> <td>$sheet->getAutoFilter()</td>
<td>$sheet->setAutoFilter()</td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 1em;">AutoFilter Expressions</td> <td style="padding-left: 1em;">AutoFilter Expressions</td>
@ -1247,6 +1323,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Filter</td> <td style="padding-left: 2em;">Filter</td>
@ -1264,6 +1341,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Custom Filter</td> <td style="padding-left: 2em;">Custom Filter</td>
@ -1281,6 +1359,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">DateGroup Filter</td> <td style="padding-left: 2em;">DateGroup Filter</td>
@ -1298,6 +1377,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Dynamic Filter</td> <td style="padding-left: 2em;">Dynamic Filter</td>
@ -1315,6 +1395,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Colour Filter</td> <td style="padding-left: 2em;">Colour Filter</td>
@ -1332,6 +1413,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Icon Filter</td> <td style="padding-left: 2em;">Icon Filter</td>
@ -1349,6 +1431,7 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr> </tr>
<tr> <tr>
<td style="padding-left: 2em;">Top 10 Filter</td> <td style="padding-left: 2em;">Top 10 Filter</td>
@ -1366,6 +1449,49 @@
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
<td></td>
</tr>
<tr>
<td><strong>Macros</strong></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: green;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td style="text-align: center; color: red;"></td>
<td>$spreadsheet->getMacrosCode();</td>
<td>$spreadsheet->setMacrosCode();</td>
</tr>
<tr>
<th></th>
<th>XLS</th>
<th>XLSX</th>
<th>Excel2003XML</th>
<th>Ods</th>
<th>Gnumeric</th>
<th>CSV</th>
<th>SYLK</th>
<th>XLS</th>
<th>XLSX</th>
<th>Ods</th>
<th>CSV</th>
<th>HTML</th>
<th>PDF</th>
<th>Getters</th>
<th>Setters</th>
</tr>
<tr>
<th></th>
<th colspan="7">Readers</th>
<th colspan="6">Writers</th>
<th colspan="2">Methods</th>
</tr> </tr>
</table> </table>

View File

@ -0,0 +1,482 @@
# Accessing cells
Accessing cells in a Spreadsheet should be pretty straightforward. This
topic lists some of the options to access a cell.
## Setting a cell value by coordinate
Setting a cell value by coordinate can be done using the worksheet's
`setCellValue()` method.
``` php
// Set cell A1 with a string value
$spreadsheet->getActiveSheet()->setCellValue('A1', 'PhpSpreadsheet');
// Set cell A2 with a numeric value
$spreadsheet->getActiveSheet()->setCellValue('A2', 12345.6789);
// Set cell A3 with a boolean value
$spreadsheet->getActiveSheet()->setCellValue('A3', TRUE);
// Set cell A4 with a formula
$spreadsheet->getActiveSheet()->setCellValue(
'A4',
'=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'
);
```
Alternatively, you can retrieve the cell object, and then call the
cells `setValue()` method:
``` php
$spreadsheet->getActiveSheet()
->getCell('B8')
->setValue('Some value');
```
## Excel DataTypes
MS Excel supports 7 basic datatypes:
- string
- number
- boolean
- null
- formula
- error
- Inline (or rich text) string
By default, when you call the worksheet's `setCellValue()` method or the
cell's `setValue()` method, PhpSpreadsheet will use the appropriate
datatype for PHP nulls, booleans, floats or integers; or cast any string
data value that you pass to the method into the most appropriate
datatype, so numeric strings will be cast to numbers, while string
values beginning with `=` will be converted to a formula. Strings that
aren't numeric, or that don't begin with a leading `=` will be treated
as genuine string values.
This "conversion" is handled by a cell "value binder", and you can write
custom "value binders" to change the behaviour of these "conversions".
The standard PhpSpreadsheet package also provides an "advanced value
binder" that handles a number of more complex conversions, such as
converting strings with a fractional format like "3/4" to a number value
(0.75 in this case) and setting an appropriate "fraction" number format
mask. Similarly, strings like "5%" will be converted to a value of 0.05,
and a percentage number format mask applied, and strings containing
values that look like dates will be converted to Excel serialized
datetimestamp values, and a corresponding mask applied. This is
particularly useful when loading data from csv files, or setting cell
values from a database.
Formats handled by the advanced value binder include:
- TRUE or FALSE (dependent on locale settings) are converted to booleans.
- Numeric strings identified as scientific (exponential) format are
converted to numbers.
- Fractions and vulgar fractions are converted to numbers, and
an appropriate number format mask applied.
- Percentages are converted
to numbers, divided by 100, and an appropriate number format mask
applied.
- Dates and times are converted to Excel timestamp values
(numbers), and an appropriate number format mask applied.
- When strings contain a newline character (`\n`), then the cell styling is
set to wrap.
You can read more about value binders later in this section of the
documentation.
### Setting a date and/or time value in a cell
Date or time values are held as timestamp in Excel (a simple floating
point value), and a number format mask is used to show how that value
should be formatted; so if we want to store a date in a cell, we need to
calculate the correct Excel timestamp, and set a number format mask.
``` php
// Get the current date/time and convert to an Excel date/time
$dateTimeNow = time();
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel( $dateTimeNow );
// Set cell A6 with the Excel date/time value
$spreadsheet->getActiveSheet()->setCellValue(
'A6',
$excelDateValue
);
// Set the number format mask so that the excel timestamp will be displayed as a human-readable date/time
$spreadsheet->getActiveSheet()->getStyle('A6')
->getNumberFormat()
->setFormatCode(
\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME
);
```
### Setting a number with leading zeroes
By default, PhpSpreadsheet will automatically detect the value type and
set it to the appropriate Excel numeric datatype. This type conversion
is handled by a value binder, as described in the section of this
document entitled "Using value binders to facilitate data entry".
Numbers don't have leading zeroes, so if you try to set a numeric value
that does have leading zeroes (such as a telephone number) then these
will be normally be lost as the value is cast to a number, so
"01513789642" will be displayed as 1513789642.
There are two ways you can force PhpSpreadsheet to override this
behaviour.
Firstly, you can set the datatype explicitly as a string so that it is
not converted to a number.
``` php
// Set cell A8 with a numeric value, but tell PhpSpreadsheet it should be treated as a string
$spreadsheet->getActiveSheet()->setCellValueExplicit(
'A8',
"01513789642",
\PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING
);
```
Alternatively, you can use a number format mask to display the value
with leading zeroes.
``` php
// Set cell A9 with a numeric value
$spreadsheet->getActiveSheet()->setCellValue('A9', 1513789642);
// Set a number format mask to display the value as 11 digits with leading zeroes
$spreadsheet->getActiveSheet()->getStyle('A9')
->getNumberFormat()
->setFormatCode(
'00000000000'
);
```
With number format masking, you can even break up the digits into groups
to make the value more easily readable.
``` php
// Set cell A10 with a numeric value
$spreadsheet->getActiveSheet()->setCellValue('A10', 1513789642);
// Set a number format mask to display the value as 11 digits with leading zeroes
$spreadsheet->getActiveSheet()->getStyle('A10')
->getNumberFormat()
->setFormatCode(
'0000-000-0000'
);
```
![07-simple-example-1.png](./images/07-simple-example-1.png)
**Note** that not all complex format masks such as this one will work
when retrieving a formatted value to display "on screen", or for certain
writers such as HTML or PDF, but it will work with the true spreadsheet
writers (Xlsx and Xls).
## Setting a range of cells from an array
It is also possible to set a range of cell values in a single call by
passing an array of values to the `fromArray()` method.
``` php
$arrayData = array(
array(NULL, 2010, 2011, 2012),
array('Q1', 12, 15, 21),
array('Q2', 56, 73, 86),
array('Q3', 52, 61, 69),
array('Q4', 30, 32, 0),
);
$spreadsheet->getActiveSheet()
->fromArray(
$arrayData, // The data to set
NULL, // Array values with this value will not be set
'C3' // Top left coordinate of the worksheet range where
// we want to set these values (default is A1)
);
```
![07-simple-example-2.png](./images/07-simple-example-2.png)
If you pass a 2-d array, then this will be treated as a series of rows
and columns. A 1-d array will be treated as a single row, which is
particularly useful if you're fetching an array of data from a database.
``` php
$rowArray = array('Value1', 'Value2', 'Value3', 'Value4');
$spreadsheet->getActiveSheet()
->fromArray(
$rowArray, // The data to set
NULL, // Array values with this value will not be set
'C3' // Top left coordinate of the worksheet range where
// we want to set these values (default is A1)
);
```
![07-simple-example-3.png](./images/07-simple-example-3.png)
If you have a simple 1-d array, and want to write it as a column, then
the following will convert it into an appropriately structured 2-d array
that can be fed to the `fromArray()` method:
``` php
$rowArray = array('Value1', 'Value2', 'Value3', 'Value4');
$columnArray = array_chunk($rowArray, 1);
$spreadsheet->getActiveSheet()
->fromArray(
$columnArray, // The data to set
NULL, // Array values with this value will not be set
'C3' // Top left coordinate of the worksheet range where
// we want to set these values (default is A1)
);
```
![07-simple-example-4.png](./images/07-simple-example-4.png)
## Retrieving a cell value by coordinate
To retrieve the value of a cell, the cell should first be retrieved from
the worksheet using the `getCell()` method. A cell's value can be read
using the `getValue()` method.
``` php
// Get the value fom cell A1
$cellValue = $spreadsheet->getActiveSheet()->getCell('A1')
->getValue();
```
This will retrieve the raw, unformatted value contained in the cell.
If a cell contains a formula, and you need to retrieve the calculated
value rather than the formula itself, then use the cell's
`getCalculatedValue()` method. This is further explained in .
``` php
// Get the value fom cell A4
$cellValue = $spreadsheet->getActiveSheet()->getCell('A4')
->getCalculatedValue();
```
Alternatively, if you want to see the value with any cell formatting
applied (e.g. for a human-readable date or time value), then you can use
the cell's `getFormattedValue()` method.
``` php
// Get the value fom cell A6
$cellValue = $spreadsheet->getActiveSheet()->getCell('A6')
->getFormattedValue();
```
## Setting a cell value by column and row
Setting a cell value by coordinate can be done using the worksheet's
`setCellValueByColumnAndRow()` method.
``` php
// Set cell B5 with a string value
$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow(1, 5, 'PhpSpreadsheet');
```
**Note** that column references start with `0` for column `A`, rather
than from `1`.
## Retrieving a cell value by column and row
To retrieve the value of a cell, the cell should first be retrieved from
the worksheet using the getCellByColumnAndRow method. A cells value can
be read again using the following line of code:
``` php
// Get the value fom cell B5
$cellValue = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(1, 5)
->getValue();
```
If you need the calculated value of a cell, use the following code. This
is further explained in .
``` php
// Get the value fom cell A4
$cellValue = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(0, 4)
->getCalculatedValue();
```
## Retrieving a range of cell values to an array
It is also possible to retrieve a range of cell values to an array in a
single call using the `toArray()`, `rangeToArray()` or
`namedRangeToArray()` methods.
``` php
$dataArray = $spreadsheet->getActiveSheet()
->rangeToArray(
'C3:E5', // The worksheet range that we want to retrieve
NULL, // Value that should be returned for empty cells
TRUE, // Should formulas be calculated (the equivalent of getCalculatedValue() for each cell)
TRUE, // Should values be formatted (the equivalent of getFormattedValue() for each cell)
TRUE // Should the array be indexed by cell row and cell column
);
```
These methods will all return a 2-d array of rows and columns. The
`toArray()` method will return the whole worksheet; `rangeToArray()`
will return a specified range or cells; while `namedRangeToArray()` will
return the cells within a defined `named range`.
## Looping through cells
### Looping through cells using iterators
The easiest way to loop cells is by using iterators. Using iterators,
one can use foreach to loop worksheets, rows within a worksheet, and
cells within a row.
Below is an example where we read all the values in a worksheet and
display them in a table.
``` php
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load("test.xlsx");
$worksheet = $spreadsheet->getActiveSheet();
echo '<table>' . PHP_EOL;
foreach ($worksheet->getRowIterator() as $row) {
echo '<tr>' . PHP_EOL;
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(FALSE); // This loops through all cells,
// even if a cell value is not set.
// By default, only cells that have a value
// set will be iterated.
foreach ($cellIterator as $cell) {
echo '<td>' .
$cell->getValue() .
'</td>' . PHP_EOL;
}
echo '</tr>' . PHP_EOL;
}
echo '</table>' . PHP_EOL;
```
Note that we have set the cell iterator's
`setIterateOnlyExistingCells()` to FALSE. This makes the iterator loop
all cells within the worksheet range, even if they have not been set.
The cell iterator will return a **NULL** as the cell value if it is not
set in the worksheet. Setting the cell iterator's
setIterateOnlyExistingCells() to FALSE will loop all cells in the
worksheet that can be available at that moment. This will create new
cells if required and increase memory usage! Only use it if it is
intended to loop all cells that are possibly available.
### Looping through cells using indexes
One can use the possibility to access cell values by column and row
index like (0,1) instead of 'A1' for reading and writing cell values in
loops.
Note: In PhpSpreadsheet column index is 0-based while row index is
1-based. That means 'A1' \~ (0,1)
Below is an example where we read all the values in a worksheet and
display them in a table.
``` php
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load("test.xlsx");
$worksheet = $spreadsheet->getActiveSheet();
// Get the highest row and column numbers referenced in the worksheet
$highestRow = $worksheet->getHighestRow(); // e.g. 10
$highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString($highestColumn); // e.g. 5
echo '<table>' . "\n";
for ($row = 1; $row <= $highestRow; ++$row) {
echo '<tr>' . PHP_EOL;
for ($col = 0; $col <= $highestColumnIndex; ++$col) {
echo '<td>' .
$worksheet->getCellByColumnAndRow($col, $row)
->getValue() .
'</td>' . PHP_EOL;
}
echo '</tr>' . PHP_EOL;
}
echo '</table>' . PHP_EOL;
```
Alternatively, you can take advantage of PHP's "Perl-style" character
incrementors to loop through the cells by coordinate:
``` php
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load("test.xlsx");
$worksheet = $spreadsheet->getActiveSheet();
// Get the highest row number and column letter referenced in the worksheet
$highestRow = $worksheet->getHighestRow(); // e.g. 10
$highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
// Increment the highest column letter
$highestColumn++;
echo '<table>' . "\n";
for ($row = 1; $row <= $highestRow; ++$row) {
echo '<tr>' . PHP_EOL;
for ($col = 'A'; $col != $highestColumn; ++$col) {
echo '<td>' .
$worksheet->getCell($col . $row)
->getValue() .
'</td>' . PHP_EOL;
}
echo '</tr>' . PHP_EOL;
}
echo '</table>' . PHP_EOL;
```
Note that we can't use a &lt;= comparison here, because 'AA' would match
as &lt;= 'B', so we increment the highest column letter and then loop
while \$col != the incremented highest column.
## Using value binders to facilitate data entry
Internally, PhpSpreadsheet uses a default
\PhpOffice\PhpSpreadsheet\Cell\IValueBinder implementation
(\PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder) to determine data
types of entered data using a cell's `setValue()` method (the
`setValueExplicit()` method bypasses this check).
Optionally, the default behaviour of PhpSpreadsheet can be modified,
allowing easier data entry. For example, a
\PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder class is available.
It automatically converts percentages, number in scientific format, and
dates entered as strings to the correct format, also setting the cell's
style information. The following example demonstrates how to set the
value binder in PhpSpreadsheet:
``` php
/** PhpSpreadsheet */
require_once 'src/Boostrap.php';
// Set value binder
\PhpOffice\PhpSpreadsheet\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() );
// Create new Spreadsheet object
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// ...
// Add some data, resembling some different data types
$spreadsheet->getActiveSheet()->setCellValue('A4', 'Percentage value:');
// Converts the string value to 0.1 and sets percentage cell style
$spreadsheet->getActiveSheet()->setCellValue('B4', '10%');
$spreadsheet->getActiveSheet()->setCellValue('A5', 'Date/time value:');
// Converts the string value to an Excel datestamp and sets the date format cell style
$spreadsheet->getActiveSheet()->setCellValue('B5', '21 December 1983');
```
**Creating your own value binder is easy.** When advanced value binding
is required, you can implement the
\PhpOffice\PhpSpreadsheet\Cell\IValueBinder interface or extend the
\PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder or
\PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder classes.

View File

@ -0,0 +1,75 @@
# Architecture
## Schematical
![01-schematic.png](./images/01-schematic.png "Basic Architecture Schematic")
## AutoLoader
PhpSpreadsheet relies on Composer autoloader. So before working with
PhpSpreadsheet in standalone, be sure to run `composer install`. Or add it to a
pre-existing project with `composer require phpoffice/phpspreadsheet`.
## Spreadsheet in memory
PhpSpreadsheet's architecture is built in a way that it can serve as an
in-memory spreadsheet. This means that, if one would want to create a
web based view of a spreadsheet which communicates with PhpSpreadsheet's
object model, he would only have to write the front-end code.
Just like desktop spreadsheet software, PhpSpreadsheet represents a
spreadsheet containing one or more worksheets, which contain cells with
data, formulas, images, ...
## Readers and writers
On its own, the `Spreadsheet` class does not provide the functionality
to read from or write to a persisted spreadsheet (on disk or in a
database). To provide that functionality, readers and writers can be
used.
By default, the PhpSpreadsheet package provides some readers and
writers, including one for the Open XML spreadsheet format (a.k.a. Excel
2007 file format). You are not limited to the default readers and
writers, as you are free to implement the
\PhpOffice\PhpSpreadsheet\Reader\IReader and
\PhpOffice\PhpSpreadsheet\Writer\IWriter interface in a custom class.
![02-readers-writers.png](./images/02-readers-writers.png "Readers/Writers")
## Fluent interfaces
PhpSpreadsheet supports fluent interfaces in most locations. This means
that you can easily "chain" calls to specific methods without requiring
a new PHP statement. For example, take the following code:
``` php
$spreadsheet->getProperties()->setCreator("Maarten Balliauw");
$spreadsheet->getProperties()->setLastModifiedBy("Maarten Balliauw");
$spreadsheet->getProperties()->setTitle("Office 2007 XLSX Test Document");
$spreadsheet->getProperties()->setSubject("Office 2007 XLSX Test Document");
$spreadsheet->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
$spreadsheet->getProperties()->setKeywords("office 2007 openxml php");
$spreadsheet->getProperties()->setCategory("Test result file");
```
This can be rewritten as:
``` php
$spreadsheet->getProperties()
->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
->setTitle("Office 2007 XLSX Test Document")
->setSubject("Office 2007 XLSX Test Document")
->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
->setKeywords("office 2007 openxml php")
->setCategory("Test result file");
```
> **Using fluent interfaces is not required** Fluent interfaces have
> been implemented to provide a convenient programming API. Use of them
> is not required, but can make your code easier to read and maintain.
> It can also improve performance, as you are reducing the overall
> number of calls to PhpSpreadsheet methods: in the above example, the
> `getProperties()` method is being called only once rather than 7 times
> in the non-fluent version.

View File

@ -142,7 +142,7 @@ $columnFilter->createRule()
``` ```
This creates two filter rules: the column will be filtered by values This creates two filter rules: the column will be filtered by values
that match “France” OR “Germany”. For Simple Filters, you can create as that match "France" OR "Germany". For Simple Filters, you can create as
many rules as you want many rules as you want
Simple filters are always a comparison match of EQUALS, and multiple Simple filters are always a comparison match of EQUALS, and multiple
@ -238,7 +238,7 @@ $columnFilter->setFilterType(
And then define our rules. And then define our rules.
The following shows a simple wildcard filter to show all column entries The following shows a simple wildcard filter to show all column entries
beginning with the letter 'U'. beginning with the letter `U`.
``` php ``` php
$columnFilter->createRule() $columnFilter->createRule()
@ -487,7 +487,7 @@ saved.
### Applying the Filter ### Applying the Filter
If you wish to execute your filter from within a script, you need to do If you wish to execute your filter from within a script, you need to do
this manually. You can do this using the autofilters showHideRows() this manually. You can do this using the autofilters `showHideRows()`
method. method.
``` php ``` php

View File

@ -7,11 +7,11 @@
As PhpSpreadsheet represents an in-memory spreadsheet, it also offers As PhpSpreadsheet represents an in-memory spreadsheet, it also offers
formula calculation capabilities. A cell can be of a value type formula calculation capabilities. A cell can be of a value type
(containing a number or text), or a formula type (containing a formula (containing a number or text), or a formula type (containing a formula
which can be evaluated). For example, the formula "=SUM(A1:A10)" which can be evaluated). For example, the formula `=SUM(A1:A10)`
evaluates to the sum of values in A1, A2, ..., A10. evaluates to the sum of values in A1, A2, ..., A10.
To calculate a formula, you can call the cell containing the formulas To calculate a formula, you can call the cell containing the formulas
method getCalculatedValue(), for example: method `getCalculatedValue()`, for example:
``` php ``` php
$spreadsheet->getActiveSheet()->getCell('E11')->getCalculatedValue(); $spreadsheet->getActiveSheet()->getCell('E11')->getCalculatedValue();
@ -57,7 +57,7 @@ Not all functions are supported, for a comprehensive list, read the
#### Operator precedence #### Operator precedence
In Excel '+' wins over '&', just like '\*' wins over '+' in ordinary In Excel `+` wins over `&`, just like `*` wins over `+` in ordinary
algebra. The former rule is not what one finds using the calculation algebra. The former rule is not what one finds using the calculation
engine shipped with PhpSpreadsheet. engine shipped with PhpSpreadsheet.
@ -69,9 +69,9 @@ Reference for operator precedence in PHP: <http://www.php.net/operators>
#### Formulas involving numbers and text #### Formulas involving numbers and text
Formulas involving numbers and text may produce unexpected results or Formulas involving numbers and text may produce unexpected results or
even unreadable file contents. For example, the formula '=3+"Hello "' is even unreadable file contents. For example, the formula `=3+"Hello "` is
expected to produce an error in Excel (\#VALUE!). Due to the fact that expected to produce an error in Excel (\#VALUE!). Due to the fact that
PHP converts “Hello” to a numeric value (zero), the result of this PHP converts `"Hello "` to a numeric value (zero), the result of this
formula is evaluated as 3 instead of evaluating as an error. This also formula is evaluated as 3 instead of evaluating as an error. This also
causes the Excel document being generated as containing unreadable causes the Excel document being generated as containing unreadable
content. content.
@ -94,14 +94,14 @@ return either an Excel timestamp or a PHP timestamp or date object.
It is possible for scripts to change the data type used for returning It is possible for scripts to change the data type used for returning
date values by calling the date values by calling the
\PhpOffice\PhpSpreadsheet\Calculation\Functions::setReturnDateType() `\PhpOffice\PhpSpreadsheet\Calculation\Functions::setReturnDateType()`
method: method:
``` php ``` php
\PhpOffice\PhpSpreadsheet\Calculation\Functions::setReturnDateType($returnDateType); \PhpOffice\PhpSpreadsheet\Calculation\Functions::setReturnDateType($returnDateType);
``` ```
where the following constants can be used for \$returnDateType where the following constants can be used for `$returnDateType`:
- `\PhpOffice\PhpSpreadsheet\Calculation\Functions::RETURNDATE_PHP_NUMERIC` - `\PhpOffice\PhpSpreadsheet\Calculation\Functions::RETURNDATE_PHP_NUMERIC`
- `\PhpOffice\PhpSpreadsheet\Calculation\Functions::RETURNDATE_PHP_OBJECT` - `\PhpOffice\PhpSpreadsheet\Calculation\Functions::RETURNDATE_PHP_OBJECT`
@ -155,7 +155,7 @@ Excel date values by calling the
\PhpOffice\PhpSpreadsheet\Shared\Date::setExcelCalendar($baseDate); \PhpOffice\PhpSpreadsheet\Shared\Date::setExcelCalendar($baseDate);
``` ```
where the following constants can be used for \$baseDate where the following constants can be used for `$baseDate`:
- \PhpOffice\PhpSpreadsheet\Shared\Date::CALENDAR\_WINDOWS\_1900 - \PhpOffice\PhpSpreadsheet\Shared\Date::CALENDAR\_WINDOWS\_1900
- \PhpOffice\PhpSpreadsheet\Shared\Date::CALENDAR\_MAC\_1904 - \PhpOffice\PhpSpreadsheet\Shared\Date::CALENDAR\_MAC\_1904
@ -202,9 +202,9 @@ However, if you pass through a value such as '31/12/2008' that would be
considered an error by a US-based server, but which is not ambiguous, considered an error by a US-based server, but which is not ambiguous,
then PhpSpreadsheet will attempt to correct this to 31st December 2008. then PhpSpreadsheet will attempt to correct this to 31st December 2008.
If the content of the string doesnt match any of the formats recognised If the content of the string doesnt match any of the formats recognised
by the php date/time object implementation of strtotime() (which can by the php date/time object implementation of `strtotime()` (which can
handle a wider range of formats than the normal strtotime() function), handle a wider range of formats than the normal `strtotime()` function),
then the function will return a '\#VALUE' error. However, Excel then the function will return a `#VALUE` error. However, Excel
recommends that you should always use date/timestamps for your date recommends that you should always use date/timestamps for your date
functions, and the recommendation for PhpSpreadsheet is the same: avoid functions, and the recommendation for PhpSpreadsheet is the same: avoid
strings because the result is not predictable. strings because the result is not predictable.
@ -238,12 +238,12 @@ rather than converted to Excel date timestamp values.
### Helper Methods ### Helper Methods
In addition to the setExcelCalendar() and getExcelCalendar() methods, a In addition to the `setExcelCalendar()` and `getExcelCalendar()` methods, a
number of other methods are available in the number of other methods are available in the
\PhpOffice\PhpSpreadsheet\Shared\Date class that can help when working \PhpOffice\PhpSpreadsheet\Shared\Date class that can help when working
with dates: with dates:
#### \PhpOffice\PhpSpreadsheet\Shared\Date::ExcelToPHP(\$excelDate) #### \PhpOffice\PhpSpreadsheet\Shared\Date::ExcelToPHP($excelDate)
Converts a date/time from an Excel date timestamp to return a PHP Converts a date/time from an Excel date timestamp to return a PHP
serialized date/timestamp. serialized date/timestamp.
@ -251,17 +251,17 @@ serialized date/timestamp.
Note that this method does not trap for Excel dates that fall outside of Note that this method does not trap for Excel dates that fall outside of
the valid range for a PHP date timestamp. the valid range for a PHP date timestamp.
#### \PhpOffice\PhpSpreadsheet\Shared\Date::ExcelToPHPObject(\$excelDate) #### \PhpOffice\PhpSpreadsheet\Shared\Date::ExcelToPHPObject($excelDate)
Converts a date from an Excel date/timestamp to return a PHP DateTime Converts a date from an Excel date/timestamp to return a PHP DateTime
object. object.
#### \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel(\$PHPDate) #### \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($PHPDate)
Converts a PHP serialized date/timestamp or a PHP DateTime object to Converts a PHP serialized date/timestamp or a PHP DateTime object to
return an Excel date timestamp. return an Excel date timestamp.
#### \PhpOffice\PhpSpreadsheet\Shared\Date::FormattedPHPToExcel(\$year, \$month, \$day, \$hours=0, \$minutes=0, \$seconds=0) #### \PhpOffice\PhpSpreadsheet\Shared\Date::FormattedPHPToExcel($year, $month, $day, $hours=0, $minutes=0, $seconds=0)
Takes year, month and day values (and optional hour, minute and second Takes year, month and day values (and optional hour, minute and second
values) and returns an Excel date timestamp value. values) and returns an Excel date timestamp value.
@ -1114,7 +1114,7 @@ ym | Months Excluding Years | Complete calendar months between the da
yd | Days Excluding Years | Complete calendar days between the dates as if they were of the same year. yd | Days Excluding Years | Complete calendar days between the dates as if they were of the same year.
md | Days Excluding Years And Months | Complete calendar days between the dates as if they were of the same month and same year. md | Days Excluding Years And Months | Complete calendar days between the dates as if they were of the same month and same year.
The unit value is not case sensitive, and defaults to "d". The unit value is not case sensitive, and defaults to `d`.
##### Return Value ##### Return Value
@ -1290,8 +1290,8 @@ $retVal = call_user_func_array(
##### Notes ##### Notes
DATEVALUE uses the php date/time object implementation of strtotime() DATEVALUE uses the php date/time object implementation of `strtotime()`
(which can handle a wider range of formats than the normal strtotime() (which can handle a wider range of formats than the normal `strtotime()`
function), and it is also called for any date parameter passed to other function), and it is also called for any date parameter passed to other
date functions (such as DATEDIF) when the parameter value is a string. date functions (such as DATEDIF) when the parameter value is a string.
@ -1449,7 +1449,7 @@ $retVal = call_user_func_array(
when a PHP Boolean is used for the third (optional) parameter (as shown when a PHP Boolean is used for the third (optional) parameter (as shown
in the example above), and the writer will generate and error. It will in the example above), and the writer will generate and error. It will
work if a numeric 0 or 1 is used for the method parameter; or if the work if a numeric 0 or 1 is used for the method parameter; or if the
Excel TRUE() and FALSE() functions are used instead. Excel `TRUE()` and `FALSE()` functions are used instead.
#### EDATE #### EDATE
@ -1824,7 +1824,7 @@ The NOW function returns the current date and time.
##### Parameters ##### Parameters
There are now parameters for the NOW() function. There are no parameters for the `NOW()` function.
##### Return Value ##### Return Value

View File

@ -0,0 +1,59 @@
# Creating a spreadsheet
## The `Spreadsheet` class
The `Spreadsheet` class is the core of PhpSpreadsheet. It contains
references to the contained worksheets, document security settings and
document meta data.
To simplify the PhpSpreadsheet concept: the `Spreadsheet` class
represents your workbook.
Typically, you will create a workbook in one of two ways, either by
loading it from a spreadsheet file, or creating it manually. A third
option, though less commonly used, is cloning an existing workbook that
has been created using one of the previous two methods.
### Loading a Workbook from a file
Details of the different spreadsheet formats supported, and the options
available to read them into a Spreadsheet object are described fully in
the [Reading Files](./reading-files.md) document.
``` php
$inputFileName = './sampleData/example1.xls';
/** Load $inputFileName to a Spreadsheet object **/
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
```
### Creating a new workbook
If you want to create a new workbook, rather than load one from file,
then you simply need to instantiate it as a new Spreadsheet object.
``` php
/** Create a new Spreadsheet Object **/
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
```
A new workbook will always be created with a single worksheet.
## Clearing a Workbook from memory
The PhpSpreadsheet object contains cyclic references (e.g. the workbook
is linked to the worksheets, and the worksheets are linked to their
parent workbook) which cause problems when PHP tries to clear the
objects from memory when they are `unset()`, or at the end of a function
when they are in local scope. The result of this is "memory leaks",
which can easily use a large amount of PHP's limited memory.
This can only be resolved manually: if you need to unset a workbook,
then you also need to "break" these cyclic references before doing so.
PhpSpreadsheet provides the `disconnectWorksheets()` method for this
purpose.
``` php
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
```

View File

@ -78,10 +78,10 @@ library.
Comma Separated Value (CSV) file format is a common structuring strategy Comma Separated Value (CSV) file format is a common structuring strategy
for text format files. In CSV flies, each line in the file represents a for text format files. In CSV flies, each line in the file represents a
row of data and (within each line of the file) the different data fields row of data and (within each line of the file) the different data fields
(or columns) are separated from one another using a comma (","). If a (or columns) are separated from one another using a comma (`,`). If a
data field contains a comma, then it should be enclosed (typically in data field contains a comma, then it should be enclosed (typically in
quotation marks ("). Sometimes tabs "\t", or the pipe symbol ("|"), or a quotation marks (`"`). Sometimes tabs `\t`, or the pipe symbol (`|`), or a
semi-colon (";") are used as separators instead of a comma, although semi-colon (`;`) are used as separators instead of a comma, although
other symbols can be used. Because CSV is a text-only format, it doesn't other symbols can be used. Because CSV is a text-only format, it doesn't
support any data formatting options. support any data formatting options.

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -0,0 +1,15 @@
# Useful links and tools
There are some links and tools which are very useful when developing
using PhpSpreadsheet.
## OpenXML / SpreadsheetML
- [File format
documentation](http://www.ecma-international.org/news/TC45_current_work/TC45_available_docs.htm)
- [OpenXML Explained
e-book](http://openxmldeveloper.org/articles/1970.aspx)
- [Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint
2007 File
Formats](http://www.microsoft.com/downloads/details.aspx?familyid=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displaylang=en)
- [OpenXML Package Explorer](http://www.codeplex.com/PackageExplorer/)

View File

@ -0,0 +1,108 @@
# Memory saving
PhpSpreadsheet uses an average of about 1k per cell in your worksheets, so
large workbooks can quickly use up available memory. Cell caching
provides a mechanism that allows PhpSpreadsheet to maintain the cell
objects in a smaller size of memory, or off-memory (eg: on disk, in APCu,
memcache or redis). This allows you to reduce the memory usage for large
workbooks, although at a cost of speed to access cell data.
By default, PhpSpreadsheet holds all cell objects in memory, but
you can specify alternatives by providing your own
[PSR-16](http://www.php-fig.org/psr/psr-16/) implementation. PhpSpreadsheet keys
are automatically namespaced, and cleaned up after use, so a single cache
instance may be shared across several usage of PhpSpreadsheet or even with other
cache usages.
To enable cell caching, you must provide your own implementation of cache like so:
``` php
$cache = new MyCustomPsr16Implementation();
\PhpOffice\PhpSpreadsheet\Settings::setCache($cache);
```
A separate cache is maintained for each individual worksheet, and is
automatically created when the worksheet is instantiated based on the
settings that you have configured. You cannot change
the configuration settings once you have started to read a workbook, or
have created your first worksheet.
## Beware of TTL
As opposed to common cache concept, PhpSpreadsheet data cannot be re-generated
from scratch. If some data is stored and later is not retrievable,
PhpSpreadsheet will throw an exception.
That means that the data stored in cache **must not be deleted** by a
third-party or via TTL mechanism.
So be sure that TTL is either de-activated or long enough to cover the entire
usage of PhpSpreadsheet.
## Common use cases
PhpSpreadsheet does not ship with alternative cache implementation. It is up to
you to select the most appropriate implementation for your environnement. You
can either implement [PSR-16](http://www.php-fig.org/psr/psr-16/) from scratch,
or use [pre-existing libraries](https://packagist.org/search/?q=psr-16).
One such library is [PHP Cache](http://www.php-cache.com/) which
provides a wide range of alternatives. Refers to their documentation for
details, but here are a few suggestions that should get you started.
### APCu
Require the packages into your project:
```sh
composer require cache/simple-cache-bridge cache/apcu-adapter
```
Configure PhpSpreadsheet with something like:
```php
$pool = new \Cache\Adapter\Apcu\ApcuCachePool();
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
```
### Redis
Require the packages into your project:
```sh
composer require cache/simple-cache-bridge cache/redis-adapter
```
Configure PhpSpreadsheet with something like:
```php
$client = new \Redis();
$client->connect('127.0.0.1', 6379);
$pool = new \Cache\Adapter\Redis\RedisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
```
### Memcache
Require the packages into your project:
```sh
composer require cache/simple-cache-bridge cache/memcache-adapter
```
Configure PhpSpreadsheet with something like:
```php
$client = new \Memcache();
$client->connect('localhost', 11211);
$pool = new \Cache\Adapter\Memcache\MemcacheCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
```

View File

@ -132,3 +132,63 @@ to do is to specify a renderer like so:
$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF; $rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF;
\PhpOffice\PhpSpreadsheet\Settings::setPdfRendererName($rendererName); \PhpOffice\PhpSpreadsheet\Settings::setPdfRendererName($rendererName);
``` ```
## PclZip and ZipArchive
Support for PclZip were dropped in favor of the more complete and modern
[PHP extension ZipArchive](http://php.net/manual/en/book.zip.php).
So the following were removed:
- `PclZip`
- `PHPExcel_Settings::setZipClass()`
- `PHPExcel_Settings::getZipClass()`
- `PHPExcel_Shared_ZipArchive`
- `PHPExcel_Shared_ZipStreamWrapper`
## Cell caching
Cell caching was heavily refactored to leverage
[PSR-16](http://www.php-fig.org/psr/psr-16/). That means most classes
related to that feature were removed:
- `PHPExcel_CachedObjectStorage_APC`
- `PHPExcel_CachedObjectStorage_DiscISAM`
- `PHPExcel_CachedObjectStorage_ICache`
- `PHPExcel_CachedObjectStorage_Igbinary`
- `PHPExcel_CachedObjectStorage_Memcache`
- `PHPExcel_CachedObjectStorage_Memory`
- `PHPExcel_CachedObjectStorage_MemoryGZip`
- `PHPExcel_CachedObjectStorage_MemorySerialized`
- `PHPExcel_CachedObjectStorage_PHPTemp`
- `PHPExcel_CachedObjectStorage_SQLite`
- `PHPExcel_CachedObjectStorage_SQLite3`
- `PHPExcel_CachedObjectStorage_Wincache`
In addition to that, `\PhpOffice\PhpSpreadsheet::getCellCollection()` was renamed
to `\PhpOffice\PhpSpreadsheet::getCoordinates()` and
`\PhpOffice\PhpSpreadsheet::getCellCacheController()` to
`\PhpOffice\PhpSpreadsheet::getCellCollection()` for clarity.
Refer to [the new documentation](./memory_saving.md) to see how to migrate.
## Dropped conditionally returned cell
For all the following methods, it is no more possible to change the type of
returned value. It always return the Worksheet and never the Cell or Rule:
- Worksheet::setCellValue()
- Worksheet::setCellValueByColumnAndRow()
- Worksheet::setCellValueExplicit()
- Worksheet::setCellValueExplicitByColumnAndRow()
- Worksheet::addRule()
Migration would be similar to:
``` php
// Before
$cell = $worksheet->setCellValue('A1', 'value', true);
// After
$cell = $worksheet->getCell('A1')->setValue('value');
```

View File

@ -0,0 +1,839 @@
# Reading and writing to file
As you already know from the [architecture](./architecture.md#readers-and-writers),
reading and writing to a
persisted storage is not possible using the base PhpSpreadsheet classes.
For this purpose, PhpSpreadsheet provides readers and writers, which are
implementations of \PhpOffice\PhpSpreadsheet\Reader\IReader and
\PhpOffice\PhpSpreadsheet\Writer\IWriter.
## \PhpOffice\PhpSpreadsheet\IOFactory
The PhpSpreadsheet API offers multiple methods to create a
\PhpOffice\PhpSpreadsheet\Reader\IReader or
\PhpOffice\PhpSpreadsheet\Writer\IWriter instance:
Direct creation via \PhpOffice\PhpSpreadsheet\IOFactory. All examples
underneath demonstrate the direct creation method. Note that you can
also use the \PhpOffice\PhpSpreadsheet\IOFactory class to do this.
### Creating \PhpOffice\PhpSpreadsheet\Reader\IReader using \PhpOffice\PhpSpreadsheet\IOFactory
There are 2 methods for reading in a file into PhpSpreadsheet: using
automatic file type resolving or explicitly.
Automatic file type resolving checks the different
\PhpOffice\PhpSpreadsheet\Reader\IReader distributed with
PhpSpreadsheet. If one of them can load the specified file name, the
file is loaded using that \PhpOffice\PhpSpreadsheet\Reader\IReader.
Explicit mode requires you to specify which
\PhpOffice\PhpSpreadsheet\Reader\IReader should be used.
You can create a \PhpOffice\PhpSpreadsheet\Reader\IReader instance using
\PhpOffice\PhpSpreadsheet\IOFactory in automatic file type resolving
mode using the following code sample:
``` php
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("05featuredemo.xlsx");
```
A typical use of this feature is when you need to read files uploaded by
your users, and you dont know whether they are uploading xls or xlsx
files.
If you need to set some properties on the reader, (e.g. to only read
data, see more about this later), then you may instead want to use this
variant:
``` php
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("05featuredemo.xlsx");
$reader->setReadDataOnly(true);
$reader->load("05featuredemo.xlsx");
```
You can create a \PhpOffice\PhpSpreadsheet\Reader\IReader instance using
\PhpOffice\PhpSpreadsheet\IOFactory in explicit mode using the following
code sample:
``` php
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx");
$spreadsheet = $reader->load("05featuredemo.xlsx");
```
Note that automatic type resolving mode is slightly slower than explicit
mode.
### Creating \PhpOffice\PhpSpreadsheet\Writer\IWriter using \PhpOffice\PhpSpreadsheet\IOFactory
You can create a PhpOffice\PhpSpreadsheet\Writer\IWriter instance using
\PhpOffice\PhpSpreadsheet\IOFactory:
``` php
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, "Xlsx");
$writer->save("05featuredemo.xlsx");
```
## Excel 2007 (SpreadsheetML) file format
Xlsx file format is the main file format of PhpSpreadsheet. It allows
outputting the in-memory spreadsheet to a .xlsx file.
### \PhpOffice\PhpSpreadsheet\Reader\Xlsx
#### Reading a spreadsheet
You can read an .xlsx file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load("05featuredemo.xlsx");
```
#### Read data only
You can set the option setReadDataOnly on the reader, to instruct the
reader to ignore styling, data validation, … and just read cell data:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("05featuredemo.xlsx");
```
#### Read specific sheets only
You can set the option setLoadSheetsOnly on the reader, to instruct the
reader to only load the sheets with a given name:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setLoadSheetsOnly( array("Sheet 1", "My special sheet") );
$spreadsheet = $reader->load("05featuredemo.xlsx");
```
#### Read specific cells only
You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
\PhpOffice\PhpSpreadsheet\Reader\IReadFilter. By default, all cells are
read using the \PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter.
The following code will only read row 1 and rows 20 30 of any sheet in
the Excel file:
``` php
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xlsx");
```
### \PhpOffice\PhpSpreadsheet\Writer\Xlsx
#### Writing a spreadsheet
You can write an .xlsx file using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save("05featuredemo.xlsx");
```
#### Formula pre-calculation
By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.xlsx");
```
#### Office 2003 compatibility pack
Because of a bug in the Office2003 compatibility pack, there can be some
small issues when opening Xlsx spreadsheets (mostly related to formula
calculation). You can enable Office2003 compatibility with the following
code:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->setOffice2003Compatibility(true);
$writer->save("05featuredemo.xlsx");
**Office2003 compatibility should only be used when needed** Office2003
compatibility option should only be used when needed. This option
disables several Office2007 file format options, resulting in a
lower-featured Office2007 spreadsheet when this option is used.
## Excel 5 (BIFF) file format
Xls file format is the old Excel file format, implemented in
PhpSpreadsheet to provide a uniform manner to create both .xlsx and .xls
files. It is basically a modified version of [PEAR
Spreadsheet\_Excel\_Writer](http://pear.php.net/package/Spreadsheet_Excel_Writer),
although it has been extended and has fewer limitations and more
features than the old PEAR library. This can read all BIFF versions that
use OLE2: BIFF5 (introduced with office 95) through BIFF8, but cannot
read earlier versions.
Xls file format will not be developed any further, it just provides an
additional file format for PhpSpreadsheet.
**Excel5 (BIFF) limitations** Please note that BIFF file format has some
limits regarding to styling cells and handling large spreadsheets via
PHP.
### \PhpOffice\PhpSpreadsheet\Reader\Xls
#### Reading a spreadsheet
You can read an .xls file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
$spreadsheet = $reader->load("05featuredemo.xls");
```
#### Read data only
You can set the option setReadDataOnly on the reader, to instruct the
reader to ignore styling, data validation, … and just read cell data:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("05featuredemo.xls");
```
#### Read specific sheets only
You can set the option setLoadSheetsOnly on the reader, to instruct the
reader to only load the sheets with a given name:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
$reader->setLoadSheetsOnly( array("Sheet 1", "My special sheet") );
$spreadsheet = $reader->load("05featuredemo.xls");
```
#### Read specific cells only
You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
\PhpOffice\PhpSpreadsheet\Reader\IReadFilter. By default, all cells are
read using the \PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter.
The following code will only read row 1 and rows 20 to 30 of any sheet
in the Excel file:
``` php
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xls");
```
### \PhpOffice\PhpSpreadsheet\Writer\Xls
#### Writing a spreadsheet
You can write an .xls file using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet);
$writer->save("05featuredemo.xls");
```
## Excel 2003 XML file format
Excel 2003 XML file format is a file format which can be used in older
versions of Microsoft Excel.
**Excel 2003 XML limitations** Please note that Excel 2003 XML format
has some limits regarding to styling cells and handling large
spreadsheets via PHP.
### \PhpOffice\PhpSpreadsheet\Reader\Xml
#### Reading a spreadsheet
You can read an Excel 2003 .xml file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml();
$spreadsheet = $reader->load("05featuredemo.xml");
```
#### Read specific cells only
You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
\PhpOffice\PhpSpreadsheet\Reader\IReadFilter. By default, all cells are
read using the \PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter.
The following code will only read row 1 and rows 20 to 30 of any sheet
in the Excel file:
``` php
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xml");
```
## Symbolic LinK (SYLK)
Symbolic Link (SYLK) is a Microsoft file format typically used to
exchange data between applications, specifically spreadsheets. SYLK
files conventionally have a .slk suffix. Composed of only displayable
ANSI characters, it can be easily created and processed by other
applications, such as databases.
**SYLK limitations** Please note that SYLK file format has some limits
regarding to styling cells and handling large spreadsheets via PHP.
### \PhpOffice\PhpSpreadsheet\Reader\Slk
#### Reading a spreadsheet
You can read an .slk file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk();
$spreadsheet = $reader->load("05featuredemo.slk");
```
#### Read specific cells only
You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
\PhpOffice\PhpSpreadsheet\Reader\IReadFilter. By default, all cells are
read using the \PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter.
The following code will only read row 1 and rows 20 to 30 of any sheet
in the SYLK file:
``` php
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.slk");
```
## Open/Libre Office (.ods)
Open Office or Libre Office .ods files are the standard file format for
Open Office or Libre Office Calc files.
### \PhpOffice\PhpSpreadsheet\Reader\Ods
#### Reading a spreadsheet
You can read an .ods file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods();
$spreadsheet = $reader->load("05featuredemo.ods");
```
#### Read specific cells only
You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
\PhpOffice\PhpSpreadsheet\Reader\IReadFilter. By default, all cells are
read using the \PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter.
The following code will only read row 1 and rows 20 to 30 of any sheet
in the Calc file:
``` php
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new PhpOffice\PhpSpreadsheet\Reader\Ods();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.ods");
```
## CSV (Comma Separated Values)
CSV (Comma Separated Values) are often used as an import/export file
format with other systems. PhpSpreadsheet allows reading and writing to
CSV files.
**CSV limitations** Please note that CSV file format has some limits
regarding to styling cells, number formatting, ...
### \PhpOffice\PhpSpreadsheet\Reader\Csv
#### Reading a CSV file
You can read a .csv file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
$spreadsheet = $reader->load("sample.csv");
```
#### Setting CSV options
Often, CSV files are not really "comma separated", or use semicolon (`;`)
as a separator. You can instruct
\PhpOffice\PhpSpreadsheet\Reader\Csv some options before reading a CSV
file.
The separator will be auto-detected, so in most cases it should not be necessary
to specify it. But in cases where auto-detection does not fit the use-case, then
it can be set manually.
Note that \PhpOffice\PhpSpreadsheet\Reader\Csv by default assumes that
the loaded CSV file is UTF-8 encoded. If you are reading CSV files that
were created in Microsoft Office Excel the correct input encoding may
rather be Windows-1252 (CP1252). Always make sure that the input
encoding is set appropriately.
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
$reader->setInputEncoding('CP1252');
$reader->setDelimiter(';');
$reader->setEnclosure('');
$reader->setLineEnding("\r\n");
$reader->setSheetIndex(0);
$spreadsheet = $reader->load("sample.csv");
```
#### Read a specific worksheet
CSV files can only contain one worksheet. Therefore, you can specify
which sheet to read from CSV:
``` php
$reader->setSheetIndex(0);
```
#### Read into existing spreadsheet
When working with CSV files, it might occur that you want to import CSV
data into an existing `Spreadsheet` object. The following code loads a
CSV file into an existing `$spreadsheet` containing some sheets, and
imports onto the 6th sheet:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
$reader->setDelimiter(';');
$reader->setEnclosure('');
$reader->setLineEnding("\r\n");
$reader->setSheetIndex(5);
$reader->loadIntoExisting("05featuredemo.csv", $spreadsheet);
```
### \PhpOffice\PhpSpreadsheet\Writer\Csv
#### Writing a CSV file
You can write a .csv file using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
$writer->save("05featuredemo.csv");
```
#### Setting CSV options
Often, CSV files are not really "comma separated", or use semicolon (`;`)
as a separator. You can instruct
\PhpOffice\PhpSpreadsheet\Writer\Csv some options before writing a CSV
file:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
$writer->setDelimiter(';');
$writer->setEnclosure('');
$writer->setLineEnding("\r\n");
$writer->setSheetIndex(0);
$writer->save("05featuredemo.csv");
```
#### Write a specific worksheet
CSV files can only contain one worksheet. Therefore, you can specify
which sheet to write to CSV:
``` php
$writer->setSheetIndex(0);
```
#### Formula pre-calculation
By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.csv");
```
#### Writing UTF-8 CSV files
A CSV file can be marked as UTF-8 by writing a BOM file header. This can
be enabled by using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
$writer->setUseBOM(true);
$writer->save("05featuredemo.csv");
```
#### Decimal and thousands separators
If the worksheet you are exporting contains numbers with decimal or
thousands separators then you should think about what characters you
want to use for those before doing the export.
By default PhpSpreadsheet looks up in the server's locale settings to
decide what characters to use. But to avoid problems it is recommended
to set the characters explicitly as shown below.
English users will want to use this before doing the export:
``` php
\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setDecimalSeparator('.');
\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setThousandsSeparator(',');
```
German users will want to use the opposite values.
``` php
\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setDecimalSeparator(',');
\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setThousandsSeparator('.');
```
Note that the above code sets decimal and thousand separators as global
options. This also affects how HTML and PDF is exported.
## HTML
PhpSpreadsheet allows you to read or write a spreadsheet as HTML format,
for quick representation of the data in it to anyone who does not have a
spreadsheet application on their PC, or loading files saved by other
scripts that simply create HTML markup and give it a .xls file
extension.
**HTML limitations** Please note that HTML file format has some limits
regarding to styling cells, number formatting, ...
### \PhpOffice\PhpSpreadsheet\Reader\Html
#### Reading a spreadsheet
You can read an .html or .htm file using the following code:
``` php
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Html();
$spreadsheet = $reader->load("05featuredemo.html");
```
**HTML limitations** Please note that HTML reader is still experimental
and does not yet support merged cells or nested tables cleanly
### \PhpOffice\PhpSpreadsheet\Writer\Html
Please note that \PhpOffice\PhpSpreadsheet\Writer\Html only outputs the
first worksheet by default.
#### Writing a spreadsheet
You can write a .htm file using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet);
$writer->save("05featuredemo.htm");
```
#### Write all worksheets
HTML files can contain one or more worksheets. If you want to write all
sheets into a single HTML file, use the following code:
``` php
$writer->writeAllSheets();
```
#### Write a specific worksheet
HTML files can contain one or more worksheets. Therefore, you can
specify which sheet to write to HTML:
``` php
$writer->setSheetIndex(0);
```
#### Setting the images root of the HTML file
There might be situations where you want to explicitly set the included
images root. For example, one might want to see
``` html
<img style="position: relative; left: 0px; top: 0px; width: 140px; height: 78px;" src="http://www.domain.com/*images/logo.jpg" border="0">
```
instead of
``` html
<img style="position: relative; left: 0px; top: 0px; width: 140px; height: 78px;" src="./images/logo.jpg" border="0">.
```
You can use the following code to achieve this result:
``` php
$writer->setImagesRoot('http://www.example.com');
```
#### Formula pre-calculation
By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.htm");
```
#### Embedding generated HTML in a web page
There might be a situation where you want to embed the generated HTML in
an existing website. \PhpOffice\PhpSpreadsheet\Writer\Html provides
support to generate only specific parts of the HTML code, which allows
you to use these parts in your website.
Supported methods:
- `generateHTMLHeader()`
- `generateStyles()`
- `generateSheetData()`
- `generateHTMLFooter()`
Here's an example which retrieves all parts independently and merges
them into a resulting HTML page:
``` php
<?php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet);
echo $writer->generateHTMLHeader();
?>
<style>
<!--
html {
font-family: Times New Roman;
font-size: 9pt;
background-color: white;
}
<?php
echo $writer->generateStyles(false); // do not write <style> and </style>
?>
-->
</style>
<?php
echo $writer->generateSheetData();
echo $writer->generateHTMLFooter();
?>
```
#### Writing UTF-8 HTML files
A HTML file can be marked as UTF-8 by writing a BOM file header. This
can be enabled by using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet);
$writer->setUseBOM(true);
$writer->save("05featuredemo.htm");
```
#### Decimal and thousands separators
See section \PhpOffice\PhpSpreadsheet\Writer\Csv how to control the
appearance of these.
## PDF
PhpSpreadsheet allows you to write a spreadsheet into PDF format, for
fast distribution of represented data.
**PDF limitations** Please note that PDF file format has some limits
regarding to styling cells, number formatting, ...
### \PhpOffice\PhpSpreadsheet\Writer\Pdf
PhpSpreadsheets PDF Writer is a wrapper for a 3rd-Party PDF Rendering
library such as tcPDF, mPDF or DomPDF. You must now install a PDF
rendering library yourself; but PhpSpreadsheet will work with a number
of different libraries.
Currently, the following libraries are supported:
Library | Downloadable from | PhpSpreadsheet Internal Constant
--------|-------------------------------------|---------------------------------
tcPDF | https://github.com/tecnickcom/tcpdf | PDF_RENDERER_TCPDF
mPDF | https://github.com/mpdf/mpdf | PDF_RENDERER_MPDF
domPDF | https://github.com/dompdf/dompdf | PDF_RENDERER_DOMPDF
The different libraries have different strengths and weaknesses. Some
generate better formatted output than others, some are faster or use
less memory than others, while some generate smaller .pdf files. It is
the developers choice which one they wish to use, appropriate to their
own circumstances.
Before instantiating a Writer to generate PDF output, you will need to
indicate which Rendering library you are using.
``` php
$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF;
\PhpOffice\PhpSpreadsheet\Settings::setPdfRendererName($rendererName);
```
#### Writing a spreadsheet
Once you have identified the Renderer that you wish to use for PDF
generation, you can write a .pdf file using the following code:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf($spreadsheet);
$writer->save("05featuredemo.pdf");
```
Please note that \PhpOffice\PhpSpreadsheet\Writer\Pdf only outputs the
first worksheet by default.
#### Write all worksheets
PDF files can contain one or more worksheets. If you want to write all
sheets into a single PDF file, use the following code:
``` php
$writer->writeAllSheets();
```
#### Write a specific worksheet
PDF files can contain one or more worksheets. Therefore, you can specify
which sheet to write to PDF:
``` php
$writer->setSheetIndex(0);
```
#### Formula pre-calculation
By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:
``` php
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.pdf");
```
#### Decimal and thousands separators
See section \PhpOffice\PhpSpreadsheet\Writer\Csv how to control the
appearance of these.
## Generating Excel files from templates (read, modify, write)
Readers and writers are the tools that allow you to generate Excel files
from templates. This requires less coding effort than generating the
Excel file from scratch, especially if your template has many styles,
page setup properties, headers etc.
Here is an example how to open a template file, fill in a couple of
fields and save it again:
``` php
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
$worksheet->getCell('A1')->setValue('John');
$worksheet->getCell('A2')->setValue('Smith');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls');
```
Notice that it is ok to load an xlsx file and generate an xls file.

View File

@ -12,14 +12,13 @@ spreadsheet files. This can lead to:
- Server Side Request Forgery - Server Side Request Forgery
- Command Execution (depending on the installed PHP wrappers) - Command Execution (depending on the installed PHP wrappers)
To prevent this, PhpSpreadsheet sets `libxml_disable_entity_loader` to To prevent this, by default every XML-based Reader looks for XML entities declared inside the DOCTYPE and if any is found an exception is raised.
`true` for the XML-based Readers by default.
## Loading a Spreadsheet File ## Loading a Spreadsheet File
The simplest way to load a workbook file is to let PhpSpreadsheet's IO The simplest way to load a workbook file is to let PhpSpreadsheet's IO
Factory identify the file type and load it, calling the static load() Factory identify the file type and load it, calling the static `load()`
method of the \PhpOffice\PhpSpreadsheet\IOFactory class. method of the `\PhpOffice\PhpSpreadsheet\IOFactory` class.
``` php ``` php
$inputFileName = './sampleData/example1.xls'; $inputFileName = './sampleData/example1.xls';
@ -31,7 +30,7 @@ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
> See Examples/Reader/exampleReader01.php for a working example of this > See Examples/Reader/exampleReader01.php for a working example of this
> code. > code.
The load() method will attempt to identify the file type, and The `load()` method will attempt to identify the file type, and
instantiate a loader for that file type; using it to load the file and instantiate a loader for that file type; using it to load the file and
store the data and any formatting in a `Spreadsheet` object. store the data and any formatting in a `Spreadsheet` object.
@ -52,7 +51,7 @@ actually reading the file into a `Spreadsheet` object.
If you know the file type of the spreadsheet file that you need to load, If you know the file type of the spreadsheet file that you need to load,
you can instantiate a new reader object for that file type, then use the you can instantiate a new reader object for that file type, then use the
reader's load() method to read the file to a `Spreadsheet` object. It is reader's `load()` method to read the file to a `Spreadsheet` object. It is
possible to instantiate the reader objects for each of the different possible to instantiate the reader objects for each of the different
supported filetype by name. However, you may get unpredictable results supported filetype by name. However, you may get unpredictable results
if the file isn't of the right type (e.g. it is a CSV with an extension if the file isn't of the right type (e.g. it is a CSV with an extension
@ -76,7 +75,7 @@ $spreadsheet = $reader->load($inputFileName);
> See Examples/Reader/exampleReader02.php for a working example of this > See Examples/Reader/exampleReader02.php for a working example of this
> code. > code.
Alternatively, you can use the IO Factory's createReader() method to Alternatively, you can use the IO Factory's `createReader()` method to
instantiate the reader object for you, simply telling it the file type instantiate the reader object for you, simply telling it the file type
of the reader that you want instantiating. of the reader that you want instantiating.
@ -121,7 +120,7 @@ $spreadsheet = $reader->load($inputFileName);
Once you have created a reader object for the workbook that you want to Once you have created a reader object for the workbook that you want to
load, you have the opportunity to set additional options before load, you have the opportunity to set additional options before
executing the load() method. executing the `load()` method.
### Reading Only Data from a Spreadsheet File ### Reading Only Data from a Spreadsheet File
@ -173,7 +172,7 @@ setLoadSheetsOnly() method to identify those sheets you are interested
in reading. in reading.
To read a single sheet, you can pass that sheet name as a parameter to To read a single sheet, you can pass that sheet name as a parameter to
the setLoadSheetsOnly() method. the `setLoadSheetsOnly()` method.
``` php ``` php
$inputFileType = 'Xls'; $inputFileType = 'Xls';
@ -192,7 +191,7 @@ $spreadsheet = $reader->load($inputFileName);
> code. > code.
If you want to read more than just a single sheet, you can pass a list If you want to read more than just a single sheet, you can pass a list
of sheet names as an array parameter to the setLoadSheetsOnly() method. of sheet names as an array parameter to the `setLoadSheetsOnly()` method.
``` php ``` php
$inputFileType = 'Xls'; $inputFileType = 'Xls';
@ -210,7 +209,7 @@ $spreadsheet = $reader->load($inputFileName);
> See Examples/Reader/exampleReader08.php for a working example of this > See Examples/Reader/exampleReader08.php for a working example of this
> code. > code.
To reset this option to the default, you can call the setLoadAllSheets() To reset this option to the default, you can call the `setLoadAllSheets()`
method. method.
``` php ``` php
@ -242,8 +241,8 @@ If you are only interested in reading part of a worksheet, then you can
write a filter class that identifies whether or not individual cells write a filter class that identifies whether or not individual cells
should be read by the loader. A read filter must implement the should be read by the loader. A read filter must implement the
\PhpOffice\PhpSpreadsheet\Reader\IReadFilter interface, and contain a \PhpOffice\PhpSpreadsheet\Reader\IReadFilter interface, and contain a
readCell() method that accepts arguments of \$column, \$row and readCell() method that accepts arguments of `$column`, `$row` and
\$worksheetName, and return a boolean true or false that indicates `$worksheetName`, and return a boolean true or false that indicates
whether a workbook cell identified by those arguments should be read or whether a workbook cell identified by those arguments should be read or
not. not.
@ -320,7 +319,7 @@ $filterSubset = new MyReadFilter(9,15,range('G','K'));
> code. > code.
This can be particularly useful for conserving memory, by allowing you This can be particularly useful for conserving memory, by allowing you
to read and process a large workbook in “chunks”: an example of this to read and process a large workbook in "chunks": an example of this
usage might be when transferring data from an Excel worksheet to a usage might be when transferring data from an Excel worksheet to a
database. database.
@ -387,13 +386,13 @@ CSV | YES | HTML | NO | | |
### Combining Multiple Files into a Single Spreadsheet Object ### Combining Multiple Files into a Single Spreadsheet Object
While you can limit the number of worksheets that are read from a While you can limit the number of worksheets that are read from a
workbook file using the setLoadSheetsOnly() method, certain readers also workbook file using the `setLoadSheetsOnly()` method, certain readers also
allow you to combine several individual "sheets" from different files allow you to combine several individual "sheets" from different files
into a single `Spreadsheet` object, where each individual file is a into a single `Spreadsheet` object, where each individual file is a
single worksheet within that workbook. For each file that you read, you single worksheet within that workbook. For each file that you read, you
need to indicate which worksheet index it should be loaded into using need to indicate which worksheet index it should be loaded into using
the setSheetIndex() method of the \$reader, then use the the `setSheetIndex()` method of the `$reader`, then use the
loadIntoExisting() method rather than the load() method to actually read `loadIntoExisting()` method rather than the `load()` method to actually read
the file into that worksheet. the file into that worksheet.
``` php ``` php
@ -451,9 +450,9 @@ Xlsx Microsoft Office Open XML SpreadsheetML .xlsx file is limited to
by available disk space. This means that we wouldnt ordinarily be able by available disk space. This means that we wouldnt ordinarily be able
to read all the rows from a very large CSV file that exceeded those to read all the rows from a very large CSV file that exceeded those
limits, and save it as an Xls or Xlsx file. However, by using Read limits, and save it as an Xls or Xlsx file. However, by using Read
Filters to read the CSV file in “chunks” (using the chunkReadFilter Filters to read the CSV file in "chunks" (using the chunkReadFilter
Class that we defined in section REF \_Ref275604563 \r \p 5.3 above), Class that we defined in [the above section](#reading-only-specific-columns-and-rows-from-a-file-read-filters),
and the setSheetIndex() method of the \$reader, we can split the CSV and the `setSheetIndex()` method of the `$reader`, we can split the CSV
file across several individual worksheets. file across several individual worksheets.
``` php ``` php
@ -504,7 +503,7 @@ for ($startRow = 2; $startRow <= 1000000; $startRow += $chunkSize) {
This code will read 65,530 rows at a time from the CSV file that were This code will read 65,530 rows at a time from the CSV file that were
loading, and store each "chunk" in a new worksheet. loading, and store each "chunk" in a new worksheet.
The setContiguous() method for the Reader is important here. It is The `setContiguous()` method for the Reader is important here. It is
applicable only when working with a Read Filter, and identifies whether applicable only when working with a Read Filter, and identifies whether
or not the cells should be stored by their position within the CSV file, or not the cells should be stored by their position within the CSV file,
or their position relative to the filter. or their position relative to the filter.
@ -524,15 +523,17 @@ CSV | YES | HTML | NO
### Pipe or Tab Separated Value Files ### Pipe or Tab Separated Value Files
The CSV loader defaults to loading a file where comma is used as the The CSV loader will attempt to auto-detect the separator used in the file. If it
separator, but you can modify this to load tab- or pipe-separated value cannot auto-detect, it will default to the comma. If this does not fit your
files using the setDelimiter() method. use-case, you can manually specify a separator by using the `setDelimiter()`
method.
``` php ``` php
$inputFileType = 'Csv'; $inputFileType = 'Csv';
$inputFileName = './sampleData/example1.tsv'; $inputFileName = './sampleData/example1.tsv';
/** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Create a new Reader of the type defined in $inputFileType **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/** Set the delimiter to a TAB character **/ /** Set the delimiter to a TAB character **/
$reader->setDelimiter("\t"); $reader->setDelimiter("\t");
// $reader->setDelimiter('|'); // $reader->setDelimiter('|');
@ -547,8 +548,11 @@ $spreadsheet = $reader->load($inputFileName);
In addition to the delimiter, you can also use the following methods to In addition to the delimiter, you can also use the following methods to
set other attributes for the data load: set other attributes for the data load:
setEnclosure() | default is " setLineEnding() | default is PHP\_EOL Method | Default
setInputEncoding() | default is UTF-8 -------------------|----------
setEnclosure() | `"`
setLineEnding() | `PHP_EOL`
setInputEncoding() | `UTF-8`
Setting CSV delimiter applies to: Setting CSV delimiter applies to:

View File

@ -5,8 +5,8 @@ Please note that these do NOT offer complete documentation on specific
PhpSpreadsheet API functions, but just a bump to get you started. If you PhpSpreadsheet API functions, but just a bump to get you started. If you
need specific API functions, please refer to the API documentation. need specific API functions, please refer to the API documentation.
For example, REF \_Ref191885321 \w \h 4.4.7 REF \_Ref191885321 For example, [setting a worksheet's page orientation and size
\h Setting a worksheet's page orientation and size covers setting a page ](#setting-a-worksheets-page-orientation-and-size) covers setting a page
orientation to A4. Other paper formats, like US Letter, are not covered orientation to A4. Other paper formats, like US Letter, are not covered
in this document, but in the PhpSpreadsheet API documentation. in this document, but in the PhpSpreadsheet API documentation.
@ -119,9 +119,9 @@ in an English version of Microsoft Office Excel, and PhpSpreadsheet
handles all formulae internally in this format. This means that the handles all formulae internally in this format. This means that the
following rules hold: following rules hold:
- Decimal separator is '.' (period) - Decimal separator is `.` (period)
- Function argument separator is ',' (comma) - Function argument separator is `,` (comma)
- Matrix row separator is ';' (semicolon) - Matrix row separator is `;` (semicolon)
- English function names must be used - English function names must be used
This is regardless of which language version of Microsoft Office Excel This is regardless of which language version of Microsoft Office Excel
@ -132,16 +132,16 @@ will take care of displaying the formula according the applications
language. Translation is taken care of by the application! language. Translation is taken care of by the application!
The following line of code writes the formula The following line of code writes the formula
'=IF(C4&gt;500,"profit","loss")' into the cell B8. Note that the `=IF(C4&gt;500,"profit","loss")` into the cell B8. Note that the
formula must start with "=" to make PhpSpreadsheet recognise this as a formula must start with `=` to make PhpSpreadsheet recognise this as a
formula. formula.
``` php ``` php
$spreadsheet->getActiveSheet()->setCellValue('B8','=IF(C4>500,"profit","loss")'); $spreadsheet->getActiveSheet()->setCellValue('B8','=IF(C4>500,"profit","loss")');
``` ```
If you want to write a string beginning with an "=" character to a If you want to write a string beginning with an `=` character to a
cell, then you should use the setCellValueExplicit() method. cell, then you should use the `setCellValueExplicit()` method.
``` php ``` php
$spreadsheet->getActiveSheet() $spreadsheet->getActiveSheet()
@ -159,7 +159,7 @@ $formula = $spreadsheet->getActiveSheet()->getCell('B8')->getValue();
``` ```
If you need the calculated value of a cell, use the following code. This If you need the calculated value of a cell, use the following code. This
is further explained in REF \_Ref191885372 \w \h \* MERGEFORMAT 4.4.35. is further explained in [the calculation engine](./calculation-engine.md).
``` php ``` php
$value = $spreadsheet->getActiveSheet()->getCell('B8')->getCalculatedValue(); $value = $spreadsheet->getActiveSheet()->getCell('B8')->getCalculatedValue();
@ -239,7 +239,7 @@ $spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment()->setWrapText(true
**Tip** **Tip**
Read more about formatting cells using getStyle() elsewhere. Read more about formatting cells using `getStyle()` elsewhere.
**Tip** **Tip**
@ -332,7 +332,7 @@ $spreadsheet->getActiveSheet()->getPageSetup()->setFitToHeight(0);
As you can see, it is not necessary to call setFitToPage(TRUE) since As you can see, it is not necessary to call setFitToPage(TRUE) since
setFitToWidth(...) and setFitToHeight(...) triggers this. setFitToWidth(...) and setFitToHeight(...) triggers this.
If you use setFitToWidth() you should in general also specify If you use `setFitToWidth()` you should in general also specify
setFitToHeight() explicitly like in the example. Be careful relying on setFitToHeight() explicitly like in the example. Be careful relying on
the initial values. the initial values.
@ -474,7 +474,9 @@ $spreadsheet->getActiveSheet()->setBreak( 'D10' , \PhpOffice\PhpSpreadsheet\Work
To show/hide gridlines when printing, use the following code: To show/hide gridlines when printing, use the following code:
\$spreadsheet-&gt;getActiveSheet()-&gt;setShowGridlines(true); ```php
$spreadsheet->getActiveSheet()->setShowGridlines(true);
```
### Setting rows/columns to repeat at top/left ### Setting rows/columns to repeat at top/left
@ -738,7 +740,7 @@ vertical/horizontal, left/right/top/bottom/diagonal.
This border hierarchy can be utilized to achieve various effects in an This border hierarchy can be utilized to achieve various effects in an
easy manner. easy manner.
### Valid array keys for style applyFromArray() ### Valid array keys for style `applyFromArray()`
The following table lists the valid array keys for The following table lists the valid array keys for
\PhpOffice\PhpSpreadsheet\Style applyFromArray() classes. If the "Maps \PhpOffice\PhpSpreadsheet\Style applyFromArray() classes. If the "Maps
@ -1001,15 +1003,15 @@ $validation->setFormula1('"Item A,Item B,Item C"');
``` ```
When using a data validation list like above, make sure you put the list When using a data validation list like above, make sure you put the list
between " and " and that you split the items with a comma (,). between `"` and `"` and that you split the items with a comma (`,`).
It is important to remember that any string participating in an Excel It is important to remember that any string participating in an Excel
formula is allowed to be maximum 255 characters (not bytes). This sets a formula is allowed to be maximum 255 characters (not bytes). This sets a
limit on how many items you can have in the string "Item A,Item B,Item limit on how many items you can have in the string "Item A,Item B,Item
C". Therefore it is normally a better idea to type the item values C". Therefore it is normally a better idea to type the item values
directly in some cell range, say A1:A3, and instead use, say, directly in some cell range, say A1:A3, and instead use, say,
$validation->setFormula1('Sheet!$A$1:$A\$3');. Another benefit is that `$validation->setFormula1('Sheet!$A$1:$A$3')`. Another benefit is that
the item values themselves can contain the comma "," character itself. the item values themselves can contain the comma `,` character itself.
If you need data validation on multiple cells, one can clone the If you need data validation on multiple cells, one can clone the
ruleset: ruleset:
@ -1039,20 +1041,26 @@ $spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
The measure for column width in PhpSpreadsheet does **not** correspond The measure for column width in PhpSpreadsheet does **not** correspond
exactly to the measure you may be used to in Microsoft Office Excel. exactly to the measure you may be used to in Microsoft Office Excel.
Column widths are difficult to deal with in Excel, and there are several Column widths are difficult to deal with in Excel, and there are several
measures for the column width.1) **Inner width in character units** measures for the column width.
(e.g. 8.43 this is probably what you are familiar with in Excel)2)
**Full width in pixels** (e.g. 64 pixels)3) **Full width in character 1. Inner width in character units
units** (e.g. 9.140625, value -1 indicates unset width)**PHPExcel always (e.g. 8.43 this is probably what you are familiar with in Excel)
operates with 3) "Full width in character units"** which is in fact the 2. Full width in pixels (e.g. 64 pixels)
3. Full width in character units (e.g. 9.140625, value -1 indicates unset width)
**PhpSpreadsheet always
operates with "3. Full width in character units"** which is in fact the
only value that is stored in any Excel file, hence the most reliable only value that is stored in any Excel file, hence the most reliable
measure. Unfortunately, **Microsoft Office Excel does not present you measure. Unfortunately, **Microsoft Office Excel does not present you
with this measure**. Instead measures 1) and 2) are computed by the with this measure**. Instead measures 1 and 2 are computed by the
application when the file is opened and these values are presented in application when the file is opened and these values are presented in
various dialogues and tool tips.The character width unit is the width of various dialogues and tool tips.
a '0' (zero) glyph in the workbooks default font. Therefore column
The character width unit is the width of
a `0` (zero) glyph in the workbooks default font. Therefore column
widths measured in character units in two different workbooks can only widths measured in character units in two different workbooks can only
be compared if they have the same default workbook font.If you have some be compared if they have the same default workbook font.If you have some
Excel file and need to know the column widths in measure 3), you can Excel file and need to know the column widths in measure 3, you can
read the Excel file with PhpSpreadsheet and echo the retrieved values. read the Excel file with PhpSpreadsheet and echo the retrieved values.
## Show/hide a column ## Show/hide a column
@ -1487,7 +1495,7 @@ visible via the user interface.
## Right-to-left worksheet ## Right-to-left worksheet
Worksheets can be set individually whether column "A" should start at Worksheets can be set individually whether column `A` should start at
left or right side. Default is left. Here is how to set columns from left or right side. Default is left. Here is how to set columns from
right-to-left. right-to-left.

View File

@ -5,177 +5,20 @@ before instantiating a `Spreadsheet` object or loading a workbook file,
there are a number of configuration options that can be set which will there are a number of configuration options that can be set which will
affect the subsequent behaviour of the script. affect the subsequent behaviour of the script.
## Cell Caching ## Cell collection caching
PhpSpreadsheet uses an average of about 1k/cell in your worksheets, so By default, PhpSpreadsheet holds all cell objects in memory, but
large workbooks can quickly use up available memory. Cell caching you can specify alternatives to reduce memory consumption at the cost of speed.
provides a mechanism that allows PhpSpreadsheet to maintain the cell Read more about [memory saving](./memory_saving.md).
objects in a smaller size of memory, on disk, or in APC, memcache or
Wincache, rather than in PHP memory. This allows you to reduce the
memory usage for large workbooks, although at a cost of speed to access
cell data.
By default, PhpSpreadsheet still holds all cell objects in memory, but To enable cell caching, you must provide your own implementation of cache like so:
you can specify alternatives. To enable cell caching, you must call the
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod() method,
passing in the caching method that you wish to use.
``` php ``` php
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_IN_MEMORY; $cache = new MyCustomPsr16Implementation();
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod); \PhpOffice\PhpSpreadsheet\Settings::setCache($cache);
``` ```
setCacheStorageMethod() will return a boolean true on success, false on
failure (for example if trying to cache to APC when APC is not enabled).
A separate cache is maintained for each individual worksheet, and is
automatically created when the worksheet is instantiated based on the
caching method and settings that you have configured. You cannot change
the configuration settings once you have started to read a workbook, or
have created your first worksheet.
Currently, the following caching methods are available.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_IN\_MEMORY
The default. If you don't initialise any caching method, then this is
the method that PhpSpreadsheet will use. Cell objects are maintained in
PHP memory as at present.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_IN\_MEMORY\_SERIALIZED
Using this caching method, cells are held in PHP memory as an array of
serialized objects, which reduces the memory footprint with minimal
performance overhead.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_IN\_MEMORY\_GZIP
Like cache\_in\_memory\_serialized, this method holds cells in PHP
memory as an array of serialized objects, but gzipped to reduce the
memory usage still further, although access to read or write a cell is
slightly slower.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_IGBINARY
Uses PHPs igbinary extension (if its available) to serialize cell
objects in memory. This is normally faster and uses less memory than
standard PHP serialization, but isnt available in most hosting
environments.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_TO\_DISCISAM
When using CACHE\_TO\_DISCISAM all cells are held in a temporary disk
file, with only an index to their location in that file maintained in
PHP memory. This is slower than any of the CACHE\_IN\_MEMORY methods,
but significantly reduces the memory footprint. By default,
PhpSpreadsheet will use PHP's temp directory for the cache file, but you
can specify a different directory when initialising CACHE\_TO\_DISCISAM.
``` php
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_TO_DISCISAM;
$cacheSettings = array(
'dir' => '/usr/local/tmp'
);
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
```
The temporary disk file is automatically deleted when your script
terminates.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_TO\_PHPTEMP
Like CACHE\_TO\_DISCISAM, when using CACHE\_TO\_PHPTEMP all cells are
held in the php://temp I/O stream, with only an index to their location
maintained in PHP memory. In PHP, the php://memory wrapper stores data
in the memory: php://temp behaves similarly, but uses a temporary file
for storing the data when a certain memory limit is reached. The default
is 1 MB, but you can change this when initialising CACHE\_TO\_PHPTEMP.
``` php
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_TO_PHPTEMP;
$cacheSettings = array(
'memoryCacheSize' => '8MB'
);
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
```
The php://temp file is automatically deleted when your script
terminates.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_TO\_APC
When using CACHE\_TO\_APC, cell objects are maintained in APC with only
an index maintained in PHP memory to identify that the cell exists. By
default, an APC cache timeout of 600 seconds is used, which should be
enough for most applications: although it is possible to change this
when initialising CACHE\_TO\_APC.
``` php
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_TO_APC;
$cacheSettings = array(
'cacheTime' => 600
);
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
```
When your script terminates all entries will be cleared from APC,
regardless of the cacheTime value, so it cannot be used for persistent
storage using this mechanism.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_TO\_MEMCACHE
When using CACHE\_TO\_MEMCACHE, cell objects are maintained in memcache
with only an index maintained in PHP memory to identify that the cell
exists.
By default, PhpSpreadsheet looks for a memcache server on localhost at
port 11211. It also sets a memcache timeout limit of 600 seconds. If you
are running memcache on a different server or port, then you can change
these defaults when you initialise CACHE\_TO\_MEMCACHE:
``` php
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_TO_MEMCACHE;
$cacheSettings = array(
'memcacheServer' => 'localhost',
'memcachePort' => 11211,
'cacheTime' => 600
);
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
```
When your script terminates all entries will be cleared from memcache,
regardless of the cacheTime value, so it cannot be used for persistent
storage using this mechanism.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_TO\_WINCACHE
When using CACHE\_TO\_WINCACHE, cell objects are maintained in Wincache
with only an index maintained in PHP memory to identify that the cell
exists. By default, a Wincache cache timeout of 600 seconds is used,
which should be enough for most applications: although it is possible to
change this when initialising CACHE\_TO\_WINCACHE.
``` php
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_TO_WINCACHE;
$cacheSettings = array(
'cacheTime' => 600
);
\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
```
When your script terminates all entries will be cleared from Wincache,
regardless of the cacheTime value, so it cannot be used for persistent
storage using this mechanism.
### \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE\_TO\_SQLITE3;
Uses an SQLite 3 "in-memory" database for caching cell data. Unlike
other caching methods, neither cells nor an index are held in PHP memory
- an indexed database table makes it unnecessary to hold any index in
PHP memory, which makes this the most memory-efficient of the cell
caching methods.
## Language/Locale ## Language/Locale
Some localisation elements have been included in PhpSpreadsheet. You can Some localisation elements have been included in PhpSpreadsheet. You can
@ -190,12 +33,13 @@ if (!$validLocale) {
} }
``` ```
If Brazilian Portuguese language files aren't available, then Portuguese - If Brazilian Portuguese language files aren't available, then Portuguese
will be enabled instead: if Portuguese language files aren't available, will be enabled instead
then the setLocale() method will return an error, and American English - If Portuguese language files aren't available,
then the `setLocale()` method will return an error, and American English
(en\_us) settings will be used throughout. (en\_us) settings will be used throughout.
More details of the features available once a locale has been set, More details of the features available once a locale has been set,
including a list of the languages and locales currently supported, can including a list of the languages and locales currently supported, can
be found in the section of this document entitled "Locale Settings for be found in [Locale Settings for
Formulae". Formulae](./recipes.md#locale-settings-for-formulae).

130
docs/topics/worksheets.md Normal file
View File

@ -0,0 +1,130 @@
# Worksheets
A worksheet is a collection of cells, formulae, images, graphs, etc. It
holds all data necessary to represent a spreadsheet worksheet.
When you load a workbook from a spreadsheet file, it will be loaded with
all its existing worksheets (unless you specified that only certain
sheets should be loaded). When you load from non-spreadsheet files (such
as a CSV or HTML file) or from spreadsheet formats that don't identify
worksheets by name (such as SYLK), then a single worksheet called
"WorkSheet1" will be created containing the data from that file.
When you instantiate a new workbook, PhpSpreadsheet will create it with
a single worksheet called "WorkSheet1".
The `getSheetCount()` method will tell you the number of worksheets in
the workbook; while the `getSheetNames()` method will return a list of
all worksheets in the workbook, indexed by the order in which their
"tabs" would appear when opened in MS Excel (or other appropriate
Spreadsheet program).
Individual worksheets can be accessed by name, or by their index
position in the workbook. The index position represents the order that
each worksheet "tab" is shown when the workbook is opened in MS Excel
(or other appropriate Spreadsheet program). To access a sheet by its
index, use the `getSheet()` method.
``` php
// Get the second sheet in the workbook
// Note that sheets are indexed from 0
$spreadsheet->getSheet(1);
```
If you don't specify a sheet index, then the first worksheet will be
returned.
Methods also exist allowing you to reorder the worksheets in the
workbook.
To access a sheet by name, use the `getSheetByName()` method, specifying
the name of the worksheet that you want to access.
``` php
// Retrieve the worksheet called 'Worksheet 1'
$spreadsheet->getSheetByName('Worksheet 1');
```
Alternatively, one worksheet is always the currently active worksheet,
and you can access that directly. The currently active worksheet is the
one that will be active when the workbook is opened in MS Excel (or
other appropriate Spreadsheet program).
``` php
// Retrieve the current active worksheet
$spreadsheet->getActiveSheet();
```
You can change the currently active sheet by index or by name using the
`setActiveSheetIndex()` and `setActiveSheetIndexByName()` methods.
## Adding a new Worksheet
You can add a new worksheet to the workbook using the `createSheet()`
method of the `Spreadsheet` object. By default, this will be created as
a new "last" sheet; but you can also specify an index position as an
argument, and the worksheet will be inserted at that position, shuffling
all subsequent worksheets in the collection down a place.
``` php
$spreadsheet->createSheet();
```
A new worksheet created using this method will be called
"Worksheet&lt;n&gt;" where "&lt;n&gt;" is the lowest number possible to
guarantee that the title is unique.
Alternatively, you can instantiate a new worksheet (setting the title to
whatever you choose) and then insert it into your workbook using the
addSheet() method.
``` php
// Create a new worksheet called "My Data"
$myWorkSheet = new \PhpOffice\PhpSpreadsheet\Worksheet($spreadsheet, 'My Data');
// Attach the "My Data" worksheet as the first worksheet in the Spreadsheet object
$spreadsheet->addSheet($myWorkSheet, 0);
```
If you don't specify an index position as the second argument, then the
new worksheet will be added after the last existing worksheet.
## Copying Worksheets
Sheets within the same workbook can be copied by creating a clone of the
worksheet you wish to copy, and then using the `addSheet()` method to
insert the clone into the workbook.
``` php
$clonedWorksheet = clone $spreadsheet->getSheetByName('Worksheet 1');
$clonedWorksheet->setTitle('Copy of Worksheet 1')
$spreadsheet->addSheet($clonedWorksheet);
```
You can also copy worksheets from one workbook to another, though this
is more complex as PhpSpreadsheet also has to replicate the styling
between the two workbooks. The `addExternalSheet()` method is provided for
this purpose.
$clonedWorksheet = clone $spreadsheet1->getSheetByName('Worksheet 1');
$spreadsheet->addExternalSheet($clonedWorksheet);
In both cases, it is the developer's responsibility to ensure that
worksheet names are not duplicated. PhpSpreadsheet will throw an
exception if you attempt to copy worksheets that will result in a
duplicate name.
## Removing a Worksheet
You can delete a worksheet from a workbook, identified by its index
position, using the `removeSheetByIndex()` method
``` php
$sheetIndex = $spreadsheet->getIndex(
$spreadsheet->getSheetByName('Worksheet 1')
);
$spreadsheet->removeSheetByIndex($sheetIndex);
```
If the currently active worksheet is deleted, then the sheet at the
previous index position will become the currently active sheet.

View File

@ -14,7 +14,6 @@
<whitelist> <whitelist>
<directory suffix=".php">./src</directory> <directory suffix=".php">./src</directory>
<exclude> <exclude>
<directory>./src/PhpSpreadsheet/Shared/PCLZip</directory>
<directory>./src/PhpSpreadsheet/Shared/JAMA</directory> <directory>./src/PhpSpreadsheet/Shared/JAMA</directory>
<directory>./src/PhpSpreadsheet/Writer/PDF</directory> <directory>./src/PhpSpreadsheet/Writer/PDF</directory>
</exclude> </exclude>

View File

@ -1,50 +0,0 @@
<?php
require __DIR__ . '/Header.php';
// Create new Spreadsheet object
$helper->log('Create new Spreadsheet object');
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// Set document properties
$helper->log('Set document properties');
$spreadsheet->getProperties()->setCreator('Maarten Balliauw')
->setLastModifiedBy('Maarten Balliauw')
->setTitle('PhpSpreadsheet Test Document')
->setSubject('PhpSpreadsheet Test Document')
->setDescription('Test document for PhpSpreadsheet, generated using PHP classes.')
->setKeywords('office PhpSpreadsheet php')
->setCategory('Test result file');
// Add some data
$helper->log('Add some data');
$spreadsheet->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B2', 'world!')
->setCellValue('C1', 'Hello')
->setCellValue('D2', 'world!');
// Miscellaneous glyphs, UTF-8
$spreadsheet->setActiveSheetIndex(0)
->setCellValue('A4', 'Miscellaneous glyphs')
->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');
$spreadsheet->getActiveSheet()->setCellValue('A8', "Hello\nWorld");
$spreadsheet->getActiveSheet()->getRowDimension(8)->setRowHeight(-1);
$spreadsheet->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true);
// Rename worksheet
$helper->log('Rename worksheet');
$spreadsheet->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$spreadsheet->setActiveSheetIndex(0);
// Save Excel 2007 file
$helper->log('Write to Xlsx format');
// Use PCLZip rather than ZipArchive to create the Xlsx OfficeOpenXML file
\PhpOffice\PhpSpreadsheet\Settings::setZipClass(\PhpOffice\PhpSpreadsheet\Settings::PCLZIP);
// Save
$helper->write($spreadsheet, __FILE__, ['Xlsx']);

View File

@ -53,6 +53,6 @@ header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="01simple.pdf"'); header('Content-Disposition: attachment;filename="01simple.pdf"');
header('Cache-Control: max-age=0'); header('Cache-Control: max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'PDF'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Pdf');
$writer->save('php://output'); $writer->save('php://output');
exit; exit;

View File

@ -1,15 +0,0 @@
<?php
require __DIR__ . '/Header.php';
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_IN_MEMORY_GZIP;
if (\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod)) {
$helper->log('Enable Cell Caching using ' . $cacheMethod . ' method');
} else {
$helper->log('ERROR: Unable to set Cell Caching using ' . $cacheMethod . ' method, reverting to memory');
}
$spreadsheet = require __DIR__ . '/templates/largeSpreadsheet.php';
// Save
$helper->write($spreadsheet, __FILE__);

View File

@ -1,15 +0,0 @@
<?php
require __DIR__ . '/Header.php';
$cacheMethod = \PhpOffice\PhpSpreadsheet\CachedObjectStorageFactory::CACHE_TO_SQLITE3;
if (\PhpOffice\PhpSpreadsheet\Settings::setCacheStorageMethod($cacheMethod)) {
$helper->log('Enable Cell Caching using ' . $cacheMethod . ' method');
} else {
$helper->log('ERROR: Unable to set Cell Caching using ' . $cacheMethod . ' method, reverting to memory');
}
$spreadsheet = require __DIR__ . '/templates/largeSpreadsheet.php';
// Save
$helper->write($spreadsheet, __FILE__);

View File

@ -1,20 +0,0 @@
<?php
require __DIR__ . '/Header.php';
// Create temporary file that will be read
$sampleSpreadsheet = require __DIR__ . '/templates/sampleSpreadsheet.php';
$filename = $helper->getTemporaryFilename();
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($sampleSpreadsheet);
$writer->save($filename);
// Use PCLZip rather than ZipArchive to read the Xlsx OfficeOpenXML file
\PhpSpreadsheet\Settings::setZipClass(\PhpOffice\PhpSpreadsheet\Settings::PCLZIP);
$callStartTime = microtime(true);
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename);
$helper->logRead('Xlsx', $filename, $callStartTime);
$callEndTime = microtime(true);
// Save
$helper->write($spreadsheet, __FILE__);

View File

@ -1,14 +0,0 @@
<?php
require __DIR__ . '/Header.php';
// Use PCLZip rather than ZipArchive to read the Xlsx OfficeOpenXML file
\PhpOffice\PhpSpreadsheet\Settings::setZipClass(\PhpOffice\PhpSpreadsheet\Settings::PCLZIP);
$filename = __DIR__ . '/templates/OOCalcTest.ods';
$callStartTime = microtime(true);
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename);
$helper->logRead('Ods', $filename, $callStartTime);
// Save
$helper->write($spreadsheet, __FILE__);

View File

@ -91,7 +91,7 @@ foreach ($inputFileNames as $inputFileName) {
// Save // Save
$filename = $helper->getFilename($inputFileName); $filename = $helper->getFilename($inputFileName);
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'PDF'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Pdf');
$writer->setIncludeCharts(true); $writer->setIncludeCharts(true);
$callStartTime = microtime(true); $callStartTime = microtime(true);
$writer->save($filename); $writer->save($filename);

View File

@ -1,7 +1,7 @@
<?php <?php
require __DIR__ . '/Header.php'; require __DIR__ . '/Header.php';
?> ?>
<form action="Quadratic2.php" method="POST"> <form action="45_Quadratic_equation_solver.php" method="POST">
Enter the coefficients for the Ax<sup>2</sup> + Bx + C = 0 Enter the coefficients for the Ax<sup>2</sup> + Bx + C = 0
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr><td><b>A&nbsp;</b></td> <tr><td><b>A&nbsp;</b></td>
@ -28,13 +28,13 @@ if (isset($_POST['submit'])) {
echo '<hr /><b>Roots:</b><br />'; echo '<hr /><b>Roots:</b><br />';
$discriminantFormula = '=POWER(' . $_POST['B'] . ',2) - (4 * ' . $_POST['A'] . ' * ' . $_POST['C'] . ')'; $discriminantFormula = '=POWER(' . $_POST['B'] . ',2) - (4 * ' . $_POST['A'] . ' * ' . $_POST['C'] . ')';
$discriminant = PhpSpreadsheet_Calculation::getInstance()->calculateFormula($discriminantFormula); $discriminant = \PhpOffice\PhpSpreadsheet\Calculation::getInstance()->calculateFormula($discriminantFormula);
$r1Formula = '=IMDIV(IMSUM(-' . $_POST['B'] . ',IMSQRT(' . $discriminant . ')),2 * ' . $_POST['A'] . ')'; $r1Formula = '=IMDIV(IMSUM(-' . $_POST['B'] . ',IMSQRT(' . $discriminant . ')),2 * ' . $_POST['A'] . ')';
$r2Formula = '=IF(' . $discriminant . '=0,"Only one root",IMDIV(IMSUB(-' . $_POST['B'] . ',IMSQRT(' . $discriminant . ')),2 * ' . $_POST['A'] . '))'; $r2Formula = '=IF(' . $discriminant . '=0,"Only one root",IMDIV(IMSUB(-' . $_POST['B'] . ',IMSQRT(' . $discriminant . ')),2 * ' . $_POST['A'] . '))';
echo PhpSpreadsheet_Calculation::getInstance()->calculateFormula($r1Formula) . '<br />'; echo \PhpOffice\PhpSpreadsheet\Calculation::getInstance()->calculateFormula($r1Formula) . '<br />';
echo PhpSpreadsheet_Calculation::getInstance()->calculateFormula($r2Formula) . '<br />'; echo \PhpOffice\PhpSpreadsheet\Calculation::getInstance()->calculateFormula($r2Formula) . '<br />';
$callEndTime = microtime(true); $callEndTime = microtime(true);
$helper->logEndingNotes(); $helper->logEndingNotes();
} }

View File

@ -7,7 +7,7 @@ $requirements = [
'PHP extension XML' => extension_loaded('xml'), 'PHP extension XML' => extension_loaded('xml'),
'PHP extension xmlwriter' => extension_loaded('xmlwriter'), 'PHP extension xmlwriter' => extension_loaded('xmlwriter'),
'PHP extension mbstring' => extension_loaded('mbstring'), 'PHP extension mbstring' => extension_loaded('mbstring'),
'PHP extension ZipArchive (optional)' => extension_loaded('zip'), 'PHP extension ZipArchive' => extension_loaded('zip'),
'PHP extension GD (optional)' => extension_loaded('gd'), 'PHP extension GD (optional)' => extension_loaded('gd'),
'PHP extension dom (optional)' => extension_loaded('dom'), 'PHP extension dom (optional)' => extension_loaded('dom'),
]; ];

View File

@ -1,287 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class APC extends CacheBase implements ICache
{
/**
* Prefix used to uniquely identify cache data for this worksheet.
*
* @var string
*/
private $cachePrefix = null;
/**
* Cache timeout.
*
* @var int
*/
private $cacheTime = 600;
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
if (!apc_store(
$this->cachePrefix . $this->currentObjectID . '.cache',
serialize($this->currentObject),
$this->cacheTime
)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception('Failed to store cell ' . $this->currentObjectID . ' in APC');
}
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->cellCache[$pCoord] = true;
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Is a value set in the current \PhpOffice\PhpSpreadsheet\CachedObjectStorage\ICache for an indexed cell?
*
* @param string $pCoord Coordinate address of the cell to check
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return bool
*/
public function isDataSet($pCoord)
{
// Check if the requested entry is the current object, or exists in the cache
if (parent::isDataSet($pCoord)) {
if ($this->currentObjectID == $pCoord) {
return true;
}
// Check if the requested entry still exists in apc
$success = apc_fetch($this->cachePrefix . $pCoord . '.cache');
if ($success === false) {
// Entry no longer exists in APC, so clear it from the cache array
parent::deleteCacheData($pCoord);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $pCoord . ' no longer exists in APC cache');
}
return true;
}
return false;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (parent::isDataSet($pCoord)) {
$obj = apc_fetch($this->cachePrefix . $pCoord . '.cache');
if ($obj === false) {
// Entry no longer exists in APC, so clear it from the cache array
parent::deleteCacheData($pCoord);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $pCoord . ' no longer exists in APC cache');
}
} else {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = unserialize($obj);
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Delete a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to delete
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function deleteCacheData($pCoord)
{
// Delete the entry from APC
apc_delete($this->cachePrefix . $pCoord . '.cache');
// Delete the entry from our cell address array
parent::deleteCacheData($pCoord);
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::copyCellCollection($parent);
// Get a new id for the new file name
$baseUnique = $this->getUniqueID();
$newCachePrefix = substr(md5($baseUnique), 0, 8) . '.';
$cacheList = $this->getCellList();
foreach ($cacheList as $cellID) {
if ($cellID != $this->currentObjectID) {
$obj = apc_fetch($this->cachePrefix . $cellID . '.cache');
if ($obj === false) {
// Entry no longer exists in APC, so clear it from the cache array
parent::deleteCacheData($cellID);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $cellID . ' no longer exists in APC');
}
if (!apc_store($newCachePrefix . $cellID . '.cache', $obj, $this->cacheTime)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception('Failed to store cell ' . $cellID . ' in APC');
}
}
}
$this->cachePrefix = $newCachePrefix;
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if ($this->currentObject !== null) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
// Flush the APC cache
$this->__destruct();
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
* @param array $arguments Additional initialisation arguments
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent, $arguments)
{
$cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
if ($this->cachePrefix === null) {
$baseUnique = $this->getUniqueID();
$this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.';
$this->cacheTime = $cacheTime;
parent::__construct($parent);
}
}
/**
* Destroy this cell collection.
*/
public function __destruct()
{
$cacheList = $this->getCellList();
foreach ($cacheList as $cellID) {
apc_delete($this->cachePrefix . $cellID . '.cache');
}
}
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable()
{
if (!function_exists('apc_store')) {
return false;
}
if (apc_sma_info() === false) {
return false;
}
return true;
}
}

View File

@ -1,377 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
abstract class CacheBase
{
/**
* Parent worksheet.
*
* @var \PhpOffice\PhpSpreadsheet\Worksheet
*/
protected $parent;
/**
* The currently active Cell.
*
* @var \PhpOffice\PhpSpreadsheet\Cell
*/
protected $currentObject = null;
/**
* Coordinate address of the currently active Cell.
*
* @var string
*/
protected $currentObjectID = null;
/**
* Flag indicating whether the currently active Cell requires saving.
*
* @var bool
*/
protected $currentCellIsDirty = true;
/**
* An array of cells or cell pointers for the worksheet cells held in this cache,
* and indexed by their coordinate address within the worksheet.
*
* @var array of mixed
*/
protected $cellCache = [];
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
// Set our parent worksheet.
// This is maintained within the cache controller to facilitate re-attaching it to \PhpOffice\PhpSpreadsheet\Cell objects when
// they are woken from a serialized state
$this->parent = $parent;
}
/**
* Return the parent worksheet for this cell collection.
*
* @return \PhpOffice\PhpSpreadsheet\Worksheet
*/
public function getParent()
{
return $this->parent;
}
/**
* Is a value set in the current \PhpOffice\PhpSpreadsheet\CachedObjectStorage\ICache for an indexed cell?
*
* @param string $pCoord Coordinate address of the cell to check
*
* @return bool
*/
public function isDataSet($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return true;
}
// Check if the requested entry exists in the cache
return isset($this->cellCache[$pCoord]);
}
/**
* Move a cell object from one address to another.
*
* @param string $fromAddress Current address of the cell to move
* @param string $toAddress Destination address of the cell to move
*
* @return bool
*/
public function moveCell($fromAddress, $toAddress)
{
if ($fromAddress === $this->currentObjectID) {
$this->currentObjectID = $toAddress;
}
$this->currentCellIsDirty = true;
if (isset($this->cellCache[$fromAddress])) {
$this->cellCache[$toAddress] = &$this->cellCache[$fromAddress];
unset($this->cellCache[$fromAddress]);
}
return true;
}
/**
* Add or Update a cell in cache.
*
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function updateCacheData(\PhpOffice\PhpSpreadsheet\Cell $cell)
{
return $this->addCacheData($cell->getCoordinate(), $cell);
}
/**
* Delete a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to delete
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function deleteCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID && !is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObjectID = $this->currentObject = null;
}
if (is_object($this->cellCache[$pCoord])) {
$this->cellCache[$pCoord]->detach();
}
unset($this->cellCache[$pCoord]);
$this->currentCellIsDirty = false;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
return array_keys($this->cellCache);
}
/**
* Sort the list of all cell addresses currently held in cache by row and column.
*
* @return string[]
*/
public function getSortedCellList()
{
$sortKeys = [];
foreach ($this->getCellList() as $coord) {
sscanf($coord, '%[A-Z]%d', $column, $row);
$sortKeys[sprintf('%09d%3s', $row, $column)] = $coord;
}
ksort($sortKeys);
return array_values($sortKeys);
}
/**
* Get highest worksheet column and highest row that have cell records.
*
* @return array Highest column name and highest row number
*/
public function getHighestRowAndColumn()
{
// Lookup highest column and highest row
$col = ['A' => '1A'];
$row = [1];
foreach ($this->getCellList() as $coord) {
sscanf($coord, '%[A-Z]%d', $c, $r);
$row[$r] = $r;
$col[$c] = strlen($c) . $c;
}
if (!empty($row)) {
// Determine highest column and row
$highestRow = max($row);
$highestColumn = substr(max($col), 1);
}
return [
'row' => $highestRow,
'column' => $highestColumn,
];
}
/**
* Return the cell address of the currently active cell object.
*
* @return string
*/
public function getCurrentAddress()
{
return $this->currentObjectID;
}
/**
* Return the column address of the currently active cell object.
*
* @return string
*/
public function getCurrentColumn()
{
sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row);
return $column;
}
/**
* Return the row address of the currently active cell object.
*
* @return int
*/
public function getCurrentRow()
{
sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row);
return (int) $row;
}
/**
* Get highest worksheet column.
*
* @param string $row Return the highest column for the specified row,
* or the highest column of any row if no row number is passed
*
* @return string Highest column name
*/
public function getHighestColumn($row = null)
{
if ($row == null) {
$colRow = $this->getHighestRowAndColumn();
return $colRow['column'];
}
$columnList = [1];
foreach ($this->getCellList() as $coord) {
sscanf($coord, '%[A-Z]%d', $c, $r);
if ($r != $row) {
continue;
}
$columnList[] = \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString($c);
}
return \PhpOffice\PhpSpreadsheet\Cell::stringFromColumnIndex(max($columnList) - 1);
}
/**
* Get highest worksheet row.
*
* @param string $column Return the highest row for the specified column,
* or the highest row of any column if no column letter is passed
*
* @return int Highest row number
*/
public function getHighestRow($column = null)
{
if ($column == null) {
$colRow = $this->getHighestRowAndColumn();
return $colRow['row'];
}
$rowList = [0];
foreach ($this->getCellList() as $coord) {
sscanf($coord, '%[A-Z]%d', $c, $r);
if ($c != $column) {
continue;
}
$rowList[] = $r;
}
return max($rowList);
}
/**
* Generate a unique ID for cache referencing.
*
* @return string Unique Reference
*/
protected function getUniqueID()
{
if (function_exists('posix_getpid')) {
$baseUnique = posix_getpid();
} else {
$baseUnique = mt_rand();
}
return uniqid($baseUnique, true);
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
$this->currentCellIsDirty;
$this->storeData();
$this->parent = $parent;
if (($this->currentObject !== null) && (is_object($this->currentObject))) {
$this->currentObject->attach($this);
}
}
/**
* Remove a row, deleting all cells in that row.
*
* @param string $row Row number to remove
*/
public function removeRow($row)
{
foreach ($this->getCellList() as $coord) {
sscanf($coord, '%[A-Z]%d', $c, $r);
if ($r == $row) {
$this->deleteCacheData($coord);
}
}
}
/**
* Remove a column, deleting all cells in that column.
*
* @param string $column Column ID to remove
*/
public function removeColumn($column)
{
foreach ($this->getCellList() as $coord) {
sscanf($coord, '%[A-Z]%d', $c, $r);
if ($c == $column) {
$this->deleteCacheData($coord);
}
}
}
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable()
{
return true;
}
}

View File

@ -1,209 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class DiscISAM extends CacheBase implements ICache
{
/**
* Name of the file for this cache.
*
* @var string
*/
private $fileName = null;
/**
* File handle for this cache file.
*
* @var resource
*/
private $fileHandle = null;
/**
* Directory/Folder where the cache file is located.
*
* @var string
*/
private $cacheDirectory = null;
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
fseek($this->fileHandle, 0, SEEK_END);
$this->cellCache[$this->currentObjectID] = [
'ptr' => ftell($this->fileHandle),
'sz' => fwrite($this->fileHandle, serialize($this->currentObject)),
];
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (!isset($this->cellCache[$pCoord])) {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']);
$this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz']));
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::copyCellCollection($parent);
// Get a new id for the new file name
$baseUnique = $this->getUniqueID();
$newFileName = $this->cacheDirectory . '/PhpSpreadsheet.' . $baseUnique . '.cache';
// Copy the existing cell cache file
copy($this->fileName, $newFileName);
$this->fileName = $newFileName;
// Open the copied cell cache file
$this->fileHandle = fopen($this->fileName, 'a+');
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
// Close down the temporary cache file
$this->__destruct();
}
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
* @param array of mixed $arguments Additional initialisation arguments
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent, $arguments)
{
$this->cacheDirectory = ((isset($arguments['dir'])) && ($arguments['dir'] !== null))
? $arguments['dir']
: \PhpOffice\PhpSpreadsheet\Shared\File::sysGetTempDir();
parent::__construct($parent);
if (is_null($this->fileHandle)) {
$baseUnique = $this->getUniqueID();
$this->fileName = $this->cacheDirectory . '/PhpSpreadsheet.' . $baseUnique . '.cache';
$this->fileHandle = fopen($this->fileName, 'a+');
}
}
/**
* Destroy this cell collection.
*/
public function __destruct()
{
if (!is_null($this->fileHandle)) {
fclose($this->fileHandle);
unlink($this->fileName);
}
$this->fileHandle = null;
}
}

View File

@ -1,109 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
interface ICache
{
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell);
/**
* Add or Update a cell in cache.
*
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function updateCacheData(\PhpOffice\PhpSpreadsheet\Cell $cell);
/**
* Fetch a cell from cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to retrieve
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord);
/**
* Delete a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to delete
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function deleteCacheData($pCoord);
/**
* Is a value set in the current \PhpOffice\PhpSpreadsheet\CachedObjectStorage\ICache for an indexed cell?
*
* @param string $pCoord Coordinate address of the cell to check
*
* @return bool
*/
public function isDataSet($pCoord);
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList();
/**
* Get the list of all cell addresses currently held in cache sorted by column and row.
*
* @return string[]
*/
public function getSortedCellList();
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent);
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable();
}

View File

@ -1,150 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class Igbinary extends CacheBase implements ICache
{
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
$this->cellCache[$this->currentObjectID] = igbinary_serialize($this->currentObject);
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
// function _storeData()
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (!isset($this->cellCache[$pCoord])) {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = igbinary_unserialize($this->cellCache[$pCoord]);
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
// function getCacheData()
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
// function unsetWorksheetCells()
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable()
{
if (!function_exists('igbinary_serialize')) {
return false;
}
return true;
}
}

View File

@ -1,313 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class Memcache extends CacheBase implements ICache
{
/**
* Prefix used to uniquely identify cache data for this worksheet.
*
* @var string
*/
private $cachePrefix = null;
/**
* Cache timeout.
*
* @var int
*/
private $cacheTime = 600;
/**
* Memcache interface.
*
* @var resource
*/
private $memcache = null;
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
$obj = serialize($this->currentObject);
if (!$this->memcache->replace($this->cachePrefix . $this->currentObjectID . '.cache', $obj, null, $this->cacheTime)) {
if (!$this->memcache->add($this->cachePrefix . $this->currentObjectID . '.cache', $obj, null, $this->cacheTime)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception("Failed to store cell {$this->currentObjectID} in MemCache");
}
}
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->cellCache[$pCoord] = true;
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Is a value set in the current \PhpOffice\PhpSpreadsheet\CachedObjectStorage\ICache for an indexed cell?
*
* @param string $pCoord Coordinate address of the cell to check
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return bool
*/
public function isDataSet($pCoord)
{
// Check if the requested entry is the current object, or exists in the cache
if (parent::isDataSet($pCoord)) {
if ($this->currentObjectID == $pCoord) {
return true;
}
// Check if the requested entry still exists in Memcache
$success = $this->memcache->get($this->cachePrefix . $pCoord . '.cache');
if ($success === false) {
// Entry no longer exists in Memcache, so clear it from the cache array
parent::deleteCacheData($pCoord);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $pCoord . ' no longer exists in MemCache');
}
return true;
}
return false;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (parent::isDataSet($pCoord)) {
$obj = $this->memcache->get($this->cachePrefix . $pCoord . '.cache');
if ($obj === false) {
// Entry no longer exists in Memcache, so clear it from the cache array
parent::deleteCacheData($pCoord);
throw new \PhpOffice\PhpSpreadsheet\Exception("Cell entry {$pCoord} no longer exists in MemCache");
}
} else {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = unserialize($obj);
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Delete a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to delete
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function deleteCacheData($pCoord)
{
// Delete the entry from Memcache
$this->memcache->delete($this->cachePrefix . $pCoord . '.cache');
// Delete the entry from our cell address array
parent::deleteCacheData($pCoord);
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::copyCellCollection($parent);
// Get a new id for the new file name
$baseUnique = $this->getUniqueID();
$newCachePrefix = substr(md5($baseUnique), 0, 8) . '.';
$cacheList = $this->getCellList();
foreach ($cacheList as $cellID) {
if ($cellID != $this->currentObjectID) {
$obj = $this->memcache->get($this->cachePrefix . $cellID . '.cache');
if ($obj === false) {
// Entry no longer exists in Memcache, so clear it from the cache array
parent::deleteCacheData($cellID);
throw new \PhpOffice\PhpSpreadsheet\Exception("Cell entry {$cellID} no longer exists in MemCache");
}
if (!$this->memcache->add($newCachePrefix . $cellID . '.cache', $obj, null, $this->cacheTime)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception("Failed to store cell {$cellID} in MemCache");
}
}
}
$this->cachePrefix = $newCachePrefix;
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
// Flush the Memcache cache
$this->__destruct();
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
* @param mixed[] $arguments Additional initialisation arguments
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent, $arguments)
{
$memcacheServer = (isset($arguments['memcacheServer'])) ? $arguments['memcacheServer'] : 'localhost';
$memcachePort = (isset($arguments['memcachePort'])) ? $arguments['memcachePort'] : 11211;
$cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
if (is_null($this->cachePrefix)) {
$baseUnique = $this->getUniqueID();
$this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.';
// Set a new Memcache object and connect to the Memcache server
$this->memcache = new \Memcache();
if (!$this->memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, [$this, 'failureCallback'])) {
throw new \PhpOffice\PhpSpreadsheet\Exception("Could not connect to MemCache server at {$memcacheServer}:{$memcachePort}");
}
$this->cacheTime = $cacheTime;
parent::__construct($parent);
}
}
/**
* Memcache error handler.
*
* @param string $host Memcache server
* @param int $port Memcache port
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function failureCallback($host, $port)
{
throw new \PhpOffice\PhpSpreadsheet\Exception("memcache {$host}:{$port} failed");
}
/**
* Destroy this cell collection.
*/
public function __destruct()
{
$cacheList = $this->getCellList();
foreach ($cacheList as $cellID) {
$this->memcache->delete($this->cachePrefix . $cellID . '.cache');
}
}
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable()
{
if (!function_exists('memcache_add')) {
return false;
}
return true;
}
}

View File

@ -1,116 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class Memory extends CacheBase implements ICache
{
/**
* Dummy method callable from CacheBase, but unused by Memory cache.
*/
protected function storeData()
{
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
$this->cellCache[$pCoord] = $cell;
// Set current entry to the new/updated entry
$this->currentObjectID = $pCoord;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
// Check if the entry that has been requested actually exists
if (!isset($this->cellCache[$pCoord])) {
$this->currentObjectID = null;
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
// Return requested entry
return $this->cellCache[$pCoord];
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::copyCellCollection($parent);
$newCollection = [];
foreach ($this->cellCache as $k => &$cell) {
$newCollection[$k] = clone $cell;
$newCollection[$k]->attach($this);
}
$this->cellCache = $newCollection;
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
// Because cells are all stored as intact objects in memory, we need to detach each one from the parent
foreach ($this->cellCache as $k => &$cell) {
$cell->detach();
$this->cellCache[$k] = null;
}
unset($cell);
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
}

View File

@ -1,129 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class MemoryGZip extends CacheBase implements ICache
{
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
$this->cellCache[$this->currentObjectID] = gzdeflate(serialize($this->currentObject), 9);
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (!isset($this->cellCache[$pCoord])) {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = unserialize(gzinflate($this->cellCache[$pCoord]));
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
}

View File

@ -1,129 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class MemorySerialized extends CacheBase implements ICache
{
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
$this->cellCache[$this->currentObjectID] = serialize($this->currentObject);
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (!isset($this->cellCache[$pCoord])) {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = unserialize($this->cellCache[$pCoord]);
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
}

View File

@ -1,197 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class PHPTemp extends CacheBase implements ICache
{
/**
* Name of the file for this cache.
*
* @var string
*/
private $fileHandle = null;
/**
* Memory limit to use before reverting to file cache.
*
* @var int
*/
private $memoryCacheSize = null;
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
fseek($this->fileHandle, 0, SEEK_END);
$this->cellCache[$this->currentObjectID] = [
'ptr' => ftell($this->fileHandle),
'sz' => fwrite($this->fileHandle, serialize($this->currentObject)),
];
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
if (!isset($this->cellCache[$pCoord])) {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']);
$this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz']));
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::copyCellCollection($parent);
// Open a new stream for the cell cache data
$newFileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+');
// Copy the existing cell cache data to the new stream
fseek($this->fileHandle, 0);
while (!feof($this->fileHandle)) {
fwrite($newFileHandle, fread($this->fileHandle, 1024));
}
$this->fileHandle = $newFileHandle;
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
// Close down the php://temp file
$this->__destruct();
}
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
* @param mixed[] $arguments Additional initialisation arguments
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent, $arguments)
{
$this->memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : 1 * 1024 * 1024;
parent::__construct($parent);
if (is_null($this->fileHandle)) {
$this->fileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+');
}
}
/**
* Destroy this cell collection.
*/
public function __destruct()
{
if (!is_null($this->fileHandle)) {
fclose($this->fileHandle);
}
$this->fileHandle = null;
}
}

View File

@ -1,359 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class SQLite3 extends CacheBase implements ICache
{
/**
* Database table name.
*
* @var string
*/
private $TableName = null;
/**
* Database handle.
*
* @var resource
*/
private $DBHandle = null;
/**
* Prepared statement for a SQLite3 select query.
*
* @var SQLite3Stmt
*/
private $selectQuery;
/**
* Prepared statement for a SQLite3 insert query.
*
* @var SQLite3Stmt
*/
private $insertQuery;
/**
* Prepared statement for a SQLite3 update query.
*
* @var SQLite3Stmt
*/
private $updateQuery;
/**
* Prepared statement for a SQLite3 delete query.
*
* @var SQLite3Stmt
*/
private $deleteQuery;
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
$this->insertQuery->bindValue('id', $this->currentObjectID, SQLITE3_TEXT);
$this->insertQuery->bindValue('data', serialize($this->currentObject), SQLITE3_BLOB);
$result = $this->insertQuery->execute();
if ($result === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
$this->selectQuery->bindValue('id', $pCoord, SQLITE3_TEXT);
$cellResult = $this->selectQuery->execute();
if ($cellResult === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
$cellData = $cellResult->fetchArray(SQLITE3_ASSOC);
if ($cellData === false) {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = unserialize($cellData['value']);
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Is a value set for an indexed cell?
*
* @param string $pCoord Coordinate address of the cell to check
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return bool
*/
public function isDataSet($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return true;
}
// Check if the requested entry exists in the cache
$this->selectQuery->bindValue('id', $pCoord, SQLITE3_TEXT);
$cellResult = $this->selectQuery->execute();
if ($cellResult === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
$cellData = $cellResult->fetchArray(SQLITE3_ASSOC);
return ($cellData === false) ? false : true;
}
/**
* Delete a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to delete
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function deleteCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
$this->currentObject->detach();
$this->currentObjectID = $this->currentObject = null;
}
// Check if the requested entry exists in the cache
$this->deleteQuery->bindValue('id', $pCoord, SQLITE3_TEXT);
$result = $this->deleteQuery->execute();
if ($result === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
$this->currentCellIsDirty = false;
}
/**
* Move a cell object from one address to another.
*
* @param string $fromAddress Current address of the cell to move
* @param string $toAddress Destination address of the cell to move
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return bool
*/
public function moveCell($fromAddress, $toAddress)
{
if ($fromAddress === $this->currentObjectID) {
$this->currentObjectID = $toAddress;
}
$this->deleteQuery->bindValue('id', $toAddress, SQLITE3_TEXT);
$result = $this->deleteQuery->execute();
if ($result === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
$this->updateQuery->bindValue('toid', $toAddress, SQLITE3_TEXT);
$this->updateQuery->bindValue('fromid', $fromAddress, SQLITE3_TEXT);
$result = $this->updateQuery->execute();
if ($result === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
return true;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
$query = 'SELECT id FROM kvp_' . $this->TableName;
$cellIdsResult = $this->DBHandle->query($query);
if ($cellIdsResult === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
$cellKeys = [];
while ($row = $cellIdsResult->fetchArray(SQLITE3_ASSOC)) {
$cellKeys[] = $row['id'];
}
return $cellKeys;
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
$this->currentCellIsDirty;
$this->storeData();
// Get a new id for the new table name
$tableName = str_replace('.', '_', $this->getUniqueID());
if (!$this->DBHandle->exec('CREATE TABLE kvp_' . $tableName . ' (id VARCHAR(12) PRIMARY KEY, value BLOB)
AS SELECT * FROM kvp_' . $this->TableName)
) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
// Copy the existing cell cache file
$this->TableName = $tableName;
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
// Close down the temporary cache file
$this->__destruct();
}
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::__construct($parent);
if (is_null($this->DBHandle)) {
$this->TableName = str_replace('.', '_', $this->getUniqueID());
$_DBName = ':memory:';
$this->DBHandle = new \SQLite3($_DBName);
if ($this->DBHandle === false) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
if (!$this->DBHandle->exec('CREATE TABLE kvp_' . $this->TableName . ' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) {
throw new \PhpOffice\PhpSpreadsheet\Exception($this->DBHandle->lastErrorMsg());
}
}
$this->selectQuery = $this->DBHandle->prepare('SELECT value FROM kvp_' . $this->TableName . ' WHERE id = :id');
$this->insertQuery = $this->DBHandle->prepare('INSERT OR REPLACE INTO kvp_' . $this->TableName . ' VALUES(:id,:data)');
$this->updateQuery = $this->DBHandle->prepare('UPDATE kvp_' . $this->TableName . ' SET id=:toId WHERE id=:fromId');
$this->deleteQuery = $this->DBHandle->prepare('DELETE FROM kvp_' . $this->TableName . ' WHERE id = :id');
}
/**
* Destroy this cell collection.
*/
public function __destruct()
{
if (!is_null($this->DBHandle)) {
$this->DBHandle->exec('DROP TABLE kvp_' . $this->TableName);
$this->DBHandle->close();
}
$this->DBHandle = null;
}
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable()
{
if (!class_exists('SQLite3', false)) {
return false;
}
return true;
}
}

View File

@ -1,292 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet\CachedObjectStorage;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class Wincache extends CacheBase implements ICache
{
/**
* Prefix used to uniquely identify cache data for this worksheet.
*
* @var string
*/
private $cachePrefix = null;
/**
* Cache timeout.
*
* @var int
*/
private $cacheTime = 600;
/**
* Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object.
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
protected function storeData()
{
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
$this->currentObject->detach();
$obj = serialize($this->currentObject);
if (wincache_ucache_exists($this->cachePrefix . $this->currentObjectID . '.cache')) {
if (!wincache_ucache_set($this->cachePrefix . $this->currentObjectID . '.cache', $obj, $this->cacheTime)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception('Failed to store cell ' . $this->currentObjectID . ' in WinCache');
}
} else {
if (!wincache_ucache_add($this->cachePrefix . $this->currentObjectID . '.cache', $obj, $this->cacheTime)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception('Failed to store cell ' . $this->currentObjectID . ' in WinCache');
}
}
$this->currentCellIsDirty = false;
}
$this->currentObjectID = $this->currentObject = null;
}
/**
* Add or Update a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to update
* @param \PhpOffice\PhpSpreadsheet\Cell $cell Cell to update
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell
*/
public function addCacheData($pCoord, \PhpOffice\PhpSpreadsheet\Cell $cell)
{
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
$this->storeData();
}
$this->cellCache[$pCoord] = true;
$this->currentObjectID = $pCoord;
$this->currentObject = $cell;
$this->currentCellIsDirty = true;
return $cell;
}
/**
* Is a value set in the current \PhpOffice\PhpSpreadsheet\CachedObjectStorage\ICache for an indexed cell?
*
* @param string $pCoord Coordinate address of the cell to check
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return bool
*/
public function isDataSet($pCoord)
{
// Check if the requested entry is the current object, or exists in the cache
if (parent::isDataSet($pCoord)) {
if ($this->currentObjectID == $pCoord) {
return true;
}
// Check if the requested entry still exists in cache
$success = wincache_ucache_exists($this->cachePrefix . $pCoord . '.cache');
if ($success === false) {
// Entry no longer exists in Wincache, so clear it from the cache array
parent::deleteCacheData($pCoord);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $pCoord . ' no longer exists in WinCache');
}
return true;
}
return false;
}
/**
* Get cell at a specific coordinate.
*
* @param string $pCoord Coordinate of the cell
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*
* @return \PhpOffice\PhpSpreadsheet\Cell Cell that was found, or null if not found
*/
public function getCacheData($pCoord)
{
if ($pCoord === $this->currentObjectID) {
return $this->currentObject;
}
$this->storeData();
// Check if the entry that has been requested actually exists
$obj = null;
if (parent::isDataSet($pCoord)) {
$success = false;
$obj = wincache_ucache_get($this->cachePrefix . $pCoord . '.cache', $success);
if ($success === false) {
// Entry no longer exists in WinCache, so clear it from the cache array
parent::deleteCacheData($pCoord);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $pCoord . ' no longer exists in WinCache');
}
} else {
// Return null if requested entry doesn't exist in cache
return null;
}
// Set current entry to the requested entry
$this->currentObjectID = $pCoord;
$this->currentObject = unserialize($obj);
// Re-attach this as the cell's parent
$this->currentObject->attach($this);
// Return requested entry
return $this->currentObject;
}
/**
* Get a list of all cell addresses currently held in cache.
*
* @return string[]
*/
public function getCellList()
{
if ($this->currentObjectID !== null) {
$this->storeData();
}
return parent::getCellList();
}
/**
* Delete a cell in cache identified by coordinate address.
*
* @param string $pCoord Coordinate address of the cell to delete
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function deleteCacheData($pCoord)
{
// Delete the entry from Wincache
wincache_ucache_delete($this->cachePrefix . $pCoord . '.cache');
// Delete the entry from our cell address array
parent::deleteCacheData($pCoord);
}
/**
* Clone the cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The new worksheet that we're copying to
*
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function copyCellCollection(\PhpOffice\PhpSpreadsheet\Worksheet $parent)
{
parent::copyCellCollection($parent);
// Get a new id for the new file name
$baseUnique = $this->getUniqueID();
$newCachePrefix = substr(md5($baseUnique), 0, 8) . '.';
$cacheList = $this->getCellList();
foreach ($cacheList as $cellID) {
if ($cellID != $this->currentObjectID) {
$success = false;
$obj = wincache_ucache_get($this->cachePrefix . $cellID . '.cache', $success);
if ($success === false) {
// Entry no longer exists in WinCache, so clear it from the cache array
parent::deleteCacheData($cellID);
throw new \PhpOffice\PhpSpreadsheet\Exception('Cell entry ' . $cellID . ' no longer exists in Wincache');
}
if (!wincache_ucache_add($newCachePrefix . $cellID . '.cache', $obj, $this->cacheTime)) {
$this->__destruct();
throw new \PhpOffice\PhpSpreadsheet\Exception('Failed to store cell ' . $cellID . ' in Wincache');
}
}
}
$this->cachePrefix = $newCachePrefix;
}
/**
* Clear the cell collection and disconnect from our parent.
*/
public function unsetWorksheetCells()
{
if (!is_null($this->currentObject)) {
$this->currentObject->detach();
$this->currentObject = $this->currentObjectID = null;
}
// Flush the WinCache cache
$this->__destruct();
$this->cellCache = [];
// detach ourself from the worksheet, so that it can then delete this object successfully
$this->parent = null;
}
/**
* Initialise this new cell collection.
*
* @param \PhpOffice\PhpSpreadsheet\Worksheet $parent The worksheet for this cell collection
* @param mixed[] $arguments Additional initialisation arguments
*/
public function __construct(\PhpOffice\PhpSpreadsheet\Worksheet $parent, $arguments)
{
$cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
if (is_null($this->cachePrefix)) {
$baseUnique = $this->getUniqueID();
$this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.';
$this->cacheTime = $cacheTime;
parent::__construct($parent);
}
}
/**
* Destroy this cell collection.
*/
public function __destruct()
{
$cacheList = $this->getCellList();
foreach ($cacheList as $cellID) {
wincache_ucache_delete($this->cachePrefix . $cellID . '.cache');
}
}
/**
* Identify whether the caching method is currently available
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build.
*
* @return bool
*/
public static function cacheMethodIsAvailable()
{
if (!function_exists('wincache_ucache_add')) {
return false;
}
return true;
}
}

View File

@ -1,228 +0,0 @@
<?php
namespace PhpOffice\PhpSpreadsheet;
/**
* Copyright (c) 2006 - 2016 PhpSpreadsheet.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PhpSpreadsheet
*
* @copyright Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class CachedObjectStorageFactory
{
const CACHE_IN_MEMORY = 'Memory';
const CACHE_IN_MEMORY_GZIP = 'MemoryGZip';
const CACHE_IN_MEMORY_SERIALIZED = 'MemorySerialized';
const CACHE_IGBINARY = 'Igbinary';
const CACHE_TO_DISCISAM = 'DiscISAM';
const CACHE_TO_APC = 'APC';
const CACHE_TO_MEMCACHE = 'Memcache';
const CACHE_TO_PHPTEMP = 'PHPTemp';
const CACHE_TO_WINCACHE = 'Wincache';
const CACHE_TO_SQLITE3 = 'SQLite3';
/**
* Name of the method used for cell cacheing.
*
* @var string
*/
private static $cacheStorageMethod;
/**
* Name of the class used for cell cacheing.
*
* @var string
*/
private static $cacheStorageClass;
/**
* List of all possible cache storage methods.
*
* @var string[]
*/
private static $storageMethods = [
self::CACHE_IN_MEMORY,
self::CACHE_IN_MEMORY_GZIP,
self::CACHE_IN_MEMORY_SERIALIZED,
self::CACHE_IGBINARY,
self::CACHE_TO_PHPTEMP,
self::CACHE_TO_DISCISAM,
self::CACHE_TO_APC,
self::CACHE_TO_MEMCACHE,
self::CACHE_TO_WINCACHE,
self::CACHE_TO_SQLITE3,
];
/**
* Default arguments for each cache storage method.
*
* @var array of mixed array
*/
private static $storageMethodDefaultParameters = [
self::CACHE_IN_MEMORY => [],
self::CACHE_IN_MEMORY_GZIP => [],
self::CACHE_IN_MEMORY_SERIALIZED => [],
self::CACHE_IGBINARY => [],
self::CACHE_TO_PHPTEMP => [
'memoryCacheSize' => '1MB',
],
self::CACHE_TO_DISCISAM => [
'dir' => null,
],
self::CACHE_TO_APC => [
'cacheTime' => 600,
],
self::CACHE_TO_MEMCACHE => [
'memcacheServer' => 'localhost',
'memcachePort' => 11211,
'cacheTime' => 600,
],
self::CACHE_TO_WINCACHE => [
'cacheTime' => 600,
],
self::CACHE_TO_SQLITE3 => [],
];
/**
* Arguments for the active cache storage method.
*
* @var mixed[]
*/
private static $storageMethodParameters = [];
/**
* Return the current cache storage method.
*
* @return string|null
**/
public static function getCacheStorageMethod()
{
return self::$cacheStorageMethod;
}
/**
* Return the current cache storage class.
*
* @return string
**/
public static function getCacheStorageClass()
{
return self::$cacheStorageClass;
}
/**
* Return the list of all possible cache storage methods.
*
* @return string[]
**/
public static function getAllCacheStorageMethods()
{
return self::$storageMethods;
}
/**
* Return the list of all available cache storage methods.
*
* @return string[]
**/
public static function getCacheStorageMethods()
{
$activeMethods = [];
foreach (self::$storageMethods as $storageMethod) {
$cacheStorageClass = '\\PhpOffice\\PhpSpreadsheet\\CachedObjectStorage\\' . $storageMethod;
if (call_user_func([$cacheStorageClass, 'cacheMethodIsAvailable'])) {
$activeMethods[] = $storageMethod;
}
}
return $activeMethods;
}
/**
* Identify the cache storage method to use.
*
* @param string $method Name of the method to use for cell cacheing
* @param mixed[] $arguments Additional arguments to pass to the cell caching class
* when instantiating
*
* @return bool
**/
public static function initialize($method = self::CACHE_IN_MEMORY, $arguments = [])
{
if (!in_array($method, self::$storageMethods)) {
return false;
}
$cacheStorageClass = '\\PhpOffice\\PhpSpreadsheet\\CachedObjectStorage\\' . $method;
if (!call_user_func([$cacheStorageClass, 'cacheMethodIsAvailable'])) {
return false;
}
self::$storageMethodParameters[$method] = self::$storageMethodDefaultParameters[$method];
foreach ($arguments as $argument => $value) {
if (isset(self::$storageMethodParameters[$method][$argument])) {
self::$storageMethodParameters[$method][$argument] = $value;
}
}
if (self::$cacheStorageMethod === null) {
self::$cacheStorageClass = '\\PhpOffice\\PhpSpreadsheet\\CachedObjectStorage\\' . $method;
self::$cacheStorageMethod = $method;
}
return true;
}
/**
* Initialise the cache storage.
*
* @param Worksheet $parent Enable cell caching for this worksheet
*
* @return CachedObjectStorage\ICache
**/
public static function getInstance(Worksheet $parent)
{
$cacheMethodIsAvailable = true;
if (self::$cacheStorageMethod === null) {
$cacheMethodIsAvailable = self::initialize();
}
if ($cacheMethodIsAvailable) {
$instance = new self::$cacheStorageClass(
$parent,
self::$storageMethodParameters[self::$cacheStorageMethod]
);
if ($instance !== null) {
return $instance;
}
}
return false;
}
/**
* Clear the cache storage.
**/
public static function finalize()
{
self::$cacheStorageMethod = null;
self::$cacheStorageClass = null;
self::$storageMethodParameters = [];
}
}

View File

@ -74,7 +74,7 @@ class Logger
* *
* @param bool $pValue * @param bool $pValue
*/ */
public function setWriteDebugLog($pValue = false) public function setWriteDebugLog($pValue)
{ {
$this->writeDebugLog = $pValue; $this->writeDebugLog = $pValue;
} }
@ -94,7 +94,7 @@ class Logger
* *
* @param bool $pValue * @param bool $pValue
*/ */
public function setEchoDebugLog($pValue = false) public function setEchoDebugLog($pValue)
{ {
$this->echoDebugLog = $pValue; $this->echoDebugLog = $pValue;
} }

View File

@ -2177,7 +2177,7 @@ class Calculation
* *
* @param bool $pValue * @param bool $pValue
*/ */
public function setCalculationCacheEnabled($pValue = true) public function setCalculationCacheEnabled($pValue)
{ {
$this->calculationCacheEnabled = $pValue; $this->calculationCacheEnabled = $pValue;
$this->clearCalculationCache(); $this->clearCalculationCache();
@ -2246,11 +2246,11 @@ class Calculation
/** /**
* Set the locale code. * Set the locale code.
* *
* @param string $locale The locale to use for formula translation * @param string $locale The locale to use for formula translation, eg: 'en_us'
* *
* @return bool * @return bool
*/ */
public function setLocale($locale = 'en_us') public function setLocale($locale)
{ {
// Identify our locale and language // Identify our locale and language
$language = $locale = strtolower($locale); $language = $locale = strtolower($locale);
@ -3664,7 +3664,7 @@ class Calculation
$this->debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue)); $this->debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue));
} else { } else {
$this->debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in current worksheet'); $this->debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in current worksheet');
if ($pCellParent->isDataSet($cellRef)) { if ($pCellParent->has($cellRef)) {
$cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false); $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false);
$pCell->attach($pCellParent); $pCell->attach($pCellParent);
} else { } else {
@ -3765,6 +3765,11 @@ class Calculation
} elseif (preg_match('/^' . self::CALCULATION_REGEXP_NAMEDRANGE . '$/i', $token, $matches)) { } elseif (preg_match('/^' . self::CALCULATION_REGEXP_NAMEDRANGE . '$/i', $token, $matches)) {
$namedRange = $matches[6]; $namedRange = $matches[6];
$this->debugLog->writeDebugLog('Evaluating Named Range ', $namedRange); $this->debugLog->writeDebugLog('Evaluating Named Range ', $namedRange);
if (substr($namedRange, 0, 6) === '_xlfn.') {
return $this->raiseFormulaError("undefined named range / function '$token'");
}
$cellValue = $this->extractNamedRange($namedRange, ((null !== $pCell) ? $pCellWorksheet : null), false); $cellValue = $this->extractNamedRange($namedRange, ((null !== $pCell) ? $pCellWorksheet : null), false);
$pCell->attach($pCellParent); $pCell->attach($pCellParent);
$this->debugLog->writeDebugLog('Evaluation Result for named range ', $namedRange, ' is ', $this->showTypeDetails($cellValue)); $this->debugLog->writeDebugLog('Evaluation Result for named range ', $namedRange, ' is ', $this->showTypeDetails($cellValue));

View File

@ -142,11 +142,11 @@ class FormulaToken
} }
/** /**
* Set Token Type. * Set Token Type (represented by TOKEN_TYPE_*).
* *
* @param string $value * @param string $value
*/ */
public function setTokenType($value = self::TOKEN_TYPE_UNKNOWN) public function setTokenType($value)
{ {
$this->tokenType = $value; $this->tokenType = $value;
} }
@ -162,11 +162,11 @@ class FormulaToken
} }
/** /**
* Set Token SubType. * Set Token SubType (represented by TOKEN_SUBTYPE_*).
* *
* @param string $value * @param string $value
*/ */
public function setTokenSubType($value = self::TOKEN_SUBTYPE_NOTHING) public function setTokenSubType($value)
{ {
$this->tokenSubType = $value; $this->tokenSubType = $value;
} }

View File

@ -497,93 +497,107 @@ class LookupRef
* Excel Function: * Excel Function:
* =MATCH(lookup_value, lookup_array, [match_type]) * =MATCH(lookup_value, lookup_array, [match_type])
* *
* @param lookup_value The value that you want to match in lookup_array * @param mixed $lookupValue The value that you want to match in lookup_array
* @param lookup_array The range of cells being searched * @param mixed $lookupArray The range of cells being searched
* @param match_type The number -1, 0, or 1. -1 means above, 0 means exact match, 1 means below. If match_type is 1 or -1, the list has to be ordered. * @param mixed $matchType The number -1, 0, or 1. -1 means above, 0 means exact match, 1 means below. If match_type is 1 or -1, the list has to be ordered.
* @param mixed $lookup_value
* @param mixed $lookup_array
* @param mixed $match_type
* *
* @return int The relative position of the found item * @return int The relative position of the found item
*/ */
public static function MATCH($lookup_value, $lookup_array, $match_type = 1) public static function MATCH($lookupValue, $lookupArray, $matchType = 1)
{ {
$lookup_array = Functions::flattenArray($lookup_array); $lookupArray = Functions::flattenArray($lookupArray);
$lookup_value = Functions::flattenSingleValue($lookup_value); $lookupValue = Functions::flattenSingleValue($lookupValue);
$match_type = (is_null($match_type)) ? 1 : (int) Functions::flattenSingleValue($match_type); $matchType = (is_null($matchType)) ? 1 : (int) Functions::flattenSingleValue($matchType);
// MATCH is not case sensitive
$lookup_value = strtolower($lookup_value);
// lookup_value type has to be number, text, or logical values // MATCH is not case sensitive
if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) { $lookupValue = strtolower($lookupValue);
// Lookup_value type has to be number, text, or logical values
if ((!is_numeric($lookupValue)) && (!is_string($lookupValue)) && (!is_bool($lookupValue))) {
return Functions::NA(); return Functions::NA();
} }
// match_type is 0, 1 or -1 // Match_type is 0, 1 or -1
if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) { if (($matchType !== 0) && ($matchType !== -1) && ($matchType !== 1)) {
return Functions::NA(); return Functions::NA();
} }
// lookup_array should not be empty // Lookup_array should not be empty
$lookupArraySize = count($lookup_array); $lookupArraySize = count($lookupArray);
if ($lookupArraySize <= 0) { if ($lookupArraySize <= 0) {
return Functions::NA(); return Functions::NA();
} }
// lookup_array should contain only number, text, or logical values, or empty (null) cells // Lookup_array should contain only number, text, or logical values, or empty (null) cells
foreach ($lookup_array as $i => $lookupArrayValue) { foreach ($lookupArray as $i => $lookupArrayValue) {
// check the type of the value // check the type of the value
if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) && if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) &&
(!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) { (!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))
) {
return Functions::NA(); return Functions::NA();
} }
// convert strings to lowercase for case-insensitive testing // Convert strings to lowercase for case-insensitive testing
if (is_string($lookupArrayValue)) { if (is_string($lookupArrayValue)) {
$lookup_array[$i] = strtolower($lookupArrayValue); $lookupArray[$i] = strtolower($lookupArrayValue);
} }
if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) { if ((is_null($lookupArrayValue)) && (($matchType == 1) || ($matchType == -1))) {
$lookup_array = array_slice($lookup_array, 0, $i - 1); $lookupArray = array_slice($lookupArray, 0, $i - 1);
} }
} }
// if match_type is 1 or -1, the list has to be ordered if ($matchType == 1) {
if ($match_type == 1) { // If match_type is 1 the list has to be processed from last to first
asort($lookup_array);
$keySet = array_keys($lookup_array); $lookupArray = array_reverse($lookupArray);
} elseif ($match_type == -1) { $keySet = array_reverse(array_keys($lookupArray));
arsort($lookup_array);
$keySet = array_keys($lookup_array);
} }
// ** // **
// find the match // find the match
// ** // **
foreach ($lookup_array as $i => $lookupArrayValue) {
if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) { if ($matchType == 0 || $matchType == 1) {
// exact match foreach ($lookupArray as $i => $lookupArrayValue) {
return ++$i; if (($matchType == 0) && ($lookupArrayValue == $lookupValue)) {
} elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) { // exact match
$i = array_search($i, $keySet); return ++$i;
// if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value } elseif (($matchType == 1) && ($lookupArrayValue <= $lookupValue)) {
if ($i < 1) { $i = array_search($i, $keySet);
// 1st cell was already smaller than the lookup_value
break; // The current value is the (first) match
return $i + 1;
} }
// the previous cell was the match }
return $keySet[$i - 1] + 1; } else {
} elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) { // matchType = -1
$i = array_search($i, $keySet);
// if match_type is 1 <=> find the largest value that is less than or equal to lookup_value // "Special" case: since the array it's supposed to be ordered in descending order, the
if ($i < 1) { // Excel algorithm gives up immediately if the first element is smaller than the searched value
// 1st cell was already bigger than the lookup_value if ($lookupArray[0] < $lookupValue) {
break; return Functions::NA();
}
$maxValueKey = null;
// The basic algorithm is:
// Iterate and keep the highest match until the next element is smaller than the searched value.
// Return immediately if perfect match is found
foreach ($lookupArray as $i => $lookupArrayValue) {
if ($lookupArrayValue == $lookupValue) {
// Another "special" case. If a perfect match is found,
// the algorithm gives up immediately
return $i + 1;
} elseif ($lookupArrayValue >= $lookupValue) {
$maxValueKey = $i + 1;
} }
// the previous cell was the match }
return $keySet[$i - 1] + 1;
if ($maxValueKey !== null) {
return $maxValueKey;
} }
} }
// unsuccessful in finding a match, return #N/A error value // Unsuccessful in finding a match, return #N/A error value
return Functions::NA(); return Functions::NA();
} }

View File

@ -493,7 +493,7 @@ class TextData
$instance = floor(Functions::flattenSingleValue($instance)); $instance = floor(Functions::flattenSingleValue($instance));
if ($instance == 0) { if ($instance == 0) {
return \PhpOffice\PhpSpreadsheet\Shared\StringHelper::mbStrReplace($fromText, $toText, $text); return str_replace($fromText, $toText, $text);
} }
$pos = -1; $pos = -1;

View File

@ -2,6 +2,8 @@
namespace PhpOffice\PhpSpreadsheet; namespace PhpOffice\PhpSpreadsheet;
use PhpOffice\PhpSpreadsheet\Collection\Cells;
/** /**
* Copyright (c) 2006 - 2016 PhpSpreadsheet. * Copyright (c) 2006 - 2016 PhpSpreadsheet.
* *
@ -67,9 +69,9 @@ class Cell
private $dataType; private $dataType;
/** /**
* Parent worksheet. * Collection of cells.
* *
* @var CachedObjectStorage\CacheBase * @var Cells
*/ */
private $parent; private $parent;
@ -86,11 +88,13 @@ class Cell
private $formulaAttributes; private $formulaAttributes;
/** /**
* Send notification to the cache controller. * Update the cell into the cell collection.
**/ *
public function notifyCacheController() * @return self
*/
public function updateInCollection()
{ {
$this->parent->updateCacheData($this); $this->parent->update($this);
return $this; return $this;
} }
@ -100,7 +104,7 @@ class Cell
$this->parent = null; $this->parent = null;
} }
public function attach(CachedObjectStorage\CacheBase $parent) public function attach(Cells $parent)
{ {
$this->parent = $parent; $this->parent = $parent;
} }
@ -114,13 +118,13 @@ class Cell
* *
* @throws Exception * @throws Exception
*/ */
public function __construct($pValue = null, $pDataType = null, Worksheet $pSheet = null) public function __construct($pValue, $pDataType, Worksheet $pSheet)
{ {
// Initialise cell value // Initialise cell value
$this->value = $pValue; $this->value = $pValue;
// Set worksheet cache // Set worksheet cache
$this->parent = $pSheet->getCellCacheController(); $this->parent = $pSheet->getCellCollection();
// Set datatype? // Set datatype?
if ($pDataType !== null) { if ($pDataType !== null) {
@ -160,7 +164,7 @@ class Cell
*/ */
public function getCoordinate() public function getCoordinate()
{ {
return $this->parent->getCurrentAddress(); return $this->parent->getCurrentCoordinate();
} }
/** /**
@ -198,7 +202,7 @@ class Cell
* *
* @return Cell * @return Cell
*/ */
public function setValue($pValue = null) public function setValue($pValue)
{ {
if (!self::getValueBinder()->bindValue($this, $pValue)) { if (!self::getValueBinder()->bindValue($this, $pValue)) {
throw new Exception('Value could not be bound to cell.'); throw new Exception('Value could not be bound to cell.');
@ -211,13 +215,13 @@ class Cell
* Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder). * Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder).
* *
* @param mixed $pValue Value * @param mixed $pValue Value
* @param string $pDataType Explicit data type * @param string $pDataType Explicit data type, see Cell\DataType::TYPE_*
* *
* @throws Exception * @throws Exception
* *
* @return Cell * @return Cell
*/ */
public function setValueExplicit($pValue = null, $pDataType = Cell\DataType::TYPE_STRING) public function setValueExplicit($pValue, $pDataType)
{ {
// set the value according to data type // set the value according to data type
switch ($pDataType) { switch ($pDataType) {
@ -253,14 +257,12 @@ class Cell
// set the datatype // set the datatype
$this->dataType = $pDataType; $this->dataType = $pDataType;
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
* Get calculated cell value. * Get calculated cell value.
* *
* @deprecated Since version 1.7.8 for planned changes to cell for array formula handling
*
* @param bool $resetLog Whether the calculation engine logger should be reset or not * @param bool $resetLog Whether the calculation engine logger should be reset or not
* *
* @throws Exception * @throws Exception
@ -309,13 +311,13 @@ class Cell
* *
* @return Cell * @return Cell
*/ */
public function setCalculatedValue($pValue = null) public function setCalculatedValue($pValue)
{ {
if ($pValue !== null) { if ($pValue !== null) {
$this->calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue; $this->calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue;
} }
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
@ -346,18 +348,18 @@ class Cell
/** /**
* Set cell data type. * Set cell data type.
* *
* @param string $pDataType * @param string $pDataType see Cell\DataType::TYPE_*
* *
* @return Cell * @return Cell
*/ */
public function setDataType($pDataType = Cell\DataType::TYPE_STRING) public function setDataType($pDataType)
{ {
if ($pDataType == Cell\DataType::TYPE_STRING2) { if ($pDataType == Cell\DataType::TYPE_STRING2) {
$pDataType = Cell\DataType::TYPE_STRING; $pDataType = Cell\DataType::TYPE_STRING;
} }
$this->dataType = $pDataType; $this->dataType = $pDataType;
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
@ -419,7 +421,7 @@ class Cell
$this->getWorksheet()->setDataValidation($this->getCoordinate(), $pDataValidation); $this->getWorksheet()->setDataValidation($this->getCoordinate(), $pDataValidation);
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
@ -471,13 +473,13 @@ class Cell
$this->getWorksheet()->setHyperlink($this->getCoordinate(), $pHyperlink); $this->getWorksheet()->setHyperlink($this->getCoordinate(), $pHyperlink);
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
* Get parent worksheet. * Get cell collection.
* *
* @return CachedObjectStorage\CacheBase * @return Cells
*/ */
public function getParent() public function getParent()
{ {
@ -557,9 +559,9 @@ class Cell
*/ */
public function rebindParent(Worksheet $parent) public function rebindParent(Worksheet $parent)
{ {
$this->parent = $parent->getCellCacheController(); $this->parent = $parent->getCellCollection();
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
@ -569,7 +571,7 @@ class Cell
* *
* @return bool * @return bool
*/ */
public function isInRange($pRange = 'A1:A1') public function isInRange($pRange)
{ {
list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange); list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange);
@ -585,13 +587,13 @@ class Cell
/** /**
* Coordinate from string. * Coordinate from string.
* *
* @param string $pCoordinateString * @param string $pCoordinateString eg: 'A1'
* *
* @throws Exception * @throws Exception
* *
* @return string[] Array containing column and row (indexes 0 and 1) * @return string[] Array containing column and row (indexes 0 and 1)
*/ */
public static function coordinateFromString($pCoordinateString = 'A1') public static function coordinateFromString($pCoordinateString)
{ {
if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,7})$/", $pCoordinateString, $matches)) { if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,7})$/", $pCoordinateString, $matches)) {
return [$matches[1], $matches[2]]; return [$matches[1], $matches[2]];
@ -614,7 +616,7 @@ class Cell
* *
* @return string Absolute coordinate e.g. '$A' or '$1' or '$A$1' * @return string Absolute coordinate e.g. '$A' or '$1' or '$A$1'
*/ */
public static function absoluteReference($pCoordinateString = 'A1') public static function absoluteReference($pCoordinateString)
{ {
if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) { if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) {
// Split out any worksheet name from the reference // Split out any worksheet name from the reference
@ -649,7 +651,7 @@ class Cell
* *
* @return string Absolute coordinate e.g. '$A$1' * @return string Absolute coordinate e.g. '$A$1'
*/ */
public static function absoluteCoordinate($pCoordinateString = 'A1') public static function absoluteCoordinate($pCoordinateString)
{ {
if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) { if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) {
// Split out any worksheet name from the coordinate // Split out any worksheet name from the coordinate
@ -682,7 +684,7 @@ class Cell
* e.g. array('B4','D9') or array(array('B4','D9'),array('H2','O11')) * e.g. array('B4','D9') or array(array('B4','D9'),array('H2','O11'))
* or array('B4') * or array('B4')
*/ */
public static function splitRange($pRange = 'A1:A1') public static function splitRange($pRange)
{ {
// Ensure $pRange is a valid range // Ensure $pRange is a valid range
if (empty($pRange)) { if (empty($pRange)) {
@ -707,10 +709,10 @@ class Cell
* *
* @return string String representation of $pRange * @return string String representation of $pRange
*/ */
public static function buildRange($pRange) public static function buildRange(array $pRange)
{ {
// Verify range // Verify range
if (!is_array($pRange) || empty($pRange) || !is_array($pRange[0])) { if (empty($pRange) || !is_array($pRange[0])) {
throw new Exception('Range does not contain any information'); throw new Exception('Range does not contain any information');
} }
@ -733,7 +735,7 @@ class Cell
* @return array Range coordinates array(Start Cell, End Cell) * @return array Range coordinates array(Start Cell, End Cell)
* where Start Cell and End Cell are arrays (Column Number, Row Number) * where Start Cell and End Cell are arrays (Column Number, Row Number)
*/ */
public static function rangeBoundaries($pRange = 'A1:A1') public static function rangeBoundaries($pRange)
{ {
// Ensure $pRange is a valid range // Ensure $pRange is a valid range
if (empty($pRange)) { if (empty($pRange)) {
@ -768,7 +770,7 @@ class Cell
* *
* @return array Range dimension (width, height) * @return array Range dimension (width, height)
*/ */
public static function rangeDimension($pRange = 'A1:A1') public static function rangeDimension($pRange)
{ {
// Calculate range outer borders // Calculate range outer borders
list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange); list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange);
@ -784,7 +786,7 @@ class Cell
* @return array Range coordinates array(Start Cell, End Cell) * @return array Range coordinates array(Start Cell, End Cell)
* where Start Cell and End Cell are arrays (Column ID, Row Number) * where Start Cell and End Cell are arrays (Column ID, Row Number)
*/ */
public static function getRangeBoundaries($pRange = 'A1:A1') public static function getRangeBoundaries($pRange)
{ {
// Ensure $pRange is a valid range // Ensure $pRange is a valid range
if (empty($pRange)) { if (empty($pRange)) {
@ -807,11 +809,11 @@ class Cell
/** /**
* Column index from string. * Column index from string.
* *
* @param string $pString * @param string $pString eg 'A'
* *
* @return int Column index (base 1 !!!) * @return int Column index (base 1 !!!)
*/ */
public static function columnIndexFromString($pString = 'A') public static function columnIndexFromString($pString)
{ {
// Using a lookup cache adds a slight memory overhead, but boosts speed // Using a lookup cache adds a slight memory overhead, but boosts speed
// caching using a static within the method is faster than a class static, // caching using a static within the method is faster than a class static,
@ -854,11 +856,11 @@ class Cell
/** /**
* String from columnindex. * String from columnindex.
* *
* @param int $pColumnIndex Column index (base 0 !!!) * @param int $pColumnIndex Column index (A = 0)
* *
* @return string * @return string
*/ */
public static function stringFromColumnIndex($pColumnIndex = 0) public static function stringFromColumnIndex($pColumnIndex)
{ {
// Using a lookup cache adds a slight memory overhead, but boosts speed // Using a lookup cache adds a slight memory overhead, but boosts speed
// caching using a static within the method is faster than a class static, // caching using a static within the method is faster than a class static,
@ -889,7 +891,7 @@ class Cell
* *
* @return array Array containing single cell references * @return array Array containing single cell references
*/ */
public static function extractAllCellReferencesInRange($pRange = 'A1') public static function extractAllCellReferencesInRange($pRange)
{ {
// Returnvalue // Returnvalue
$returnValue = []; $returnValue = [];
@ -988,12 +990,8 @@ class Cell
* *
* @throws Exception * @throws Exception
*/ */
public static function setValueBinder(Cell\IValueBinder $binder = null) public static function setValueBinder(Cell\IValueBinder $binder)
{ {
if ($binder === null) {
throw new Exception('A \\PhpOffice\\PhpSpreadsheet\\Cell\\IValueBinder is required for PhpSpreadsheet to function correctly.');
}
self::$valueBinder = $binder; self::$valueBinder = $binder;
} }
@ -1029,15 +1027,15 @@ class Cell
* *
* @return Cell * @return Cell
*/ */
public function setXfIndex($pValue = 0) public function setXfIndex($pValue)
{ {
$this->xfIndex = $pValue; $this->xfIndex = $pValue;
return $this->notifyCacheController(); return $this->updateInCollection();
} }
/** /**
* @deprecated Since version 1.7.8 for planned changes to cell for array formula handling * Set the formula attributes.
* *
* @param mixed $pAttributes * @param mixed $pAttributes
*/ */
@ -1049,7 +1047,7 @@ class Cell
} }
/** /**
* @deprecated Since version 1.7.8 for planned changes to cell for array formula handling * Get the formula attributes.
*/ */
public function getFormulaAttributes() public function getFormulaAttributes()
{ {

View File

@ -69,7 +69,7 @@ class DataType
* *
* @return mixed Sanitized value * @return mixed Sanitized value
*/ */
public static function checkString($pValue = null) public static function checkString($pValue)
{ {
if ($pValue instanceof \PhpOffice\PhpSpreadsheet\RichText) { if ($pValue instanceof \PhpOffice\PhpSpreadsheet\RichText) {
// TODO: Sanitize Rich-Text string (max. character count is 32,767) // TODO: Sanitize Rich-Text string (max. character count is 32,767)
@ -93,7 +93,7 @@ class DataType
* *
* @return string Sanitized value * @return string Sanitized value
*/ */
public static function checkErrorCode($pValue = null) public static function checkErrorCode($pValue)
{ {
$pValue = (string) $pValue; $pValue = (string) $pValue;

View File

@ -84,7 +84,7 @@ class DataValidation
* *
* @var string * @var string
*/ */
private $operator = ''; private $operator = self::OPERATOR_BETWEEN;
/** /**
* Allow Blank. * Allow Blank.
@ -166,7 +166,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setFormula1($value = '') public function setFormula1($value)
{ {
$this->formula1 = $value; $this->formula1 = $value;
@ -190,7 +190,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setFormula2($value = '') public function setFormula2($value)
{ {
$this->formula2 = $value; $this->formula2 = $value;
@ -214,7 +214,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setType($value = self::TYPE_NONE) public function setType($value)
{ {
$this->type = $value; $this->type = $value;
@ -234,11 +234,11 @@ class DataValidation
/** /**
* Set Error style. * Set Error style.
* *
* @param string $value * @param string $value see self::STYLE_*
* *
* @return DataValidation * @return DataValidation
*/ */
public function setErrorStyle($value = self::STYLE_STOP) public function setErrorStyle($value)
{ {
$this->errorStyle = $value; $this->errorStyle = $value;
@ -262,7 +262,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setOperator($value = '') public function setOperator($value)
{ {
$this->operator = $value; $this->operator = $value;
@ -286,7 +286,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setAllowBlank($value = false) public function setAllowBlank($value)
{ {
$this->allowBlank = $value; $this->allowBlank = $value;
@ -310,7 +310,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setShowDropDown($value = false) public function setShowDropDown($value)
{ {
$this->showDropDown = $value; $this->showDropDown = $value;
@ -334,7 +334,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setShowInputMessage($value = false) public function setShowInputMessage($value)
{ {
$this->showInputMessage = $value; $this->showInputMessage = $value;
@ -358,7 +358,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setShowErrorMessage($value = false) public function setShowErrorMessage($value)
{ {
$this->showErrorMessage = $value; $this->showErrorMessage = $value;
@ -382,7 +382,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setErrorTitle($value = '') public function setErrorTitle($value)
{ {
$this->errorTitle = $value; $this->errorTitle = $value;
@ -406,7 +406,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setError($value = '') public function setError($value)
{ {
$this->error = $value; $this->error = $value;
@ -430,7 +430,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setPromptTitle($value = '') public function setPromptTitle($value)
{ {
$this->promptTitle = $value; $this->promptTitle = $value;
@ -454,7 +454,7 @@ class DataValidation
* *
* @return DataValidation * @return DataValidation
*/ */
public function setPrompt($value = '') public function setPrompt($value)
{ {
$this->prompt = $value; $this->prompt = $value;

Some files were not shown because too many files have changed in this diff Show More