Upload Project Skripsi
This commit is contained in:
commit
c53419b2f5
|
|
@ -0,0 +1,17 @@
|
||||||
|
*/config/development
|
||||||
|
*/logs/log-*.php
|
||||||
|
!*/logs/index.html
|
||||||
|
*/cache/*
|
||||||
|
!*/cache/index.html
|
||||||
|
!*/cache/.htaccess
|
||||||
|
|
||||||
|
user_guide_src/build/*
|
||||||
|
user_guide_src/cilexer/build/*
|
||||||
|
user_guide_src/cilexer/dist/*
|
||||||
|
user_guide_src/cilexer/pycilexer.egg-info/*
|
||||||
|
|
||||||
|
#codeigniter 3
|
||||||
|
application/logs/*
|
||||||
|
!application/logs/index.html
|
||||||
|
!application/logs/.htaccess
|
||||||
|
/vendor/
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteRule ^(.*)$ index.php/$1 [L]
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Chandra Pramudya Harvanto.
|
||||||
|
|
||||||
|
SISTEM INFORMASI GEOGRAFIS PEMETAAN DAERAH RAWAN PENCURIAN TERNAK DI KABUPATEN LUMAJANG
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://getstisla.com">
|
||||||
|
<img src="https://avatars2.githubusercontent.com/u/45754626?s=75&v=4" alt="Stisla logo" width="75" height="75">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h1 align="center">Stisla for CodeIgniter</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
Stisla is Free Bootstrap Admin Template and will help you to speed up your project, design your own dashboard UI and the users will love it.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
[](https://getstisla.com)
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
- [Link Stisla](#link-stisla)
|
||||||
|
- [Installation](#installation)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [License](#License)
|
||||||
|
|
||||||
|
## Link Stisla
|
||||||
|
- Homepage: [getstisla.com](https://getstisla.com)
|
||||||
|
- Repository: [github.com/stisla/stisla](https://github.com/stisla/stisla)
|
||||||
|
- Documentation: [getstisla.com/docs](https://getstisla.com/docs)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
- [Download the latest release](https://github.com/KhidirDotID/stisla-codeigniter/archive/v1.0.0.zip).
|
||||||
|
or clone the repo :
|
||||||
|
```
|
||||||
|
https://github.com/KhidirDotID/stisla-codeigniter.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
- Create a new Controller at `application/controllers` then put like this:
|
||||||
|
```
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Controller_name extends CI_Controller {
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$data = array(
|
||||||
|
'title' => "Your title"
|
||||||
|
);
|
||||||
|
$this->load->view('View_name', $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
```
|
||||||
|
- Create a new View at `application/views` then put like this:
|
||||||
|
```
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
$this->load->view('dist/_partials/header'); ?>
|
||||||
|
|
||||||
|
<!-- Main Content -->
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$this->load->view('dist/_partials/footer'); ?>
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Stisla is under the [MIT License](LICENSE).
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
Akun Admin
|
||||||
|
Username : admin
|
||||||
|
password : 123456
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
<IfModule authz_core_module>
|
||||||
|
Require all denied
|
||||||
|
</IfModule>
|
||||||
|
<IfModule !authz_core_module>
|
||||||
|
Deny from all
|
||||||
|
</IfModule>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| AUTO-LOADER
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file specifies which systems should be loaded by default.
|
||||||
|
|
|
||||||
|
| In order to keep the framework as light-weight as possible only the
|
||||||
|
| absolute minimal resources are loaded by default. For example,
|
||||||
|
| the database is not connected to automatically since no assumption
|
||||||
|
| is made regarding whether you intend to use it. This file lets
|
||||||
|
| you globally define which systems you would like loaded with every
|
||||||
|
| request.
|
||||||
|
|
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Instructions
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These are the things you can load automatically:
|
||||||
|
|
|
||||||
|
| 1. Packages
|
||||||
|
| 2. Libraries
|
||||||
|
| 3. Drivers
|
||||||
|
| 4. Helper files
|
||||||
|
| 5. Custom config files
|
||||||
|
| 6. Language files
|
||||||
|
| 7. Models
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Packages
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$autoload['packages'] = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Libraries
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| These are the classes located in system/libraries/ or your
|
||||||
|
| application/libraries/ directory, with the addition of the
|
||||||
|
| 'database' library, which is somewhat of a special case.
|
||||||
|
|
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['libraries'] = array('database', 'email', 'session');
|
||||||
|
|
|
||||||
|
| You can also supply an alternative library name to be assigned
|
||||||
|
| in the controller:
|
||||||
|
|
|
||||||
|
| $autoload['libraries'] = array('user_agent' => 'ua');
|
||||||
|
*/
|
||||||
|
$autoload['libraries'] = array('database', 'form_validation', 'session', 'mylib');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Drivers
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| These classes are located in system/libraries/ or in your
|
||||||
|
| application/libraries/ directory, but are also placed inside their
|
||||||
|
| own subdirectory and they extend the CI_Driver_Library class. They
|
||||||
|
| offer multiple interchangeable driver options.
|
||||||
|
|
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['drivers'] = array('cache');
|
||||||
|
|
|
||||||
|
| You can also supply an alternative property name to be assigned in
|
||||||
|
| the controller:
|
||||||
|
|
|
||||||
|
| $autoload['drivers'] = array('cache' => 'cch');
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$autoload['drivers'] = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Helper Files
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['helper'] = array('url', 'file');
|
||||||
|
*/
|
||||||
|
$autoload['helper'] = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Config files
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['config'] = array('config1', 'config2');
|
||||||
|
|
|
||||||
|
| NOTE: This item is intended for use ONLY if you have created custom
|
||||||
|
| config files. Otherwise, leave it blank.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$autoload['config'] = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Language files
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['language'] = array('lang1', 'lang2');
|
||||||
|
|
|
||||||
|
| NOTE: Do not include the "_lang" part of your file. For example
|
||||||
|
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$autoload['language'] = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Models
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['model'] = array('first_model', 'second_model');
|
||||||
|
|
|
||||||
|
| You can also supply an alternative model name to be assigned
|
||||||
|
| in the controller:
|
||||||
|
|
|
||||||
|
| $autoload['model'] = array('first_model' => 'first');
|
||||||
|
*/
|
||||||
|
$autoload['model'] = array();
|
||||||
|
|
@ -0,0 +1,523 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Base Site URL
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| URL to your CodeIgniter root. Typically this will be your base URL,
|
||||||
|
| WITH a trailing slash:
|
||||||
|
|
|
||||||
|
| http://example.com/
|
||||||
|
|
|
||||||
|
| WARNING: You MUST set this value!
|
||||||
|
|
|
||||||
|
| If it is not set, then CodeIgniter will try guess the protocol and path
|
||||||
|
| your installation, but due to security concerns the hostname will be set
|
||||||
|
| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
|
||||||
|
| The auto-detection mechanism exists only for convenience during
|
||||||
|
| development and MUST NOT be used in production!
|
||||||
|
|
|
||||||
|
| If you need to allow multiple domains, remember that this file is still
|
||||||
|
| a PHP script and you can easily do that on your own.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['base_url'] = 'http://localhost/skripsi_190/';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Index File
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Typically this will be your index.php file, unless you've renamed it to
|
||||||
|
| something else. If you are using mod_rewrite to remove the page set this
|
||||||
|
| variable so that it is blank.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['index_page'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| URI PROTOCOL
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This item determines which server global should be used to retrieve the
|
||||||
|
| URI string. The default setting of 'REQUEST_URI' works for most servers.
|
||||||
|
| If your links do not seem to work, try one of the other delicious flavors:
|
||||||
|
|
|
||||||
|
| 'REQUEST_URI' Uses $_SERVER['REQUEST_URI']
|
||||||
|
| 'QUERY_STRING' Uses $_SERVER['QUERY_STRING']
|
||||||
|
| 'PATH_INFO' Uses $_SERVER['PATH_INFO']
|
||||||
|
|
|
||||||
|
| WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
|
||||||
|
*/
|
||||||
|
$config['uri_protocol'] = 'REQUEST_URI';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| URL suffix
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
|
||||||
|
| For more information please see the user guide:
|
||||||
|
|
|
||||||
|
| https://codeigniter.com/user_guide/general/urls.html
|
||||||
|
*/
|
||||||
|
$config['url_suffix'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Default Language
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This determines which set of language files should be used. Make sure
|
||||||
|
| there is an available translation if you intend to use something other
|
||||||
|
| than english.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['language'] = 'english';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Default Character Set
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This determines which character set is used by default in various methods
|
||||||
|
| that require a character set to be provided.
|
||||||
|
|
|
||||||
|
| See http://php.net/htmlspecialchars for a list of supported charsets.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['charset'] = 'UTF-8';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enable/Disable System Hooks
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If you would like to use the 'hooks' feature you must enable it by
|
||||||
|
| setting this variable to TRUE (boolean). See the user guide for details.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['enable_hooks'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Class Extension Prefix
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This item allows you to set the filename/classname prefix when extending
|
||||||
|
| native libraries. For more information please see the user guide:
|
||||||
|
|
|
||||||
|
| https://codeigniter.com/user_guide/general/core_classes.html
|
||||||
|
| https://codeigniter.com/user_guide/general/creating_libraries.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['subclass_prefix'] = 'MY_';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Composer auto-loading
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Enabling this setting will tell CodeIgniter to look for a Composer
|
||||||
|
| package auto-loader script in application/vendor/autoload.php.
|
||||||
|
|
|
||||||
|
| $config['composer_autoload'] = TRUE;
|
||||||
|
|
|
||||||
|
| Or if you have your vendor/ directory located somewhere else, you
|
||||||
|
| can opt to set a specific path as well:
|
||||||
|
|
|
||||||
|
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
||||||
|
|
|
||||||
|
| For more information about Composer, please visit http://getcomposer.org/
|
||||||
|
|
|
||||||
|
| Note: This will NOT disable or override the CodeIgniter-specific
|
||||||
|
| autoloading (application/config/autoload.php)
|
||||||
|
*/
|
||||||
|
$config['composer_autoload'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Allowed URL Characters
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This lets you specify which characters are permitted within your URLs.
|
||||||
|
| When someone tries to submit a URL with disallowed characters they will
|
||||||
|
| get a warning message.
|
||||||
|
|
|
||||||
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
|
||||||
|
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
||||||
|
|
|
||||||
|
| Leave blank to allow all characters -- but only if you are insane.
|
||||||
|
|
|
||||||
|
| The configured value is actually a regular expression character group
|
||||||
|
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
||||||
|
|
|
||||||
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enable Query Strings
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
|
||||||
|
| example.com/who/what/where/
|
||||||
|
|
|
||||||
|
| You can optionally enable standard query string based URLs:
|
||||||
|
| example.com?who=me&what=something&where=here
|
||||||
|
|
|
||||||
|
| Options are: TRUE or FALSE (boolean)
|
||||||
|
|
|
||||||
|
| The other items let you set the query string 'words' that will
|
||||||
|
| invoke your controllers and its functions:
|
||||||
|
| example.com/index.php?c=controller&m=function
|
||||||
|
|
|
||||||
|
| Please note that some of the helpers won't work as expected when
|
||||||
|
| this feature is enabled, since CodeIgniter is designed primarily to
|
||||||
|
| use segment based URLs.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['enable_query_strings'] = FALSE;
|
||||||
|
$config['controller_trigger'] = 'c';
|
||||||
|
$config['function_trigger'] = 'm';
|
||||||
|
$config['directory_trigger'] = 'd';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Allow $_GET array
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| By default CodeIgniter enables access to the $_GET array. If for some
|
||||||
|
| reason you would like to disable it, set 'allow_get_array' to FALSE.
|
||||||
|
|
|
||||||
|
| WARNING: This feature is DEPRECATED and currently available only
|
||||||
|
| for backwards compatibility purposes!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['allow_get_array'] = TRUE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error Logging Threshold
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| You can enable error logging by setting a threshold over zero. The
|
||||||
|
| threshold determines what gets logged. Threshold options are:
|
||||||
|
|
|
||||||
|
| 0 = Disables logging, Error logging TURNED OFF
|
||||||
|
| 1 = Error Messages (including PHP errors)
|
||||||
|
| 2 = Debug Messages
|
||||||
|
| 3 = Informational Messages
|
||||||
|
| 4 = All Messages
|
||||||
|
|
|
||||||
|
| You can also pass an array with threshold levels to show individual error types
|
||||||
|
|
|
||||||
|
| array(2) = Debug Messages, without Error Messages
|
||||||
|
|
|
||||||
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
|
||||||
|
| your log files will fill up very fast.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_threshold'] = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error Logging Directory Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Leave this BLANK unless you would like to set something other than the default
|
||||||
|
| application/logs/ directory. Use a full server path with trailing slash.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Log File Extension
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The default filename extension for log files. The default 'php' allows for
|
||||||
|
| protecting the log files via basic scripting, when they are to be stored
|
||||||
|
| under a publicly accessible directory.
|
||||||
|
|
|
||||||
|
| Note: Leaving it blank will default to 'php'.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_file_extension'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Log File Permissions
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The file system permissions to be applied on newly created log files.
|
||||||
|
|
|
||||||
|
| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
|
||||||
|
| integer notation (i.e. 0700, 0644, etc.)
|
||||||
|
*/
|
||||||
|
$config['log_file_permissions'] = 0644;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Date Format for Logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Each item that is logged has an associated date. You can use PHP date
|
||||||
|
| codes to set your own date formatting
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_date_format'] = 'Y-m-d H:i:s';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error Views Directory Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Leave this BLANK unless you would like to set something other than the default
|
||||||
|
| application/views/errors/ directory. Use a full server path with trailing slash.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['error_views_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cache Directory Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Leave this BLANK unless you would like to set something other than the default
|
||||||
|
| application/cache/ directory. Use a full server path with trailing slash.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['cache_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cache Include Query String
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Whether to take the URL query string into consideration when generating
|
||||||
|
| output cache files. Valid options are:
|
||||||
|
|
|
||||||
|
| FALSE = Disabled
|
||||||
|
| TRUE = Enabled, take all query parameters into account.
|
||||||
|
| Please be aware that this may result in numerous cache
|
||||||
|
| files generated for the same page over and over again.
|
||||||
|
| array('q') = Enabled, but only take into account the specified list
|
||||||
|
| of query parameters.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['cache_query_string'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Encryption Key
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If you use the Encryption class, you must set an encryption key.
|
||||||
|
| See the user guide for more info.
|
||||||
|
|
|
||||||
|
| https://codeigniter.com/user_guide/libraries/encryption.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['encryption_key'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Session Variables
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 'sess_driver'
|
||||||
|
|
|
||||||
|
| The storage driver to use: files, database, redis, memcached
|
||||||
|
|
|
||||||
|
| 'sess_cookie_name'
|
||||||
|
|
|
||||||
|
| The session cookie name, must contain only [0-9a-z_-] characters
|
||||||
|
|
|
||||||
|
| 'sess_expiration'
|
||||||
|
|
|
||||||
|
| The number of SECONDS you want the session to last.
|
||||||
|
| Setting to 0 (zero) means expire when the browser is closed.
|
||||||
|
|
|
||||||
|
| 'sess_save_path'
|
||||||
|
|
|
||||||
|
| The location to save sessions to, driver dependent.
|
||||||
|
|
|
||||||
|
| For the 'files' driver, it's a path to a writable directory.
|
||||||
|
| WARNING: Only absolute paths are supported!
|
||||||
|
|
|
||||||
|
| For the 'database' driver, it's a table name.
|
||||||
|
| Please read up the manual for the format with other session drivers.
|
||||||
|
|
|
||||||
|
| IMPORTANT: You are REQUIRED to set a valid save path!
|
||||||
|
|
|
||||||
|
| 'sess_match_ip'
|
||||||
|
|
|
||||||
|
| Whether to match the user's IP address when reading the session data.
|
||||||
|
|
|
||||||
|
| WARNING: If you're using the database driver, don't forget to update
|
||||||
|
| your session table's PRIMARY KEY when changing this setting.
|
||||||
|
|
|
||||||
|
| 'sess_time_to_update'
|
||||||
|
|
|
||||||
|
| How many seconds between CI regenerating the session ID.
|
||||||
|
|
|
||||||
|
| 'sess_regenerate_destroy'
|
||||||
|
|
|
||||||
|
| Whether to destroy session data associated with the old session ID
|
||||||
|
| when auto-regenerating the session ID. When set to FALSE, the data
|
||||||
|
| will be later deleted by the garbage collector.
|
||||||
|
|
|
||||||
|
| Other session cookie settings are shared with the rest of the application,
|
||||||
|
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['sess_driver'] = 'files';
|
||||||
|
$config['sess_cookie_name'] = 'ci_session';
|
||||||
|
$config['sess_expiration'] = 7200;
|
||||||
|
$config['sess_save_path'] = NULL;
|
||||||
|
$config['sess_match_ip'] = FALSE;
|
||||||
|
$config['sess_time_to_update'] = 300;
|
||||||
|
$config['sess_regenerate_destroy'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cookie Related Variables
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions
|
||||||
|
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
|
||||||
|
| 'cookie_path' = Typically will be a forward slash
|
||||||
|
| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists.
|
||||||
|
| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript)
|
||||||
|
|
|
||||||
|
| Note: These settings (with the exception of 'cookie_prefix' and
|
||||||
|
| 'cookie_httponly') will also affect sessions.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['cookie_prefix'] = '';
|
||||||
|
$config['cookie_domain'] = '';
|
||||||
|
$config['cookie_path'] = '/';
|
||||||
|
$config['cookie_secure'] = FALSE;
|
||||||
|
$config['cookie_httponly'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Standardize newlines
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Determines whether to standardize newline characters in input data,
|
||||||
|
| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value.
|
||||||
|
|
|
||||||
|
| WARNING: This feature is DEPRECATED and currently available only
|
||||||
|
| for backwards compatibility purposes!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['standardize_newlines'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Global XSS Filtering
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Determines whether the XSS filter is always active when GET, POST or
|
||||||
|
| COOKIE data is encountered
|
||||||
|
|
|
||||||
|
| WARNING: This feature is DEPRECATED and currently available only
|
||||||
|
| for backwards compatibility purposes!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['global_xss_filtering'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cross Site Request Forgery
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
|
||||||
|
| checked on a submitted form. If you are accepting user data, it is strongly
|
||||||
|
| recommended CSRF protection be enabled.
|
||||||
|
|
|
||||||
|
| 'csrf_token_name' = The token name
|
||||||
|
| 'csrf_cookie_name' = The cookie name
|
||||||
|
| 'csrf_expire' = The number in seconds the token should expire.
|
||||||
|
| 'csrf_regenerate' = Regenerate token on every submission
|
||||||
|
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
|
||||||
|
*/
|
||||||
|
$config['csrf_protection'] = FALSE;
|
||||||
|
$config['csrf_token_name'] = 'csrf_test_name';
|
||||||
|
$config['csrf_cookie_name'] = 'csrf_cookie_name';
|
||||||
|
$config['csrf_expire'] = 7200;
|
||||||
|
$config['csrf_regenerate'] = TRUE;
|
||||||
|
$config['csrf_exclude_uris'] = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Output Compression
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Enables Gzip output compression for faster page loads. When enabled,
|
||||||
|
| the output class will test whether your server supports Gzip.
|
||||||
|
| Even if it does, however, not all browsers support compression
|
||||||
|
| so enable only if you are reasonably sure your visitors can handle it.
|
||||||
|
|
|
||||||
|
| Only used if zlib.output_compression is turned off in your php.ini.
|
||||||
|
| Please do not use it together with httpd-level output compression.
|
||||||
|
|
|
||||||
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
|
||||||
|
| means you are prematurely outputting something to your browser. It could
|
||||||
|
| even be a line of whitespace at the end of one of your scripts. For
|
||||||
|
| compression to work, nothing can be sent before the output buffer is called
|
||||||
|
| by the output class. Do not 'echo' any values with compression enabled.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['compress_output'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Master Time Reference
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Options are 'local' or any PHP supported timezone. This preference tells
|
||||||
|
| the system whether to use your server's local time as the master 'now'
|
||||||
|
| reference, or convert it to the configured one timezone. See the 'date
|
||||||
|
| helper' page of the user guide for information regarding date handling.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['time_reference'] = 'local';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Rewrite PHP Short Tags
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If your PHP installation does not have short tag support enabled CI
|
||||||
|
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
|
||||||
|
| in your view files. Options are TRUE or FALSE (boolean)
|
||||||
|
|
|
||||||
|
| Note: You need to have eval() enabled for this to work.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rewrite_short_tags'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Reverse Proxy IPs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If your server is behind a reverse proxy, you must whitelist the proxy
|
||||||
|
| IP addresses from which CodeIgniter should trust headers such as
|
||||||
|
| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
|
||||||
|
| the visitor's IP address.
|
||||||
|
|
|
||||||
|
| You can use both an array or a comma-separated list of proxy addresses,
|
||||||
|
| as well as specifying whole subnets. Here are a few examples:
|
||||||
|
|
|
||||||
|
| Comma-separated: '10.0.1.200,192.168.5.0/24'
|
||||||
|
| Array: array('10.0.1.200', '192.168.5.0/24')
|
||||||
|
*/
|
||||||
|
$config['proxy_ips'] = '';
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Display Debug backtrace
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If set to TRUE, a backtrace will be displayed along with php errors. If
|
||||||
|
| error_reporting is disabled, the backtrace will not display, regardless
|
||||||
|
| of this setting
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
defined('SHOW_DEBUG_BACKTRACE') OR define('SHOW_DEBUG_BACKTRACE', TRUE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| File and Directory Modes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These prefs are used when checking and setting modes when working
|
||||||
|
| with the file system. The defaults are fine on servers with proper
|
||||||
|
| security, but you may wish (or even need) to change the values in
|
||||||
|
| certain environments (Apache running a separate process for each
|
||||||
|
| user, PHP under CGI with Apache suEXEC, etc.). Octal values should
|
||||||
|
| always be used to set the mode correctly.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
defined('FILE_READ_MODE') OR define('FILE_READ_MODE', 0644);
|
||||||
|
defined('FILE_WRITE_MODE') OR define('FILE_WRITE_MODE', 0666);
|
||||||
|
defined('DIR_READ_MODE') OR define('DIR_READ_MODE', 0755);
|
||||||
|
defined('DIR_WRITE_MODE') OR define('DIR_WRITE_MODE', 0755);
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| File Stream Modes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These modes are used when working with fopen()/popen()
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
defined('FOPEN_READ') OR define('FOPEN_READ', 'rb');
|
||||||
|
defined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b');
|
||||||
|
defined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
|
||||||
|
defined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
|
||||||
|
defined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab');
|
||||||
|
defined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b');
|
||||||
|
defined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb');
|
||||||
|
defined('FOPEN_READ_WRITE_CREATE_STRICT') OR define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Exit Status Codes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Used to indicate the conditions under which the script is exit()ing.
|
||||||
|
| While there is no universal standard for error codes, there are some
|
||||||
|
| broad conventions. Three such conventions are mentioned below, for
|
||||||
|
| those who wish to make use of them. The CodeIgniter defaults were
|
||||||
|
| chosen for the least overlap with these conventions, while still
|
||||||
|
| leaving room for others to be defined in future versions and user
|
||||||
|
| applications.
|
||||||
|
|
|
||||||
|
| The three main conventions used for determining exit status codes
|
||||||
|
| are as follows:
|
||||||
|
|
|
||||||
|
| Standard C/C++ Library (stdlibc):
|
||||||
|
| http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
|
||||||
|
| (This link also contains other GNU-specific conventions)
|
||||||
|
| BSD sysexits.h:
|
||||||
|
| http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
|
||||||
|
| Bash scripting:
|
||||||
|
| http://tldp.org/LDP/abs/html/exitcodes.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
defined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors
|
||||||
|
defined('EXIT_ERROR') OR define('EXIT_ERROR', 1); // generic error
|
||||||
|
defined('EXIT_CONFIG') OR define('EXIT_CONFIG', 3); // configuration error
|
||||||
|
defined('EXIT_UNKNOWN_FILE') OR define('EXIT_UNKNOWN_FILE', 4); // file not found
|
||||||
|
defined('EXIT_UNKNOWN_CLASS') OR define('EXIT_UNKNOWN_CLASS', 5); // unknown class
|
||||||
|
defined('EXIT_UNKNOWN_METHOD') OR define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
|
||||||
|
defined('EXIT_USER_INPUT') OR define('EXIT_USER_INPUT', 7); // invalid user input
|
||||||
|
defined('EXIT_DATABASE') OR define('EXIT_DATABASE', 8); // database error
|
||||||
|
defined('EXIT__AUTO_MIN') OR define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
|
||||||
|
defined('EXIT__AUTO_MAX') OR define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') or exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| DATABASE CONNECTIVITY SETTINGS
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file will contain the settings needed to access your database.
|
||||||
|
|
|
||||||
|
| For complete instructions please consult the 'Database Connection'
|
||||||
|
| page of the User Guide.
|
||||||
|
|
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| EXPLANATION OF VARIABLES
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| ['dsn'] The full DSN string describe a connection to the database.
|
||||||
|
| ['hostname'] The hostname of your database server.
|
||||||
|
| ['username'] The username used to connect to the database
|
||||||
|
| ['password'] The password used to connect to the database
|
||||||
|
| ['database'] The name of the database you want to connect to
|
||||||
|
| ['dbdriver'] The database driver. e.g.: mysqli.
|
||||||
|
| Currently supported:
|
||||||
|
| cubrid, ibase, mssql, mysql, mysqli, oci8,
|
||||||
|
| odbc, pdo, postgre, sqlite, sqlite3, sqlsrv
|
||||||
|
| ['dbprefix'] You can add an optional prefix, which will be added
|
||||||
|
| to the table name when using the Query Builder class
|
||||||
|
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|
||||||
|
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|
||||||
|
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
|
||||||
|
| ['cachedir'] The path to the folder where cache files should be stored
|
||||||
|
| ['char_set'] The character set used in communicating with the database
|
||||||
|
| ['dbcollat'] The character collation used in communicating with the database
|
||||||
|
| NOTE: For MySQL and MySQLi databases, this setting is only used
|
||||||
|
| as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
|
||||||
|
| (and in table creation queries made with DB Forge).
|
||||||
|
| There is an incompatibility in PHP with mysql_real_escape_string() which
|
||||||
|
| can make your site vulnerable to SQL injection if you are using a
|
||||||
|
| multi-byte character set and are running versions lower than these.
|
||||||
|
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
|
||||||
|
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
|
||||||
|
| ['encrypt'] Whether or not to use an encrypted connection.
|
||||||
|
|
|
||||||
|
| 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
|
||||||
|
| 'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
||||||
|
|
|
||||||
|
| 'ssl_key' - Path to the private key file
|
||||||
|
| 'ssl_cert' - Path to the public key certificate file
|
||||||
|
| 'ssl_ca' - Path to the certificate authority file
|
||||||
|
| 'ssl_capath' - Path to a directory containing trusted CA certificates in PEM format
|
||||||
|
| 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
|
||||||
|
| 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only)
|
||||||
|
|
|
||||||
|
| ['compress'] Whether or not to use client compression (MySQL only)
|
||||||
|
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|
||||||
|
| - good for ensuring strict SQL while developing
|
||||||
|
| ['ssl_options'] Used to set various SSL options that can be used when making SSL connections.
|
||||||
|
| ['failover'] array - A array with 0 or more data for connections if the main should fail.
|
||||||
|
| ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
|
||||||
|
| NOTE: Disabling this will also effectively disable both
|
||||||
|
| $this->db->last_query() and profiling of DB queries.
|
||||||
|
| When you run a query, with this setting set to TRUE (default),
|
||||||
|
| CodeIgniter will store the SQL statement for debugging purposes.
|
||||||
|
| However, this may cause high memory usage, especially if you run
|
||||||
|
| a lot of SQL queries ... disable this to avoid that problem.
|
||||||
|
|
|
||||||
|
| The $active_group variable lets you choose which connection group to
|
||||||
|
| make active. By default there is only one group (the 'default' group).
|
||||||
|
|
|
||||||
|
| The $query_builder variables lets you determine whether or not to load
|
||||||
|
| the query builder class.
|
||||||
|
*/
|
||||||
|
$active_group = 'default';
|
||||||
|
$query_builder = true;
|
||||||
|
|
||||||
|
$db['default'] = array(
|
||||||
|
'dsn' => '',
|
||||||
|
'hostname' => 'localhost',
|
||||||
|
'username' => 'root',
|
||||||
|
'password' => '',
|
||||||
|
'database' => 'skripsinya',
|
||||||
|
'dbdriver' => 'mysqli',
|
||||||
|
'dbprefix' => '',
|
||||||
|
'pconnect' => false,
|
||||||
|
'db_debug' => (ENVIRONMENT !== 'production'),
|
||||||
|
'cache_on' => false,
|
||||||
|
'cachedir' => '',
|
||||||
|
'char_set' => 'utf8',
|
||||||
|
'dbcollat' => 'utf8_general_ci',
|
||||||
|
'swap_pre' => '',
|
||||||
|
'encrypt' => false,
|
||||||
|
'compress' => false,
|
||||||
|
'stricton' => false,
|
||||||
|
'failover' => array(),
|
||||||
|
'save_queries' => true,
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
$_doctypes = array(
|
||||||
|
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
|
||||||
|
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
|
||||||
|
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
|
||||||
|
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
|
||||||
|
'xhtml-basic11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
|
||||||
|
'html5' => '<!DOCTYPE html>',
|
||||||
|
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
|
||||||
|
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
|
||||||
|
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
|
||||||
|
'mathml1' => '<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">',
|
||||||
|
'mathml2' => '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">',
|
||||||
|
'svg10' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',
|
||||||
|
'svg11' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
|
||||||
|
'svg11-basic' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">',
|
||||||
|
'svg11-tiny' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">',
|
||||||
|
'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
|
||||||
|
'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
|
||||||
|
'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
|
||||||
|
'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">'
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,103 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Foreign Characters
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains an array of foreign characters for transliteration
|
||||||
|
| conversion used by the Text helper
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$foreign_characters = array(
|
||||||
|
'/ä|æ|ǽ/' => 'ae',
|
||||||
|
'/ö|œ/' => 'oe',
|
||||||
|
'/ü/' => 'ue',
|
||||||
|
'/Ä/' => 'Ae',
|
||||||
|
'/Ü/' => 'Ue',
|
||||||
|
'/Ö/' => 'Oe',
|
||||||
|
'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',
|
||||||
|
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',
|
||||||
|
'/Б/' => 'B',
|
||||||
|
'/б/' => 'b',
|
||||||
|
'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
|
||||||
|
'/ç|ć|ĉ|ċ|č/' => 'c',
|
||||||
|
'/Д/' => 'D',
|
||||||
|
'/д/' => 'd',
|
||||||
|
'/Ð|Ď|Đ|Δ/' => 'Dj',
|
||||||
|
'/ð|ď|đ|δ/' => 'dj',
|
||||||
|
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E',
|
||||||
|
'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e',
|
||||||
|
'/Ф/' => 'F',
|
||||||
|
'/ф/' => 'f',
|
||||||
|
'/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G',
|
||||||
|
'/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g',
|
||||||
|
'/Ĥ|Ħ/' => 'H',
|
||||||
|
'/ĥ|ħ/' => 'h',
|
||||||
|
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I',
|
||||||
|
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i',
|
||||||
|
'/Ĵ/' => 'J',
|
||||||
|
'/ĵ/' => 'j',
|
||||||
|
'/Ķ|Κ|К/' => 'K',
|
||||||
|
'/ķ|κ|к/' => 'k',
|
||||||
|
'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',
|
||||||
|
'/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',
|
||||||
|
'/М/' => 'M',
|
||||||
|
'/м/' => 'm',
|
||||||
|
'/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',
|
||||||
|
'/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n',
|
||||||
|
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O',
|
||||||
|
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',
|
||||||
|
'/П/' => 'P',
|
||||||
|
'/п/' => 'p',
|
||||||
|
'/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',
|
||||||
|
'/ŕ|ŗ|ř|ρ|р/' => 'r',
|
||||||
|
'/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',
|
||||||
|
'/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',
|
||||||
|
'/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T',
|
||||||
|
'/ț|ţ|ť|ŧ|т/' => 't',
|
||||||
|
'/Þ|þ/' => 'th',
|
||||||
|
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',
|
||||||
|
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',
|
||||||
|
'/Ƴ|Ɏ|Ỵ|Ẏ|Ӳ|Ӯ|Ў|Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y',
|
||||||
|
'/ẙ|ʏ|ƴ|ɏ|ỵ|ẏ|ӳ|ӯ|ў|ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y',
|
||||||
|
'/В/' => 'V',
|
||||||
|
'/в/' => 'v',
|
||||||
|
'/Ŵ/' => 'W',
|
||||||
|
'/ŵ/' => 'w',
|
||||||
|
'/Ź|Ż|Ž|Ζ|З/' => 'Z',
|
||||||
|
'/ź|ż|ž|ζ|з/' => 'z',
|
||||||
|
'/Æ|Ǽ/' => 'AE',
|
||||||
|
'/ß/' => 'ss',
|
||||||
|
'/IJ/' => 'IJ',
|
||||||
|
'/ij/' => 'ij',
|
||||||
|
'/Œ/' => 'OE',
|
||||||
|
'/ƒ/' => 'f',
|
||||||
|
'/ξ/' => 'ks',
|
||||||
|
'/π/' => 'p',
|
||||||
|
'/β/' => 'v',
|
||||||
|
'/μ/' => 'm',
|
||||||
|
'/ψ/' => 'ps',
|
||||||
|
'/Ё/' => 'Yo',
|
||||||
|
'/ё/' => 'yo',
|
||||||
|
'/Є/' => 'Ye',
|
||||||
|
'/є/' => 'ye',
|
||||||
|
'/Ї/' => 'Yi',
|
||||||
|
'/Ж/' => 'Zh',
|
||||||
|
'/ж/' => 'zh',
|
||||||
|
'/Х/' => 'Kh',
|
||||||
|
'/х/' => 'kh',
|
||||||
|
'/Ц/' => 'Ts',
|
||||||
|
'/ц/' => 'ts',
|
||||||
|
'/Ч/' => 'Ch',
|
||||||
|
'/ч/' => 'ch',
|
||||||
|
'/Ш/' => 'Sh',
|
||||||
|
'/ш/' => 'sh',
|
||||||
|
'/Щ/' => 'Shch',
|
||||||
|
'/щ/' => 'shch',
|
||||||
|
'/Ъ|ъ|Ь|ь/' => '',
|
||||||
|
'/Ю/' => 'Yu',
|
||||||
|
'/ю/' => 'yu',
|
||||||
|
'/Я/' => 'Ya',
|
||||||
|
'/я/' => 'ya'
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| Hooks
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| This file lets you define "hooks" to extend CI without hacking the core
|
||||||
|
| files. Please see the user guide for info:
|
||||||
|
|
|
||||||
|
| https://codeigniter.com/user_guide/general/hooks.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| Memcached settings
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| Your Memcached servers can be specified below.
|
||||||
|
|
|
||||||
|
| See: https://codeigniter.com/user_guide/libraries/caching.html#memcached
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config = array(
|
||||||
|
'default' => array(
|
||||||
|
'hostname' => '127.0.0.1',
|
||||||
|
'port' => '11211',
|
||||||
|
'weight' => '1',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enable/Disable Migrations
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Migrations are disabled by default for security reasons.
|
||||||
|
| You should enable migrations whenever you intend to do a schema migration
|
||||||
|
| and disable it back when you're done.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['migration_enabled'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Migration Type
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Migration file names may be based on a sequential identifier or on
|
||||||
|
| a timestamp. Options are:
|
||||||
|
|
|
||||||
|
| 'sequential' = Sequential migration naming (001_add_blog.php)
|
||||||
|
| 'timestamp' = Timestamp migration naming (20121031104401_add_blog.php)
|
||||||
|
| Use timestamp format YYYYMMDDHHIISS.
|
||||||
|
|
|
||||||
|
| Note: If this configuration value is missing the Migration library
|
||||||
|
| defaults to 'sequential' for backward compatibility with CI2.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['migration_type'] = 'timestamp';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Migrations table
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This is the name of the table that will store the current migrations state.
|
||||||
|
| When migrations runs it will store in a database table which migration
|
||||||
|
| level the system is at. It then compares the migration level in this
|
||||||
|
| table to the $config['migration_version'] if they are not the same it
|
||||||
|
| will migrate up. This must be set.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['migration_table'] = 'migrations';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Auto Migrate To Latest
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If this is set to TRUE when you load the migrations class and have
|
||||||
|
| $config['migration_enabled'] set to TRUE the system will auto migrate
|
||||||
|
| to your latest migration (whatever $config['migration_version'] is
|
||||||
|
| set to). This way you do not have to call migrations anywhere else
|
||||||
|
| in your code to have the latest migration.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['migration_auto_latest'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Migrations version
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This is used to set migration version that the file system should be on.
|
||||||
|
| If you run $this->migration->current() this is the version that schema will
|
||||||
|
| be upgraded / downgraded to.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['migration_version'] = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Migrations Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Path to your migrations folder.
|
||||||
|
| Typically, it will be within your application path.
|
||||||
|
| Also, writing permission is required within the migrations path.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['migration_path'] = APPPATH.'migrations/';
|
||||||
|
|
@ -0,0 +1,184 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| MIME TYPES
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains an array of mime types. It is used by the
|
||||||
|
| Upload class to help identify allowed file types.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
return array(
|
||||||
|
'hqx' => array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
|
||||||
|
'cpt' => 'application/mac-compactpro',
|
||||||
|
'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),
|
||||||
|
'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),
|
||||||
|
'dms' => 'application/octet-stream',
|
||||||
|
'lha' => 'application/octet-stream',
|
||||||
|
'lzh' => 'application/octet-stream',
|
||||||
|
'exe' => array('application/octet-stream', 'application/x-msdownload'),
|
||||||
|
'class' => 'application/octet-stream',
|
||||||
|
'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'),
|
||||||
|
'so' => 'application/octet-stream',
|
||||||
|
'sea' => 'application/octet-stream',
|
||||||
|
'dll' => 'application/octet-stream',
|
||||||
|
'oda' => 'application/oda',
|
||||||
|
'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'),
|
||||||
|
'ai' => array('application/pdf', 'application/postscript'),
|
||||||
|
'eps' => 'application/postscript',
|
||||||
|
'ps' => 'application/postscript',
|
||||||
|
'smi' => 'application/smil',
|
||||||
|
'smil' => 'application/smil',
|
||||||
|
'mif' => 'application/vnd.mif',
|
||||||
|
'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'),
|
||||||
|
'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'),
|
||||||
|
'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'),
|
||||||
|
'wbxml' => 'application/wbxml',
|
||||||
|
'wmlc' => 'application/wmlc',
|
||||||
|
'dcr' => 'application/x-director',
|
||||||
|
'dir' => 'application/x-director',
|
||||||
|
'dxr' => 'application/x-director',
|
||||||
|
'dvi' => 'application/x-dvi',
|
||||||
|
'gtar' => 'application/x-gtar',
|
||||||
|
'gz' => 'application/x-gzip',
|
||||||
|
'gzip' => 'application/x-gzip',
|
||||||
|
'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'),
|
||||||
|
'php4' => 'application/x-httpd-php',
|
||||||
|
'php3' => 'application/x-httpd-php',
|
||||||
|
'phtml' => 'application/x-httpd-php',
|
||||||
|
'phps' => 'application/x-httpd-php-source',
|
||||||
|
'js' => array('application/x-javascript', 'text/plain'),
|
||||||
|
'swf' => 'application/x-shockwave-flash',
|
||||||
|
'sit' => 'application/x-stuffit',
|
||||||
|
'tar' => 'application/x-tar',
|
||||||
|
'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
|
||||||
|
'z' => 'application/x-compress',
|
||||||
|
'xhtml' => 'application/xhtml+xml',
|
||||||
|
'xht' => 'application/xhtml+xml',
|
||||||
|
'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),
|
||||||
|
'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'),
|
||||||
|
'mid' => 'audio/midi',
|
||||||
|
'midi' => 'audio/midi',
|
||||||
|
'mpga' => 'audio/mpeg',
|
||||||
|
'mp2' => 'audio/mpeg',
|
||||||
|
'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
|
||||||
|
'aif' => array('audio/x-aiff', 'audio/aiff'),
|
||||||
|
'aiff' => array('audio/x-aiff', 'audio/aiff'),
|
||||||
|
'aifc' => 'audio/x-aiff',
|
||||||
|
'ram' => 'audio/x-pn-realaudio',
|
||||||
|
'rm' => 'audio/x-pn-realaudio',
|
||||||
|
'rpm' => 'audio/x-pn-realaudio-plugin',
|
||||||
|
'ra' => 'audio/x-realaudio',
|
||||||
|
'rv' => 'video/vnd.rn-realvideo',
|
||||||
|
'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
|
||||||
|
'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'),
|
||||||
|
'gif' => 'image/gif',
|
||||||
|
'jpeg' => array('image/jpeg', 'image/pjpeg'),
|
||||||
|
'jpg' => array('image/jpeg', 'image/pjpeg'),
|
||||||
|
'jpe' => array('image/jpeg', 'image/pjpeg'),
|
||||||
|
'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
|
||||||
|
'png' => array('image/png', 'image/x-png'),
|
||||||
|
'tiff' => 'image/tiff',
|
||||||
|
'tif' => 'image/tiff',
|
||||||
|
'css' => array('text/css', 'text/plain'),
|
||||||
|
'html' => array('text/html', 'text/plain'),
|
||||||
|
'htm' => array('text/html', 'text/plain'),
|
||||||
|
'shtml' => array('text/html', 'text/plain'),
|
||||||
|
'txt' => 'text/plain',
|
||||||
|
'text' => 'text/plain',
|
||||||
|
'log' => array('text/plain', 'text/x-log'),
|
||||||
|
'rtx' => 'text/richtext',
|
||||||
|
'rtf' => 'text/rtf',
|
||||||
|
'xml' => array('application/xml', 'text/xml', 'text/plain'),
|
||||||
|
'xsl' => array('application/xml', 'text/xsl', 'text/xml'),
|
||||||
|
'mpeg' => 'video/mpeg',
|
||||||
|
'mpg' => 'video/mpeg',
|
||||||
|
'mpe' => 'video/mpeg',
|
||||||
|
'qt' => 'video/quicktime',
|
||||||
|
'mov' => 'video/quicktime',
|
||||||
|
'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'),
|
||||||
|
'movie' => 'video/x-sgi-movie',
|
||||||
|
'doc' => array('application/msword', 'application/vnd.ms-office'),
|
||||||
|
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'),
|
||||||
|
'dot' => array('application/msword', 'application/vnd.ms-office'),
|
||||||
|
'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'),
|
||||||
|
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'),
|
||||||
|
'word' => array('application/msword', 'application/octet-stream'),
|
||||||
|
'xl' => 'application/excel',
|
||||||
|
'eml' => 'message/rfc822',
|
||||||
|
'json' => array('application/json', 'text/json'),
|
||||||
|
'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
|
||||||
|
'p10' => array('application/x-pkcs10', 'application/pkcs10'),
|
||||||
|
'p12' => 'application/x-pkcs12',
|
||||||
|
'p7a' => 'application/x-pkcs7-signature',
|
||||||
|
'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
|
||||||
|
'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
|
||||||
|
'p7r' => 'application/x-pkcs7-certreqresp',
|
||||||
|
'p7s' => 'application/pkcs7-signature',
|
||||||
|
'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'),
|
||||||
|
'crl' => array('application/pkix-crl', 'application/pkcs-crl'),
|
||||||
|
'der' => 'application/x-x509-ca-cert',
|
||||||
|
'kdb' => 'application/octet-stream',
|
||||||
|
'pgp' => 'application/pgp',
|
||||||
|
'gpg' => 'application/gpg-keys',
|
||||||
|
'sst' => 'application/octet-stream',
|
||||||
|
'csr' => 'application/octet-stream',
|
||||||
|
'rsa' => 'application/x-pkcs7',
|
||||||
|
'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'),
|
||||||
|
'3g2' => 'video/3gpp2',
|
||||||
|
'3gp' => array('video/3gp', 'video/3gpp'),
|
||||||
|
'mp4' => 'video/mp4',
|
||||||
|
'm4a' => 'audio/x-m4a',
|
||||||
|
'f4v' => array('video/mp4', 'video/x-f4v'),
|
||||||
|
'flv' => 'video/x-flv',
|
||||||
|
'webm' => 'video/webm',
|
||||||
|
'aac' => 'audio/x-acc',
|
||||||
|
'm4u' => 'application/vnd.mpegurl',
|
||||||
|
'm3u' => 'text/plain',
|
||||||
|
'xspf' => 'application/xspf+xml',
|
||||||
|
'vlc' => 'application/videolan',
|
||||||
|
'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'),
|
||||||
|
'au' => 'audio/x-au',
|
||||||
|
'ac3' => 'audio/ac3',
|
||||||
|
'flac' => 'audio/x-flac',
|
||||||
|
'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'),
|
||||||
|
'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'),
|
||||||
|
'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'),
|
||||||
|
'ics' => 'text/calendar',
|
||||||
|
'ical' => 'text/calendar',
|
||||||
|
'zsh' => 'text/x-scriptzsh',
|
||||||
|
'7z' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
|
||||||
|
'7zip' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
|
||||||
|
'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'),
|
||||||
|
'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'),
|
||||||
|
'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'),
|
||||||
|
'svg' => array('image/svg+xml', 'application/xml', 'text/xml'),
|
||||||
|
'vcf' => 'text/x-vcard',
|
||||||
|
'srt' => array('text/srt', 'text/plain'),
|
||||||
|
'vtt' => array('text/vtt', 'text/plain'),
|
||||||
|
'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'),
|
||||||
|
'odc' => 'application/vnd.oasis.opendocument.chart',
|
||||||
|
'otc' => 'application/vnd.oasis.opendocument.chart-template',
|
||||||
|
'odf' => 'application/vnd.oasis.opendocument.formula',
|
||||||
|
'otf' => 'application/vnd.oasis.opendocument.formula-template',
|
||||||
|
'odg' => 'application/vnd.oasis.opendocument.graphics',
|
||||||
|
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
|
||||||
|
'odi' => 'application/vnd.oasis.opendocument.image',
|
||||||
|
'oti' => 'application/vnd.oasis.opendocument.image-template',
|
||||||
|
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
||||||
|
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
|
||||||
|
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
||||||
|
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
|
||||||
|
'odt' => 'application/vnd.oasis.opendocument.text',
|
||||||
|
'odm' => 'application/vnd.oasis.opendocument.text-master',
|
||||||
|
'ott' => 'application/vnd.oasis.opendocument.text-template',
|
||||||
|
'oth' => 'application/vnd.oasis.opendocument.text-web'
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| Profiler Sections
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| This file lets you determine whether or not various sections of Profiler
|
||||||
|
| data are displayed when the Profiler is enabled.
|
||||||
|
| Please see the user guide for info:
|
||||||
|
|
|
||||||
|
| https://codeigniter.com/user_guide/general/profiling.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| URI ROUTING
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| This file lets you re-map URI requests to specific controller functions.
|
||||||
|
|
|
||||||
|
| Typically there is a one-to-one relationship between a URL string
|
||||||
|
| and its corresponding controller class/method. The segments in a
|
||||||
|
| URL normally follow this pattern:
|
||||||
|
|
|
||||||
|
| example.com/class/method/id/
|
||||||
|
|
|
||||||
|
| In some instances, however, you may want to remap this relationship
|
||||||
|
| so that a different class/function is called than the one
|
||||||
|
| corresponding to the URL.
|
||||||
|
|
|
||||||
|
| Please see the user guide for complete details:
|
||||||
|
|
|
||||||
|
| https://codeigniter.com/user_guide/general/routing.html
|
||||||
|
|
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| RESERVED ROUTES
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| There are three reserved routes:
|
||||||
|
|
|
||||||
|
| $route['default_controller'] = 'welcome';
|
||||||
|
|
|
||||||
|
| This route indicates which controller class should be loaded if the
|
||||||
|
| URI contains no data. In the above example, the "welcome" class
|
||||||
|
| would be loaded.
|
||||||
|
|
|
||||||
|
| $route['404_override'] = 'errors/page_missing';
|
||||||
|
|
|
||||||
|
| This route will tell the Router which controller/method to use if those
|
||||||
|
| provided in the URL cannot be matched to a valid route.
|
||||||
|
|
|
||||||
|
| $route['translate_uri_dashes'] = FALSE;
|
||||||
|
|
|
||||||
|
| This is not exactly a route, but allows you to automatically route
|
||||||
|
| controller and method names that contain dashes. '-' isn't a valid
|
||||||
|
| class or method name character, so it requires translation.
|
||||||
|
| When you set this option to TRUE, it will replace ALL dashes in the
|
||||||
|
| controller and method URI segments.
|
||||||
|
|
|
||||||
|
| Examples: my-controller/index -> my_controller/index
|
||||||
|
| my-controller/my-method -> my_controller/my_method
|
||||||
|
*/
|
||||||
|
|
||||||
|
$route['default_controller'] = 'welcome';
|
||||||
|
$route['404_override'] = '';
|
||||||
|
$route['translate_uri_dashes'] = FALSE;
|
||||||
|
$route['dist/tambah_krit'] = 'dist/tambah_krit';
|
||||||
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| SMILEYS
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains an array of smileys for use with the emoticon helper.
|
||||||
|
| Individual images can be used to replace multiple smileys. For example:
|
||||||
|
| :-) and :) use the same image replacement.
|
||||||
|
|
|
||||||
|
| Please see user guide for more info:
|
||||||
|
| https://codeigniter.com/user_guide/helpers/smiley_helper.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$smileys = array(
|
||||||
|
|
||||||
|
// smiley image name width height alt
|
||||||
|
|
||||||
|
':-)' => array('grin.gif', '19', '19', 'grin'),
|
||||||
|
':lol:' => array('lol.gif', '19', '19', 'LOL'),
|
||||||
|
':cheese:' => array('cheese.gif', '19', '19', 'cheese'),
|
||||||
|
':)' => array('smile.gif', '19', '19', 'smile'),
|
||||||
|
';-)' => array('wink.gif', '19', '19', 'wink'),
|
||||||
|
';)' => array('wink.gif', '19', '19', 'wink'),
|
||||||
|
':smirk:' => array('smirk.gif', '19', '19', 'smirk'),
|
||||||
|
':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'),
|
||||||
|
':-S' => array('confused.gif', '19', '19', 'confused'),
|
||||||
|
':wow:' => array('surprise.gif', '19', '19', 'surprised'),
|
||||||
|
':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'),
|
||||||
|
':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'),
|
||||||
|
'%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'),
|
||||||
|
';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'),
|
||||||
|
':P' => array('raspberry.gif', '19', '19', 'raspberry'),
|
||||||
|
':blank:' => array('blank.gif', '19', '19', 'blank stare'),
|
||||||
|
':long:' => array('longface.gif', '19', '19', 'long face'),
|
||||||
|
':ohh:' => array('ohh.gif', '19', '19', 'ohh'),
|
||||||
|
':grrr:' => array('grrr.gif', '19', '19', 'grrr'),
|
||||||
|
':gulp:' => array('gulp.gif', '19', '19', 'gulp'),
|
||||||
|
'8-/' => array('ohoh.gif', '19', '19', 'oh oh'),
|
||||||
|
':down:' => array('downer.gif', '19', '19', 'downer'),
|
||||||
|
':red:' => array('embarrassed.gif', '19', '19', 'red face'),
|
||||||
|
':sick:' => array('sick.gif', '19', '19', 'sick'),
|
||||||
|
':shut:' => array('shuteye.gif', '19', '19', 'shut eye'),
|
||||||
|
':-/' => array('hmm.gif', '19', '19', 'hmmm'),
|
||||||
|
'>:(' => array('mad.gif', '19', '19', 'mad'),
|
||||||
|
':mad:' => array('mad.gif', '19', '19', 'mad'),
|
||||||
|
'>:-(' => array('angry.gif', '19', '19', 'angry'),
|
||||||
|
':angry:' => array('angry.gif', '19', '19', 'angry'),
|
||||||
|
':zip:' => array('zip.gif', '19', '19', 'zipper'),
|
||||||
|
':kiss:' => array('kiss.gif', '19', '19', 'kiss'),
|
||||||
|
':ahhh:' => array('shock.gif', '19', '19', 'shock'),
|
||||||
|
':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'),
|
||||||
|
':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'),
|
||||||
|
':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'),
|
||||||
|
':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'),
|
||||||
|
':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'),
|
||||||
|
':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'),
|
||||||
|
':vampire:' => array('vampire.gif', '19', '19', 'vampire'),
|
||||||
|
':snake:' => array('snake.gif', '19', '19', 'snake'),
|
||||||
|
':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'),
|
||||||
|
':question:' => array('question.gif', '19', '19', 'question')
|
||||||
|
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,214 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| USER AGENT TYPES
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains four arrays of user agent data. It is used by the
|
||||||
|
| User Agent Class to help identify browser, platform, robot, and
|
||||||
|
| mobile device data. The array keys are used to identify the device
|
||||||
|
| and the array values are used to set the actual name of the item.
|
||||||
|
*/
|
||||||
|
$platforms = array(
|
||||||
|
'windows nt 10.0' => 'Windows 10',
|
||||||
|
'windows nt 6.3' => 'Windows 8.1',
|
||||||
|
'windows nt 6.2' => 'Windows 8',
|
||||||
|
'windows nt 6.1' => 'Windows 7',
|
||||||
|
'windows nt 6.0' => 'Windows Vista',
|
||||||
|
'windows nt 5.2' => 'Windows 2003',
|
||||||
|
'windows nt 5.1' => 'Windows XP',
|
||||||
|
'windows nt 5.0' => 'Windows 2000',
|
||||||
|
'windows nt 4.0' => 'Windows NT 4.0',
|
||||||
|
'winnt4.0' => 'Windows NT 4.0',
|
||||||
|
'winnt 4.0' => 'Windows NT',
|
||||||
|
'winnt' => 'Windows NT',
|
||||||
|
'windows 98' => 'Windows 98',
|
||||||
|
'win98' => 'Windows 98',
|
||||||
|
'windows 95' => 'Windows 95',
|
||||||
|
'win95' => 'Windows 95',
|
||||||
|
'windows phone' => 'Windows Phone',
|
||||||
|
'windows' => 'Unknown Windows OS',
|
||||||
|
'android' => 'Android',
|
||||||
|
'blackberry' => 'BlackBerry',
|
||||||
|
'iphone' => 'iOS',
|
||||||
|
'ipad' => 'iOS',
|
||||||
|
'ipod' => 'iOS',
|
||||||
|
'os x' => 'Mac OS X',
|
||||||
|
'ppc mac' => 'Power PC Mac',
|
||||||
|
'freebsd' => 'FreeBSD',
|
||||||
|
'ppc' => 'Macintosh',
|
||||||
|
'linux' => 'Linux',
|
||||||
|
'debian' => 'Debian',
|
||||||
|
'sunos' => 'Sun Solaris',
|
||||||
|
'beos' => 'BeOS',
|
||||||
|
'apachebench' => 'ApacheBench',
|
||||||
|
'aix' => 'AIX',
|
||||||
|
'irix' => 'Irix',
|
||||||
|
'osf' => 'DEC OSF',
|
||||||
|
'hp-ux' => 'HP-UX',
|
||||||
|
'netbsd' => 'NetBSD',
|
||||||
|
'bsdi' => 'BSDi',
|
||||||
|
'openbsd' => 'OpenBSD',
|
||||||
|
'gnu' => 'GNU/Linux',
|
||||||
|
'unix' => 'Unknown Unix OS',
|
||||||
|
'symbian' => 'Symbian OS'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// The order of this array should NOT be changed. Many browsers return
|
||||||
|
// multiple browser types so we want to identify the sub-type first.
|
||||||
|
$browsers = array(
|
||||||
|
'OPR' => 'Opera',
|
||||||
|
'Flock' => 'Flock',
|
||||||
|
'Edge' => 'Edge',
|
||||||
|
'Chrome' => 'Chrome',
|
||||||
|
// Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string
|
||||||
|
'Opera.*?Version' => 'Opera',
|
||||||
|
'Opera' => 'Opera',
|
||||||
|
'MSIE' => 'Internet Explorer',
|
||||||
|
'Internet Explorer' => 'Internet Explorer',
|
||||||
|
'Trident.* rv' => 'Internet Explorer',
|
||||||
|
'Shiira' => 'Shiira',
|
||||||
|
'Firefox' => 'Firefox',
|
||||||
|
'Chimera' => 'Chimera',
|
||||||
|
'Phoenix' => 'Phoenix',
|
||||||
|
'Firebird' => 'Firebird',
|
||||||
|
'Camino' => 'Camino',
|
||||||
|
'Netscape' => 'Netscape',
|
||||||
|
'OmniWeb' => 'OmniWeb',
|
||||||
|
'Safari' => 'Safari',
|
||||||
|
'Mozilla' => 'Mozilla',
|
||||||
|
'Konqueror' => 'Konqueror',
|
||||||
|
'icab' => 'iCab',
|
||||||
|
'Lynx' => 'Lynx',
|
||||||
|
'Links' => 'Links',
|
||||||
|
'hotjava' => 'HotJava',
|
||||||
|
'amaya' => 'Amaya',
|
||||||
|
'IBrowse' => 'IBrowse',
|
||||||
|
'Maxthon' => 'Maxthon',
|
||||||
|
'Ubuntu' => 'Ubuntu Web Browser'
|
||||||
|
);
|
||||||
|
|
||||||
|
$mobiles = array(
|
||||||
|
// legacy array, old values commented out
|
||||||
|
'mobileexplorer' => 'Mobile Explorer',
|
||||||
|
// 'openwave' => 'Open Wave',
|
||||||
|
// 'opera mini' => 'Opera Mini',
|
||||||
|
// 'operamini' => 'Opera Mini',
|
||||||
|
// 'elaine' => 'Palm',
|
||||||
|
'palmsource' => 'Palm',
|
||||||
|
// 'digital paths' => 'Palm',
|
||||||
|
// 'avantgo' => 'Avantgo',
|
||||||
|
// 'xiino' => 'Xiino',
|
||||||
|
'palmscape' => 'Palmscape',
|
||||||
|
// 'nokia' => 'Nokia',
|
||||||
|
// 'ericsson' => 'Ericsson',
|
||||||
|
// 'blackberry' => 'BlackBerry',
|
||||||
|
// 'motorola' => 'Motorola'
|
||||||
|
|
||||||
|
// Phones and Manufacturers
|
||||||
|
'motorola' => 'Motorola',
|
||||||
|
'nokia' => 'Nokia',
|
||||||
|
'palm' => 'Palm',
|
||||||
|
'iphone' => 'Apple iPhone',
|
||||||
|
'ipad' => 'iPad',
|
||||||
|
'ipod' => 'Apple iPod Touch',
|
||||||
|
'sony' => 'Sony Ericsson',
|
||||||
|
'ericsson' => 'Sony Ericsson',
|
||||||
|
'blackberry' => 'BlackBerry',
|
||||||
|
'cocoon' => 'O2 Cocoon',
|
||||||
|
'blazer' => 'Treo',
|
||||||
|
'lg' => 'LG',
|
||||||
|
'amoi' => 'Amoi',
|
||||||
|
'xda' => 'XDA',
|
||||||
|
'mda' => 'MDA',
|
||||||
|
'vario' => 'Vario',
|
||||||
|
'htc' => 'HTC',
|
||||||
|
'samsung' => 'Samsung',
|
||||||
|
'sharp' => 'Sharp',
|
||||||
|
'sie-' => 'Siemens',
|
||||||
|
'alcatel' => 'Alcatel',
|
||||||
|
'benq' => 'BenQ',
|
||||||
|
'ipaq' => 'HP iPaq',
|
||||||
|
'mot-' => 'Motorola',
|
||||||
|
'playstation portable' => 'PlayStation Portable',
|
||||||
|
'playstation 3' => 'PlayStation 3',
|
||||||
|
'playstation vita' => 'PlayStation Vita',
|
||||||
|
'hiptop' => 'Danger Hiptop',
|
||||||
|
'nec-' => 'NEC',
|
||||||
|
'panasonic' => 'Panasonic',
|
||||||
|
'philips' => 'Philips',
|
||||||
|
'sagem' => 'Sagem',
|
||||||
|
'sanyo' => 'Sanyo',
|
||||||
|
'spv' => 'SPV',
|
||||||
|
'zte' => 'ZTE',
|
||||||
|
'sendo' => 'Sendo',
|
||||||
|
'nintendo dsi' => 'Nintendo DSi',
|
||||||
|
'nintendo ds' => 'Nintendo DS',
|
||||||
|
'nintendo 3ds' => 'Nintendo 3DS',
|
||||||
|
'wii' => 'Nintendo Wii',
|
||||||
|
'open web' => 'Open Web',
|
||||||
|
'openweb' => 'OpenWeb',
|
||||||
|
|
||||||
|
// Operating Systems
|
||||||
|
'android' => 'Android',
|
||||||
|
'symbian' => 'Symbian',
|
||||||
|
'SymbianOS' => 'SymbianOS',
|
||||||
|
'elaine' => 'Palm',
|
||||||
|
'series60' => 'Symbian S60',
|
||||||
|
'windows ce' => 'Windows CE',
|
||||||
|
|
||||||
|
// Browsers
|
||||||
|
'obigo' => 'Obigo',
|
||||||
|
'netfront' => 'Netfront Browser',
|
||||||
|
'openwave' => 'Openwave Browser',
|
||||||
|
'mobilexplorer' => 'Mobile Explorer',
|
||||||
|
'operamini' => 'Opera Mini',
|
||||||
|
'opera mini' => 'Opera Mini',
|
||||||
|
'opera mobi' => 'Opera Mobile',
|
||||||
|
'fennec' => 'Firefox Mobile',
|
||||||
|
|
||||||
|
// Other
|
||||||
|
'digital paths' => 'Digital Paths',
|
||||||
|
'avantgo' => 'AvantGo',
|
||||||
|
'xiino' => 'Xiino',
|
||||||
|
'novarra' => 'Novarra Transcoder',
|
||||||
|
'vodafone' => 'Vodafone',
|
||||||
|
'docomo' => 'NTT DoCoMo',
|
||||||
|
'o2' => 'O2',
|
||||||
|
|
||||||
|
// Fallback
|
||||||
|
'mobile' => 'Generic Mobile',
|
||||||
|
'wireless' => 'Generic Mobile',
|
||||||
|
'j2me' => 'Generic Mobile',
|
||||||
|
'midp' => 'Generic Mobile',
|
||||||
|
'cldc' => 'Generic Mobile',
|
||||||
|
'up.link' => 'Generic Mobile',
|
||||||
|
'up.browser' => 'Generic Mobile',
|
||||||
|
'smartphone' => 'Generic Mobile',
|
||||||
|
'cellphone' => 'Generic Mobile'
|
||||||
|
);
|
||||||
|
|
||||||
|
// There are hundreds of bots but these are the most common.
|
||||||
|
$robots = array(
|
||||||
|
'googlebot' => 'Googlebot',
|
||||||
|
'msnbot' => 'MSNBot',
|
||||||
|
'baiduspider' => 'Baiduspider',
|
||||||
|
'bingbot' => 'Bing',
|
||||||
|
'slurp' => 'Inktomi Slurp',
|
||||||
|
'yahoo' => 'Yahoo',
|
||||||
|
'ask jeeves' => 'Ask Jeeves',
|
||||||
|
'fastcrawler' => 'FastCrawler',
|
||||||
|
'infoseek' => 'InfoSeek Robot 1.0',
|
||||||
|
'lycos' => 'Lycos',
|
||||||
|
'yandex' => 'YandexBot',
|
||||||
|
'mediapartners-google' => 'MediaPartners Google',
|
||||||
|
'CRAZYWEBCRAWLER' => 'Crazy Webcrawler',
|
||||||
|
'adsbot-google' => 'AdsBot Google',
|
||||||
|
'feedfetcher-google' => 'Feedfetcher Google',
|
||||||
|
'curious george' => 'Curious George',
|
||||||
|
'ia_archiver' => 'Alexa Crawler',
|
||||||
|
'MJ12bot' => 'Majestic-12',
|
||||||
|
'Uptimebot' => 'Uptimebot'
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') or exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Auth extends CI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
date_default_timezone_set('Asia/Jakarta');
|
||||||
|
$this->load->helper('url');
|
||||||
|
$this->load->helper('vic_helper');
|
||||||
|
$this->load->helper('my_helper');
|
||||||
|
$this->load->helper('vic_convert_helper');
|
||||||
|
$this->load->model('m_vic');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$data = array(
|
||||||
|
'title' => "Login",
|
||||||
|
);
|
||||||
|
$this->load->view('dist/auth-login', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cek()
|
||||||
|
{
|
||||||
|
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[3]|max_length[70]');
|
||||||
|
$this->form_validation->set_rules('password', 'Username', 'trim|required|max_length[100]');
|
||||||
|
|
||||||
|
if ($this->form_validation->run() != true) {
|
||||||
|
$this->load->view('');
|
||||||
|
} else {
|
||||||
|
$uname = vic_slug_akun($this->input->post('username'));
|
||||||
|
$pass = md5($this->input->post('password'));
|
||||||
|
$where = array(
|
||||||
|
'admin_username' => $uname,
|
||||||
|
'admin_password' => $pass,
|
||||||
|
);
|
||||||
|
$data = $this->m_vic->edit_data($where, 'admin');
|
||||||
|
if ($data->num_rows() > 0) {
|
||||||
|
$mydata = $data->row();
|
||||||
|
$session = array(
|
||||||
|
'id' => $mydata->admin_id,
|
||||||
|
'username' => $mydata->admin_username,
|
||||||
|
'nama' => $mydata->admin_nama,
|
||||||
|
'login' => 'login',
|
||||||
|
);
|
||||||
|
$this->session->set_userdata($session);
|
||||||
|
if (!empty($result) && count($result) > 0) {
|
||||||
|
foreach ($result as $row) {
|
||||||
|
$authArray = array(
|
||||||
|
'username' => $row->username,
|
||||||
|
'password' => $row->password,
|
||||||
|
);
|
||||||
|
$this->session->set_userdata('ci_session_key_generate', true);
|
||||||
|
$this->session->set_userdata('ci_seesion_key', $authArray);
|
||||||
|
// remember me
|
||||||
|
if (!empty($this->input->post("remember"))) {
|
||||||
|
setcookie("loginId", $username, time() + (10 * 365 * 24 * 60 * 60));
|
||||||
|
setcookie("loginPass", $password, time() + (10 * 365 * 24 * 60 * 60));
|
||||||
|
} else {
|
||||||
|
setcookie("loginId", "");
|
||||||
|
setcookie("loginPass", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
redirect('Dist/');
|
||||||
|
} else {
|
||||||
|
$this->session->set_flashdata('error', 'Gagal Login, Data login yang anda masukkan kurang tepat!');
|
||||||
|
redirect('auth?notif=error');
|
||||||
|
// redirect(base_url().'auth/?alert=login-failed');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,363 @@
|
||||||
|
<?php if (!defined('BASEPATH')) {
|
||||||
|
exit('No direct script access allowed');
|
||||||
|
}
|
||||||
|
|
||||||
|
class Cluster extends CI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
header('Cache-Control: no-cache, must-revalidate, max-age=0');
|
||||||
|
header('Cache-Control: post-check=0, pre-check=0', false);
|
||||||
|
header('Pragma: no-cache');
|
||||||
|
|
||||||
|
$this->load->helper('url');
|
||||||
|
$this->load->helper('vic_helper');
|
||||||
|
$this->load->helper('my_helper');
|
||||||
|
$this->load->helper('vic_convert_helper');
|
||||||
|
$this->load->model('m_vic');
|
||||||
|
$this->load->model('clustermodel');
|
||||||
|
$this->load->model('model');
|
||||||
|
|
||||||
|
date_default_timezone_set('Asia/Jakarta');
|
||||||
|
$this->load->helper('url');
|
||||||
|
$this->load->helper('vic_helper');
|
||||||
|
$this->load->helper('my_helper');
|
||||||
|
$this->load->helper('vic_convert_helper');
|
||||||
|
$this->load->model('m_vic');
|
||||||
|
if ($this->session->userdata('login') != 'login') {
|
||||||
|
redirect('auth');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function iterasi_kmeans_hasil()
|
||||||
|
{
|
||||||
|
$tahun = $_GET['tahun'];
|
||||||
|
if ($tahun == 1) {
|
||||||
|
$t = '';
|
||||||
|
} else {
|
||||||
|
$t = "where predikat.tahun='$tahun'";
|
||||||
|
}
|
||||||
|
$data_hasil = $this->clustermodel->selectdata("predikat INNER JOIN alternatif on predikat.alternatif_id = alternatif.alternatif_id $t");
|
||||||
|
$ting = $this->clustermodel->selectdata("hasil where predikat='Sangat Rawan'");
|
||||||
|
$sed = $this->clustermodel->selectdata("hasil where predikat='Tidak Rawan'");
|
||||||
|
$ren = $this->clustermodel->selectdata("hasil where predikat='Rawan'");
|
||||||
|
|
||||||
|
$data = array(
|
||||||
|
'title' => 'iterasi Kmeans hasil',
|
||||||
|
'data_hasil' => $data_hasil,
|
||||||
|
'tin' => $ting,
|
||||||
|
'sed' => $sed,
|
||||||
|
'ren' => $ren,
|
||||||
|
'user' => $this->m_vic->get_data('admin'),
|
||||||
|
'predik' => $this->m_vic->get_data('predikat'),
|
||||||
|
'tes' => $this->m_vic->get_data('tes'),
|
||||||
|
);
|
||||||
|
|
||||||
|
$data['q'] = $this->db->query('select * from centroid_temp group by iterasi');
|
||||||
|
|
||||||
|
$this->load->view('cluster/iterasi_kmeans_hasil', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
|
||||||
|
$sesinya = $this->session->userdata('login');
|
||||||
|
|
||||||
|
$this->load->model('model');
|
||||||
|
$data = array(
|
||||||
|
'title' => '.:: Selamat Datang cluster ::. ',
|
||||||
|
'nama' => $sesinya['nama'],
|
||||||
|
'petunjuk' => $this->model->getPetunjuk(),
|
||||||
|
'wewenang' => $this->model->getWewenang(),
|
||||||
|
'titlesistem' => $this->model->getTitle(),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('cluster/header', $data);
|
||||||
|
$this->load->view('cluster/dashboard');
|
||||||
|
$this->load->view('cluster/footer');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pilih_cluster()
|
||||||
|
{
|
||||||
|
$d_tahun = $this->input->post('k_tahun');
|
||||||
|
$data_tahun = $this->m_vic->selecttahun('kriteria');
|
||||||
|
$data['mam'] = $this->m_vic->SelectMAMAM('kriteria');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['alternatif'] = $this->m_vic->selectbaru('alternatif');
|
||||||
|
$data['kriteria'] = $this->m_vic->selectkritalt('kriteria');
|
||||||
|
$data['alter'] = $this->m_vic->get_data('alternatif');
|
||||||
|
$data['krit'] = $this->m_vic->get_data('kriteria');
|
||||||
|
$data['title'] = "Cluster";
|
||||||
|
$data['tahun'] = $d_tahun;
|
||||||
|
$data['data_tahun'] = $data_tahun;
|
||||||
|
|
||||||
|
$this->load->view('cluster/pilih_cluster', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
public function normalisasi()
|
||||||
|
{
|
||||||
|
|
||||||
|
$data_tahun = $this->m_vic->selecttahun('kriteria');
|
||||||
|
$data['mam'] = $this->m_vic->SelectMAMAM('kriteria');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['alternatif'] = $this->m_vic->selectbaru('alternatif');
|
||||||
|
$data['alter'] = $this->m_vic->get_data('alternatif');
|
||||||
|
$data['krit'] = $this->m_vic->get_data('kriteria');
|
||||||
|
$data['title'] = "Cluster";
|
||||||
|
$data['data_tahun'] = $data_tahun;
|
||||||
|
|
||||||
|
$this->load->view('cluster/normalisasi', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function awal()
|
||||||
|
{
|
||||||
|
|
||||||
|
$data_tahun = $this->m_vic->selecttahun('kriteria');
|
||||||
|
$data['mam'] = $this->m_vic->SelectMAMAM('kriteria');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['alternatif'] = $this->m_vic->selectbaru('alternatif');
|
||||||
|
$data['kriteria'] = $this->m_vic->selectkritalt('kriteria');
|
||||||
|
$data['alter'] = $this->m_vic->get_data('alternatif');
|
||||||
|
$data['krit'] = $this->m_vic->get_data('kriteria');
|
||||||
|
$data['title'] = "Cluster";
|
||||||
|
$data['data_tahun'] = $data_tahun;
|
||||||
|
|
||||||
|
$this->load->view('cluster/awal', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
public function cluster()
|
||||||
|
{
|
||||||
|
$tes = $this->input->post('coba');
|
||||||
|
if ($tes == 1) {
|
||||||
|
$data['n_tahun'] = $this->input->post('n_tahun');
|
||||||
|
$data['coba'] = $this->input->post('coba');
|
||||||
|
$data['n_c1'] = $this->input->post('n_c1');
|
||||||
|
$data['n_c2'] = $this->input->post('n_c2');
|
||||||
|
$data['n_c3'] = $this->input->post('n_c3');
|
||||||
|
} elseif ($tes == 2) {
|
||||||
|
$data['n_tahun'] = $this->input->post('n_tahun');
|
||||||
|
$data['coba'] = $this->input->post('coba');
|
||||||
|
$data['x1'] = $this->input->post('x1');
|
||||||
|
$data['y1'] = $this->input->post('y1');
|
||||||
|
$data['z1'] = $this->input->post('z1');
|
||||||
|
|
||||||
|
$data['x2'] = $this->input->post('x2');
|
||||||
|
$data['y2'] = $this->input->post('y2');
|
||||||
|
$data['z2'] = $this->input->post('z2');
|
||||||
|
|
||||||
|
$data['x3'] = $this->input->post('x3');
|
||||||
|
$data['y3'] = $this->input->post('y3');
|
||||||
|
$data['z3'] = $this->input->post('z3');
|
||||||
|
}
|
||||||
|
|
||||||
|
$data_tahun = $this->m_vic->selecttahun('kriteria');
|
||||||
|
$data['mam'] = $this->m_vic->SelectMAMAM('kriteria');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['alternatif'] = $this->m_vic->selectbaru('alternatif');
|
||||||
|
$data['kriteria'] = $this->m_vic->selectkritalt('kriteria');
|
||||||
|
$data['alter'] = $this->m_vic->get_data('alternatif');
|
||||||
|
$data['krit'] = $this->m_vic->get_data('kriteria');
|
||||||
|
$data['title'] = "Cluster";
|
||||||
|
$data['data_tahun'] = $data_tahun;
|
||||||
|
|
||||||
|
$this->load->view('cluster/cluster', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
public function detail()
|
||||||
|
{
|
||||||
|
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['title'] = "Detail";
|
||||||
|
|
||||||
|
$this->load->view('cluster/detail', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
//proses Normalisasi
|
||||||
|
public function normali()
|
||||||
|
{
|
||||||
|
$d_tahun = $this->input->post('n_tahun');
|
||||||
|
$hapus = "DELETE from normalisasi where tahun=$d_tahun";
|
||||||
|
$this->db->query($hapus);
|
||||||
|
$data_tahun = $this->m_vic->selecttahun('kriteria');
|
||||||
|
$mam = $this->db->query('SELECT alternatif_id,c1c,c2c,c3c,tahun,MAX(c1c),MAX(c2c),MAX(c3c),AVG(c1c),AVG(c2c),AVG(c3c),MIN(c1c),MIN(c2c),MIN(c3c) from kriteria where tahun=' . $d_tahun);
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$table_kriteria = "SELECT * FROM kriteria where tahun=$d_tahun";
|
||||||
|
$krit = $this->db->query($table_kriteria);
|
||||||
|
|
||||||
|
$data['title'] = "Cluster";
|
||||||
|
$data['data_tahun'] = $data_tahun;
|
||||||
|
|
||||||
|
foreach ($mam->result_array() as $mx) {
|
||||||
|
$al_id = $mx['alternatif_id'];
|
||||||
|
$bobot = $mx['c2c'];
|
||||||
|
$max = $mx['MAX(c2c)'];
|
||||||
|
$min = $mx['MIN(c2c)'];
|
||||||
|
|
||||||
|
$nor1 = ($mx['c1c'] - $mx['MIN(c1c)']) / ($mx['MAX(c1c)'] - $mx['MIN(c1c)']);
|
||||||
|
$nor2 = ($mx['c2c'] - $mx['MIN(c2c)']) / ($mx['MAX(c2c)'] - $mx['MIN(c2c)']);
|
||||||
|
$nor3 = ($mx['c3c'] - $mx['MIN(c3c)']) / ($mx['MAX(c3c)'] - $mx['MIN(c3c)']);
|
||||||
|
}
|
||||||
|
foreach ($krit->result_array() as $kr_1) {
|
||||||
|
$al_tahun = $kr_1['tahun'];
|
||||||
|
$bobot2 = $kr_1['c2c'];
|
||||||
|
$al_id = $kr_1['alternatif_id'];
|
||||||
|
$nor1 = ($kr_1['c1c'] - $mx['MIN(c1c)']) / ($mx['MAX(c1c)'] - $mx['MIN(c1c)']);
|
||||||
|
$nor1hasil = round($nor1, 6);
|
||||||
|
$nor2 = ($kr_1['c2c'] - $mx['MIN(c2c)']) / ($mx['MAX(c2c)'] - $mx['MIN(c2c)']);
|
||||||
|
$nor2hasil = round($nor2, 6);
|
||||||
|
$nor3 = ($kr_1['c3c'] - $mx['MIN(c3c)']) / ($mx['MAX(c3c)'] - $mx['MIN(c3c)']);
|
||||||
|
$nor3hasil = round($nor3, 6);
|
||||||
|
$q = "insert into normalisasi(alternatif_id,c1c,c2c,c3c,tahun) values('" . $al_id . "','" . $nor1hasil . "','" . $nor2hasil . "','" . $nor3hasil . "','" . $al_tahun . "')";
|
||||||
|
$this->db->query($q);
|
||||||
|
}
|
||||||
|
$data['alternatif'] = $this->m_vic->selectbaru('alternatif');
|
||||||
|
$this->load->view('cluster/normalisasi', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function iterasi_kmeans()
|
||||||
|
{
|
||||||
|
$dat = $this->input->post('k_tahun');
|
||||||
|
//pilihan centroid awal
|
||||||
|
$x1 = $this->input->post('x1');
|
||||||
|
$y1 = $this->input->post('y1');
|
||||||
|
$z1 = $this->input->post('z1');
|
||||||
|
|
||||||
|
$x2 = $this->input->post('x2');
|
||||||
|
$y2 = $this->input->post('y2');
|
||||||
|
$z2 = $this->input->post('z2');
|
||||||
|
|
||||||
|
$x3 = $this->input->post('x3');
|
||||||
|
$y3 = $this->input->post('y3');
|
||||||
|
$z3 = $this->input->post('z3');
|
||||||
|
|
||||||
|
if ($dat == 1) {
|
||||||
|
$tahun = '';
|
||||||
|
} else {
|
||||||
|
$tahun = "where tahun='$dat'";
|
||||||
|
}
|
||||||
|
$data['alternatif'] = $this->m_vic->selectya("$tahun");
|
||||||
|
$data['kriteria'] = $this->m_vic->selectkrtitahun("$tahun");
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$data['mam'] = $this->m_vic->SelectMAM('kriteria where tahun=' . $dat);
|
||||||
|
$data['tahun'] = $dat;
|
||||||
|
$data['title'] = 'iterasi Kmeans';
|
||||||
|
|
||||||
|
$data['x1'] = $x1;
|
||||||
|
$data['x2'] = $x2;
|
||||||
|
$data['x3'] = $x3;
|
||||||
|
|
||||||
|
$data['y1'] = $y1;
|
||||||
|
$data['y2'] = $y2;
|
||||||
|
$data['y3'] = $y3;
|
||||||
|
|
||||||
|
$data['z1'] = $z1;
|
||||||
|
$data['z2'] = $z2;
|
||||||
|
$data['z3'] = $z3;
|
||||||
|
|
||||||
|
$this->load->view('cluster/iterasi_kmeans', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function iterasi_kmeans_lanjut()
|
||||||
|
{
|
||||||
|
$t = $_GET['tahun'];
|
||||||
|
if ($t == 1) {
|
||||||
|
$tahun = '';
|
||||||
|
} else {
|
||||||
|
$tahun = "where tahun='$t'";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($t == 1) {
|
||||||
|
$ta = '1';
|
||||||
|
} else {
|
||||||
|
$ta = $t;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data['alternatif'] = $this->m_vic->selectya("$tahun");
|
||||||
|
$data['kriteria'] = $this->m_vic->selectkrtitahun("$tahun");
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['tes'] = $this->m_vic->get_data('tes');
|
||||||
|
$hasil_cen = $this->m_vic->get_data('hasil_centroid');
|
||||||
|
$data['predikat'] = $this->m_vic->get_data('predikat');
|
||||||
|
$data['title'] = 'iterasi kmeans lanjut';
|
||||||
|
|
||||||
|
$id = "";
|
||||||
|
$id = $this->db->query('select max(nomor) as m from hasil_centroid');
|
||||||
|
foreach ($id->result() as $i) {
|
||||||
|
$id = $i->m;
|
||||||
|
}
|
||||||
|
$this->db->where('nomor', $id);
|
||||||
|
$data['centroid'] = $this->db->get('hasil_centroid');
|
||||||
|
$data['id'] = $id + 1;
|
||||||
|
|
||||||
|
$it = "";
|
||||||
|
$it = $this->db->query('select max(iterasi) as it from centroid_temp');
|
||||||
|
foreach ($it->result() as $i) {
|
||||||
|
$it = $i->it;
|
||||||
|
}
|
||||||
|
$data['no_k'] = $it;
|
||||||
|
$it_temp = $it - 1;
|
||||||
|
$this->db->where('iterasi', $it_temp);
|
||||||
|
$it_sebelum = $this->db->get('centroid_temp');
|
||||||
|
$c1_sebelum = array();
|
||||||
|
$c2_sebelum = array();
|
||||||
|
$c2_sebelum = array();
|
||||||
|
$no = 0;
|
||||||
|
foreach ($it_sebelum->result() as $it_prev) {
|
||||||
|
$c1_sebelum[$no] = $it_prev->c1;
|
||||||
|
$c2_sebelum[$no] = $it_prev->c2;
|
||||||
|
$c3_sebelum[$no] = $it_prev->c3;
|
||||||
|
$no++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->where('iterasi', $it);
|
||||||
|
$it_sesesudah = $this->db->get('centroid_temp');
|
||||||
|
$c1_sesesudah = array();
|
||||||
|
$c2_sesesudah = array();
|
||||||
|
$c2_sesesudah = array();
|
||||||
|
$no = 0;
|
||||||
|
foreach ($it_sesesudah->result() as $it_next) {
|
||||||
|
$c1_sesesudah[$no] = $it_next->c1;
|
||||||
|
$c2_sesesudah[$no] = $it_next->c2;
|
||||||
|
$c3_sesesudah[$no] = $it_next->c3;
|
||||||
|
$no++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($c1_sebelum == $c1_sesesudah && $c2_sebelum && $c2_sesesudah && $c2_sebelum == $c2_sesesudah) {
|
||||||
|
?>
|
||||||
|
<script>
|
||||||
|
alert("Proses iterasi berakhir pada tahap ke-<?php echo $it; ?>");
|
||||||
|
</script>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
echo "<meta http-equiv='refresh' content='0; url=" . base_url() . "cluster/iterasi_kmeans_hasil?tahun=$ta'>";
|
||||||
|
} else {
|
||||||
|
$delete = "delete from predikat where tahun='$ta'";
|
||||||
|
$this->db->query($delete);
|
||||||
|
$this->load->view('cluster/iterasi_kmeans_lanjut', $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function logout()
|
||||||
|
{
|
||||||
|
$this->session->sess_destroy();
|
||||||
|
redirect('');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,76 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') or exit('No direct script access allowed');
|
||||||
|
class Import extends CI_Controller
|
||||||
|
{
|
||||||
|
// construct
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
// load model
|
||||||
|
$this->load->model('Import_model', 'import');
|
||||||
|
$this->load->model('m_vic');
|
||||||
|
$this->load->helper(array('url', 'html', 'form'));
|
||||||
|
}
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$this->load->view('cluster/cluster');
|
||||||
|
}
|
||||||
|
public function importFile()
|
||||||
|
{
|
||||||
|
if ($this->input->post('submit')) {
|
||||||
|
$path = 'uploads/';
|
||||||
|
require_once APPPATH . "/third_party/PHPExcel.php";
|
||||||
|
$config['upload_path'] = $path;
|
||||||
|
$config['allowed_types'] = 'xlsx|xls|csv';
|
||||||
|
$config['remove_spaces'] = true;
|
||||||
|
$this->load->library('upload', $config);
|
||||||
|
$this->upload->initialize($config);
|
||||||
|
if (!$this->upload->do_upload('uploadFile')) {
|
||||||
|
$error = array('error' => $this->upload->display_errors());
|
||||||
|
} else {
|
||||||
|
$data = array('upload_data' => $this->upload->data());
|
||||||
|
}
|
||||||
|
if (empty($error)) {
|
||||||
|
if (!empty($data['upload_data']['file_name'])) {
|
||||||
|
$import_xls_file = $data['upload_data']['file_name'];
|
||||||
|
} else {
|
||||||
|
$import_xls_file = 0;
|
||||||
|
}
|
||||||
|
$inputFileName = $path . $import_xls_file;
|
||||||
|
try {
|
||||||
|
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
|
||||||
|
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
|
||||||
|
$objPHPExcel = $objReader->load($inputFileName);
|
||||||
|
$allDataInSheet = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
|
||||||
|
$flag = true;
|
||||||
|
$i = 0;
|
||||||
|
foreach ($allDataInSheet as $value) {
|
||||||
|
if ($flag) {
|
||||||
|
$flag = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$inserdata[$i]['alternatif_id'] = $value['A'];
|
||||||
|
$inserdata[$i]['c1c'] = $value['B'];
|
||||||
|
$inserdata[$i]['c2c'] = $value['C'];
|
||||||
|
$inserdata[$i]['c3c'] = $value['D'];
|
||||||
|
$inserdata[$i]['tahun'] = $value['E'];
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
$result = $this->import->insert($inserdata);
|
||||||
|
if ($result) {
|
||||||
|
echo "Imported successfully";
|
||||||
|
} else {
|
||||||
|
echo "ERROR !";
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME)
|
||||||
|
. '": ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo $error['error'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$this->load->view('cluster/cluster', $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') or exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Welcome extends CI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
date_default_timezone_set('Asia/Jakarta');
|
||||||
|
$this->load->helper('url');
|
||||||
|
$this->load->helper('vic_helper');
|
||||||
|
$this->load->helper('my_helper');
|
||||||
|
$this->load->helper('vic_convert_helper');
|
||||||
|
$this->load->model('m_vic');
|
||||||
|
$this->load->library(array('excel', 'session'));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
|
||||||
|
$data['title'] = "Beranda";
|
||||||
|
$this->load->view('welcome/home.php', $data);
|
||||||
|
}
|
||||||
|
public function tentang()
|
||||||
|
{
|
||||||
|
|
||||||
|
$data['title'] = "Tentang";
|
||||||
|
$this->load->view('welcome/tentang.php', $data);
|
||||||
|
}
|
||||||
|
public function Peta()
|
||||||
|
{
|
||||||
|
$tahunt2 = "SELECT DISTINCT(tahun) as th from predikat";
|
||||||
|
$ta22 = $this->db->query($tahunt2);
|
||||||
|
foreach ($ta22->result_array() as $tess2) {
|
||||||
|
$tahunnya2 = $tess2['th'];
|
||||||
|
}
|
||||||
|
$_thh = $_GET['tahun'];
|
||||||
|
if ($_thh == '') {
|
||||||
|
$t = $tahunnya2;
|
||||||
|
} else {
|
||||||
|
$t = $_thh;
|
||||||
|
}
|
||||||
|
if ($t == 1) {
|
||||||
|
$tahun = '';
|
||||||
|
} else {
|
||||||
|
$tahun = "AND predikat.tahun='$t'";
|
||||||
|
}
|
||||||
|
$data['kriteria'] = $this->m_vic->get_data('kriteria');
|
||||||
|
$data['alternatif'] = $this->m_vic->selectal($tahun);
|
||||||
|
$data = array(
|
||||||
|
'tinggi' => $this->m_vic->selecttinggi($tahun),
|
||||||
|
'sedang' => $this->m_vic->selectsedang($tahun),
|
||||||
|
'rendah' => $this->m_vic->selectrendah($tahun),
|
||||||
|
'tes' => $this->m_vic->get_data('tes'),
|
||||||
|
);
|
||||||
|
$data['user'] = $this->m_vic->get_data('admin');
|
||||||
|
$data['hit'] = $this->m_vic->selectcount('alternatif');
|
||||||
|
$data['title'] = "Peta";
|
||||||
|
$this->load->view('welcome/peta.php', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,196 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') or exit('No direct script access allowed');
|
||||||
|
|
||||||
|
function is_login($error_for, $error_message, $link_redirect)
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
if ($error_for && $error_message && $link_redirect) {
|
||||||
|
if ($ci->session->has_userdata('admin_id')) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$ci->session->set_flashdata($error_for, $error_message);
|
||||||
|
redirect($link_redirect);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($ci->session->has_userdata('admin_id')) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
redirect('home');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_admin($error_for, $error_message, $link_redirect)
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
if ($error_for && $error_message && $link_redirect) {
|
||||||
|
if ($ci->session->has_userdata('admin_id') and $ci->session->userdata('role') == 1) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$ci->session->set_flashdata($error_for, $error_message);
|
||||||
|
redirect($link_redirect);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($ci->session->has_userdata('admin_id') and $ci->session->userdata('role') == 1) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
redirect('home');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fungsi acak string
|
||||||
|
function _randString($length)
|
||||||
|
{
|
||||||
|
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^";
|
||||||
|
$str = '';
|
||||||
|
$size = strlen($chars);
|
||||||
|
for ($i = 0; $i < $length; $i++) {
|
||||||
|
$str .= $chars[rand(3, $size - 5)];
|
||||||
|
}
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _notif($message)
|
||||||
|
{
|
||||||
|
$notif = $_GET['notif'];
|
||||||
|
$notif_cut = substr($notif, 0, 5);
|
||||||
|
if ($message) {
|
||||||
|
if ($notif_cut == 'suces') { ?>
|
||||||
|
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
||||||
|
<?php echo $message; ?>
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div><br>
|
||||||
|
<?php } elseif ($notif_cut == 'error') { ?>
|
||||||
|
<div class="alert alert-danger alert-dismissible fade show" role="alert">
|
||||||
|
<?php echo $message; ?>
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div><br>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _createSlug($string)
|
||||||
|
{
|
||||||
|
$a = trim($string);
|
||||||
|
$slug = preg_replace('/[^A-Za-z0-9.-]+/', '-', $a);
|
||||||
|
//$kalimat = strtolower(url_title($slug));
|
||||||
|
$kalimat = strtolower($slug);
|
||||||
|
//return strtolower(url_title($string));
|
||||||
|
return ($kalimat);
|
||||||
|
}
|
||||||
|
|
||||||
|
function vic_slug_akun($string)
|
||||||
|
{
|
||||||
|
return preg_replace('/[^a-zA-Z0-9.\-]/', '_', $string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*tanggal dan waktu indonesia
|
||||||
|
contoh :
|
||||||
|
echo tglWaktuIndo(date('d-m-Y H:i:s',time()));
|
||||||
|
*/
|
||||||
|
function _tglWaktuIndo($tanggal)
|
||||||
|
{
|
||||||
|
$bulan = array(
|
||||||
|
1 => 'Januari',
|
||||||
|
2 => 'Februari',
|
||||||
|
3 => 'Maret',
|
||||||
|
4 => 'April',
|
||||||
|
5 => 'Mei',
|
||||||
|
6 => 'Juni',
|
||||||
|
7 => 'Juli',
|
||||||
|
8 => 'Agustus',
|
||||||
|
9 => 'September',
|
||||||
|
10 => 'Oktober',
|
||||||
|
11 => 'November',
|
||||||
|
12 => 'Desember'
|
||||||
|
);
|
||||||
|
$tgl_bln_thn = explode('-', $tanggal);
|
||||||
|
$jam_min_dtk = explode(':', $tanggal);
|
||||||
|
|
||||||
|
return substr($tgl_bln_thn[2], 0, 4) . ' ' . $bulan[(int) $tgl_bln_thn[1]] . ' ' . $tgl_bln_thn[0] . ' / ' . substr($jam_min_dtk[0], 11, 13) . ':' . $jam_min_dtk[1] . ':' . $jam_min_dtk[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
function _tglIndo($tanggal)
|
||||||
|
{
|
||||||
|
if (!empty($tanggal)) {
|
||||||
|
$bulan = array(
|
||||||
|
1 => 'Januari',
|
||||||
|
2 => 'Februari',
|
||||||
|
3 => 'Maret',
|
||||||
|
4 => 'April',
|
||||||
|
5 => 'Mei',
|
||||||
|
6 => 'Juni',
|
||||||
|
7 => 'Juli',
|
||||||
|
8 => 'Agustus',
|
||||||
|
9 => 'September',
|
||||||
|
10 => 'Oktober',
|
||||||
|
11 => 'November',
|
||||||
|
12 => 'Desember'
|
||||||
|
);
|
||||||
|
$tgl_bln_thn = explode('-', $tanggal);
|
||||||
|
|
||||||
|
return substr($tgl_bln_thn[2], 0, 4) . ' ' . $bulan[(int) $tgl_bln_thn[1]] . ' ' . $tgl_bln_thn[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//echo hariIndo(date('D'));
|
||||||
|
function _hariIndo($date)
|
||||||
|
{
|
||||||
|
$tanggal = $date;
|
||||||
|
$day = date('D', strtotime($tanggal));
|
||||||
|
$dayList = array(
|
||||||
|
'Sun' => 'Minggu',
|
||||||
|
'Mon' => 'Senin',
|
||||||
|
'Tue' => 'Selasa',
|
||||||
|
'Wed' => 'Rabu',
|
||||||
|
'Thu' => 'Kamis',
|
||||||
|
'Fri' => 'Jumat',
|
||||||
|
'Sat' => 'Sabtu'
|
||||||
|
);
|
||||||
|
//echo "Tanggal {$tanggal} adalah hari : " . $dayList[$day];
|
||||||
|
$result = $dayList[$day];
|
||||||
|
return ($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _rupiah($nilai)
|
||||||
|
{
|
||||||
|
return 'Rp. ' . number_format($nilai, 0, ",", ".");
|
||||||
|
}
|
||||||
|
|
||||||
|
function _cekAccess($role_id, $menu_id)
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
$where = array('accessRole_roleId' => $role_id, 'accessRole_menu' => $menu_id);
|
||||||
|
$accessrole = $ci->general_m->get_where('accessrole', $where);
|
||||||
|
if ($accessrole->num_rows() > 0) {
|
||||||
|
return 'checked';
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _cekAccessSubMenu($role_id, $menu_id, $submenu_id)
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
$where = array('accessRole_roleId' => $role_id, 'accessRole_menu' => $menu_id, 'accessRole_subMenu' => $submenu_id);
|
||||||
|
$accessrole = $ci->general_m->get_where('accessrole', $where);
|
||||||
|
if ($accessrole->num_rows() > 0) {
|
||||||
|
return 'checked';
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getCompany($field)
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
$result = $ci->db->get('company')->row_array();
|
||||||
|
return $result[$field];
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
<?php function Mod($a, $b) { return ($a % $b + $b) % $b; } function victext($input, $key, $encipher) { $keyLen = strlen($key); for ($i = 0; $i < $keyLen; ++$i) if (!ctype_alpha($key[$i])) return ""; $output = ""; $nonAlphaCharCount = 0; $inputLen = strlen($input); for ($i = 0; $i < $inputLen; ++$i) { if (ctype_alpha($input[$i])) { $cIsUpper = ctype_upper($input[$i]); $offset = ord($cIsUpper ? 'A' : 'a'); $keyIndex = ($i - $nonAlphaCharCount) % $keyLen; $k = ord($cIsUpper ? strtoupper($key[$keyIndex]) : strtolower($key[$keyIndex])) - $offset; $k = $encipher ? $k : -$k; $ch = chr((Mod(((ord($input[$i]) + $k) - $offset), 26)) + $offset); $output .= $ch; } else { $output .= $input[$i]; ++$nonAlphaCharCount; } } return $output; } function vicsatu($input) { return victext($input, base64_decode('bXVoZmlrcnk='), true); } function vicdua($input) { return vicsatu(vicsatu(vicsatu($input))); } function str_psw($input) { return vicdua(base64_encode(base64_encode(base64_encode($input)))); } function str_mod($input) { return md5(str_psw($input)); } ?>
|
||||||
|
|
@ -0,0 +1,218 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function show_alert(){
|
||||||
|
if(isset($_GET['alert'])){
|
||||||
|
$alert = $_GET['alert'];
|
||||||
|
if($alert == "add"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Data Berhasil Di Tambah. </div>";
|
||||||
|
}else if($alert == "delete"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Data Berhasil Di Hapus. </div>";
|
||||||
|
}else if($alert == "update"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Data Berhasil Di Update. </div>";
|
||||||
|
}else if($alert == "login-failed"){
|
||||||
|
echo "<div class='alert alert-danger alert-dah'>Login Gagal !</div>";
|
||||||
|
}else if($alert == "setting-update"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Pengaturan Berhasil Di Ubah.</div>";
|
||||||
|
}else if($alert == "page-saved"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Halaman Berhasil Di Simpan.</div>";
|
||||||
|
}else if($alert == "page-delete"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Halaman Berhasil Di Hapus.</div>";
|
||||||
|
}else if($alert == "post-saved"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Post Berhasil Di Simpan.</div>";
|
||||||
|
}else if($alert == "post-delete"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Post Berhasil Di Hapus Permanen.</div>";
|
||||||
|
}else if($alert == "post-trash"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Post Berhasil Di Pindahkan Ke Tong Sampah.</div>";
|
||||||
|
}else if($alert == "menu-saved"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Menu Berhasil Di Simpan.</div>";
|
||||||
|
}else if($alert == "menu-delete"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Menu Berhasil Di Hapus.</div>";
|
||||||
|
}else if($alert == "widget-delete"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Widget Berhasil Di Hapus.</div>";
|
||||||
|
}else if($alert == "user-add"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>User Berhasil Di Tambah.</div>";
|
||||||
|
}else if($alert == "user-update"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Data User Berhasil Di Update.</div>";
|
||||||
|
}else if($alert == "user-duplikat"){
|
||||||
|
echo "<div class='alert alert-danger alert-dah'>Data Sudah Ada.</div>";
|
||||||
|
}else if($alert == "user-daftar"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Pendaftaran Sukses. Silakan login dengan:<br> Username = No Identitas Anda <br> Password = No Identitas Anda</div>";
|
||||||
|
}else if($alert == "user-kirim"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Data Berhasil Di Kirim.<br> Pengajuan Anda Akan Segera Ditindaklanjuti. <br> Terima Kasih </div>";
|
||||||
|
}else if($alert == "upload-gagal"){
|
||||||
|
echo "<div class='alert alert-danger alert-dah'>Upload Data Gagal. </div>";
|
||||||
|
}else if($alert == "reset-pass"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Reset Password Berhasil. </div>";
|
||||||
|
}else if($alert == "ganti-pass"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Password Berhasil Diubah. </div>";
|
||||||
|
}else if($alert == "gagal-pass"){
|
||||||
|
echo "<div class='alert alert-danger alert-dah'>Password Gagal Diubah. </div>";
|
||||||
|
}else if($alert == "aktif-add"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Akun Berhasi Diaktifkan. </div>";
|
||||||
|
}else if($alert == "aktif-add2"){
|
||||||
|
echo "<div class='alert alert-success alert-dah'>Akun Berhasi Dinonaktifkan. </div>";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_slug($string){
|
||||||
|
// $a = trim($string);
|
||||||
|
// $slug = preg_replace('/[^A-Za-z0-9-]+/', '-', $a);
|
||||||
|
return strtolower(url_title($string));
|
||||||
|
}
|
||||||
|
|
||||||
|
function display_sub($parent,$mother){
|
||||||
|
$query = mysql_query("select * from vic_menu where menu_parent='$parent' and menu_mother='$mother'");
|
||||||
|
echo "<ul parent='".$parent."' id='".$mother."'>";
|
||||||
|
// echo "<li class='list-menu-kosong'></li>";
|
||||||
|
while($row=mysql_fetch_assoc($query)){
|
||||||
|
if(count($query) > 0){
|
||||||
|
echo "<li id='menu_".$row['menu_id']."' ini='".$row['menu_id']."'><div>".$row['menu_name']."<small> ".$row['menu_url']." </small> <a class='pull-right' href=".base_url().'admin/menu_item_delete/'.$row['menu_id']."> Delete </a><a class='pull-right' href=".base_url().'admin/menu_item_edit/'.$row['menu_id']."> Edit </a></div>";
|
||||||
|
display_sub($row['menu_id'],$row['menu_mother']);
|
||||||
|
echo "</li>";
|
||||||
|
}else{
|
||||||
|
echo "<li id='menu_".$row['menu_id']."' ini='".$row['menu_id']."'>".$row['menu_name']."<small> ".$row['menu_url']." </small> <a class='pull-right' href=".base_url().'admin/menu_item_delete/'.$row['menu_id']."> Delete</a> <a class='pull-right' href=".base_url().'admin/menu_item_edit/'.$row['menu_id']."> Edit </a></li>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "</ul>";
|
||||||
|
}
|
||||||
|
|
||||||
|
function display_sub_navigation($parent,$mother){
|
||||||
|
$query = mysql_query("select * from vic_menu where menu_parent='$parent' and menu_mother='$mother'");
|
||||||
|
$cek = mysql_num_rows($query);
|
||||||
|
if($cek > 0){
|
||||||
|
echo "<ul>";
|
||||||
|
while($row=mysql_fetch_assoc($query)){
|
||||||
|
|
||||||
|
if($row['menu_tab']=="1"){
|
||||||
|
$tab = "target='_blank'";
|
||||||
|
}else{
|
||||||
|
$tab = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(count($query) > 0){
|
||||||
|
echo '<li><a '.$tab.' href='.$row['menu_url'].'>'.$row['menu_name'].'</a>';
|
||||||
|
display_sub_navigation($row['menu_id'],$row['menu_mother']);
|
||||||
|
echo "</li>";
|
||||||
|
}else if(count($query) == 0){
|
||||||
|
echo '<li><a '.$tab.' href='.$row['menu_url'].'>'.$row['menu_name'].'</a></li>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "</ul>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function menu_navigation($menu_name){
|
||||||
|
echo '<div class="menu-responsif"><span class="glyphicon glyphicon-list"></span> MENU</div>';
|
||||||
|
echo '<div class='.$menu_name.'>';
|
||||||
|
echo '<ul classs=main-'.$menu_name.'>';
|
||||||
|
|
||||||
|
$CI=&get_instance();
|
||||||
|
$data = $CI->m_vic->get_menu_item($menu_name);
|
||||||
|
$item = $data->result();
|
||||||
|
$jumlah = $data->num_rows();
|
||||||
|
foreach($item as $i){
|
||||||
|
$query = mysql_query("select * from vic_menu where menu_parent='$i->menu_id' and menu_mother='$i->menu_mother'");
|
||||||
|
$q=mysql_num_rows($query);
|
||||||
|
if($i->menu_tab=="1"){
|
||||||
|
$tab = "target='_blank'";
|
||||||
|
}else{
|
||||||
|
$tab = "";
|
||||||
|
}
|
||||||
|
if($q > 0){
|
||||||
|
echo '<li><a '.$tab.' href='.$i->menu_url.'>'.$i->menu_name.' <span class="caret"></span> </a>';
|
||||||
|
display_sub_navigation($i->menu_id,$i->menu_mother);
|
||||||
|
echo "</li>";
|
||||||
|
}else if($q == 0){
|
||||||
|
echo '<li><a '.$tab.' href='.$i->menu_url.'>'.$i->menu_name.'</a></li>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '</ul>';
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// DAHCODE WIDGET
|
||||||
|
|
||||||
|
function post_content($text,$numb) {
|
||||||
|
if (strlen($text) > $numb) {
|
||||||
|
$text = str_replace(" ", "", $text);
|
||||||
|
$text = substr($text, 0, $numb);
|
||||||
|
$text = substr($text,0,strrpos($text," "));
|
||||||
|
$etc = " ...";
|
||||||
|
$text = $text.$etc;
|
||||||
|
}
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function get_option($option_name){
|
||||||
|
$CI=$CI=&get_instance();
|
||||||
|
return $CI->m_vic->get_option($option_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// function save_visitor_data(){
|
||||||
|
// $CI=&get_instance();
|
||||||
|
// if ($CI->agent->is_mobile()){
|
||||||
|
// $device = $CI->agent->mobile();
|
||||||
|
// }else{
|
||||||
|
// $device = 'Unidentified';
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // referrer
|
||||||
|
// if ($CI->agent->is_referral()){
|
||||||
|
// $referrer = $CI->agent->referrer();
|
||||||
|
// }else{
|
||||||
|
// $referrer = "";
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $data = array(
|
||||||
|
// 'time_visit' => date('Y-m-d H:i:s'),
|
||||||
|
// 'user_ip' => $_SERVER['REMOTE_ADDR'],
|
||||||
|
// 'user_browser' => $CI->agent->browser(),
|
||||||
|
// 'user_os' => $CI->agent->platform(),
|
||||||
|
// 'user_device' => $device,
|
||||||
|
// 'page' => base_url(),
|
||||||
|
// 'user_referrer' => $referrer
|
||||||
|
// );
|
||||||
|
|
||||||
|
// $CI->m_vic->insert_data($data,'vic_visitor');
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
function TanggalIndo($date){
|
||||||
|
$HariIndo = array("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu");
|
||||||
|
$BulanIndo = array("Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember");
|
||||||
|
|
||||||
|
$tahun = substr($date, 0, 4);
|
||||||
|
$bulan = substr($date, 5, 2);
|
||||||
|
$tgl = substr($date, 8, 2);
|
||||||
|
|
||||||
|
$result = $tgl . " " . $BulanIndo[(int)$bulan-1] . " ". $tahun;
|
||||||
|
//$result = $HariIndo[(int)$tgl-1] . ", ". $tgl . " " . $BulanIndo[(int)$bulan-1] . " ". $tahun; //pakai hari
|
||||||
|
return($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hariIndo($date){
|
||||||
|
$tanggal = $date;
|
||||||
|
$day = date('D', strtotime($tanggal));
|
||||||
|
$dayList = array(
|
||||||
|
'Sun' => 'Minggu',
|
||||||
|
'Mon' => 'Senin',
|
||||||
|
'Tue' => 'Selasa',
|
||||||
|
'Wed' => 'Rabu',
|
||||||
|
'Thu' => 'Kamis',
|
||||||
|
'Fri' => 'Jumat',
|
||||||
|
'Sat' => 'Sabtu'
|
||||||
|
);
|
||||||
|
//echo "Tanggal {$tanggal} adalah hari : " . $dayList[$day];
|
||||||
|
$result = $dayList[$day];
|
||||||
|
return($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
require_once('PHPExcel.php');
|
||||||
|
|
||||||
|
class Excel extends PHPExcel{
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
defined('BASEPATH') or exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Mylib
|
||||||
|
{
|
||||||
|
|
||||||
|
/*fungsi membuat menampilkan halaman tertentu*/
|
||||||
|
function view($view, $data = array())
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
if (!array_key_exists('title', $data)) {
|
||||||
|
$data['title'] = 'Pemetaan Daerah Rawan di Kecamatan Panyabungan Menggunakan Metode K-MEANS Clustering';
|
||||||
|
}
|
||||||
|
$ci->load->view('dist/_partials/header', $data);
|
||||||
|
$ci->load->view('dist/_partials/sidebar', $data);
|
||||||
|
if ($data) {
|
||||||
|
$ci->load->view($view, $data);
|
||||||
|
} else {
|
||||||
|
$ci->load->view($view);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*fungsi membuat menampilkan halaman tertentu*/
|
||||||
|
function fview($view, $data = array())
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
if (!array_key_exists('title', $data)) {
|
||||||
|
$data['title'] = 'PEMETAAN DAERAH RAWAN DI PANYABUNGAN MENGGUNAKAN METODE K-MEANS';
|
||||||
|
}
|
||||||
|
$ci->load->view('front/template/v_header', $data);
|
||||||
|
$ci->load->view('front/template/v_navbar', $data);
|
||||||
|
if ($data) {
|
||||||
|
$ci->load->view('front/' . $view, $data);
|
||||||
|
} else {
|
||||||
|
$ci->load->view('front/' . $view);
|
||||||
|
}
|
||||||
|
$ci->load->view('front/template/v_footer', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function autoCode($field_code, $initial, $tabel)
|
||||||
|
{
|
||||||
|
$ci = &get_instance();
|
||||||
|
$ci->db->order_by($field_code, 'DESC');
|
||||||
|
$res = $ci->db->get($tabel);
|
||||||
|
$data = $res->row_array();
|
||||||
|
if ($data) {
|
||||||
|
$value = $data[$field_code];
|
||||||
|
$result = substr($value, 4, 8);
|
||||||
|
$result = (int) $result;
|
||||||
|
$result = $result + 1;
|
||||||
|
$coderesult = $initial . "-" . STR_PAD($result, 8, "0", STR_PAD_LEFT);
|
||||||
|
} else {
|
||||||
|
$coderesult = $initial . "-" . "00000001";
|
||||||
|
}
|
||||||
|
return $coderesult;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
PHPExcel_Autoloader::register();
|
||||||
|
// As we always try to run the autoloader before anything else, we can use it to do a few
|
||||||
|
// simple checks and initialisations
|
||||||
|
//PHPExcel_Shared_ZipStreamWrapper::register();
|
||||||
|
// check mbstring.func_overload
|
||||||
|
if (ini_get('mbstring.func_overload') & 2) {
|
||||||
|
throw new PHPExcel_Exception('Multibyte function overloading in PHP must be disabled for string functions (2).');
|
||||||
|
}
|
||||||
|
PHPExcel_Shared_String::buildCharacterSets();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Autoloader
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Register the Autoloader with SPL
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function register()
|
||||||
|
{
|
||||||
|
if (function_exists('__autoload')) {
|
||||||
|
// Register any existing autoloader function with SPL, so we don't get any clashes
|
||||||
|
spl_autoload_register('__autoload');
|
||||||
|
}
|
||||||
|
// Register ourselves with SPL
|
||||||
|
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
|
||||||
|
return spl_autoload_register(array('PHPExcel_Autoloader', 'load'), true, true);
|
||||||
|
} else {
|
||||||
|
return spl_autoload_register(array('PHPExcel_Autoloader', 'load'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Autoload a class identified by name
|
||||||
|
*
|
||||||
|
* @param string $pClassName Name of the object to load
|
||||||
|
*/
|
||||||
|
public static function load($pClassName)
|
||||||
|
{
|
||||||
|
if ((class_exists($pClassName, false)) || (strpos($pClassName, 'PHPExcel') !== 0)) {
|
||||||
|
// Either already loaded, or not a PHPExcel class request
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pClassFilePath = PHPEXCEL_ROOT .
|
||||||
|
str_replace('_', DIRECTORY_SEPARATOR, $pClassName) .
|
||||||
|
'.php';
|
||||||
|
|
||||||
|
if ((file_exists($pClassFilePath) === false) || (is_readable($pClassFilePath) === false)) {
|
||||||
|
// Can't load
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
require($pClassFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,290 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_APC
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Prefix used to uniquely identify cache data for this worksheet
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $cachePrefix = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache timeout
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $cacheTime = 600;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_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 PHPExcel_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
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $pCoord Coordinate address of the cell to update
|
||||||
|
* @param PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $pCoord Coordinate address of the cell to check
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in APC cache');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cell at a specific coordinate
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $pCoord Coordinate of the cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_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
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $pCoord Coordinate address of the cell to delete
|
||||||
|
* @throws PHPExcel_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
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_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 PHPExcel_Exception('Cell entry ' . $cellID . ' no longer exists in APC');
|
||||||
|
}
|
||||||
|
if (!apc_store($newCachePrefix . $cellID . '.cache', $obj, $this->cacheTime)) {
|
||||||
|
$this->__destruct();
|
||||||
|
throw new PHPExcel_Exception('Failed to store cell ' . $cellID . ' in APC');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cachePrefix = $newCachePrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the cell collection and disconnect from our parent
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if ($this->currentObject !== null) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush the APC cache
|
||||||
|
$this->__destruct();
|
||||||
|
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// detach ourself from the worksheet, so that it can then delete this object successfully
|
||||||
|
$this->parent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise this new cell collection
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
* @param array of mixed $arguments Additional initialisation arguments
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
if (!function_exists('apc_store')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (apc_sma_info() === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,368 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_CacheBase
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
abstract class PHPExcel_CachedObjectStorage_CacheBase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Parent worksheet
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Worksheet
|
||||||
|
*/
|
||||||
|
protected $parent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The currently active Cell
|
||||||
|
*
|
||||||
|
* @var PHPExcel_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 boolean
|
||||||
|
*/
|
||||||
|
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 = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise this new cell collection
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_Worksheet $parent)
|
||||||
|
{
|
||||||
|
// Set our parent worksheet.
|
||||||
|
// This is maintained within the cache controller to facilitate re-attaching it to PHPExcel_Cell objects when
|
||||||
|
// they are woken from a serialized state
|
||||||
|
$this->parent = $parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the parent worksheet for this cell collection
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Worksheet
|
||||||
|
*/
|
||||||
|
public function getParent()
|
||||||
|
{
|
||||||
|
return $this->parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function updateCacheData(PHPExcel_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 PHPExcel_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 = array();
|
||||||
|
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 = array('A' => '1A');
|
||||||
|
$row = array(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 array(
|
||||||
|
'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 integer
|
||||||
|
*/
|
||||||
|
public function getCurrentRow()
|
||||||
|
{
|
||||||
|
sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row);
|
||||||
|
return (integer) $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 = array(1);
|
||||||
|
foreach ($this->getCellList() as $coord) {
|
||||||
|
sscanf($coord, '%[A-Z]%d', $c, $r);
|
||||||
|
if ($r != $row) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$columnList[] = PHPExcel_Cell::columnIndexFromString($c);
|
||||||
|
}
|
||||||
|
return PHPExcel_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 = array(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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_Worksheet $parent)
|
||||||
|
{
|
||||||
|
$this->currentCellIsDirty;
|
||||||
|
$this->storeData();
|
||||||
|
|
||||||
|
$this->parent = $parent;
|
||||||
|
if (($this->currentObject !== null) && (is_object($this->currentObject))) {
|
||||||
|
$this->currentObject->attach($this);
|
||||||
|
}
|
||||||
|
} // function copyCellCollection()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a row, deleting all cells in that row
|
||||||
|
*
|
||||||
|
* @param string $row Row number to remove
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,208 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_DiscISAM
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
protected function storeData()
|
||||||
|
{
|
||||||
|
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
|
||||||
|
fseek($this->fileHandle, 0, SEEK_END);
|
||||||
|
|
||||||
|
$this->cellCache[$this->currentObjectID] = array(
|
||||||
|
'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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_Worksheet $parent)
|
||||||
|
{
|
||||||
|
parent::copyCellCollection($parent);
|
||||||
|
// Get a new id for the new file name
|
||||||
|
$baseUnique = $this->getUniqueID();
|
||||||
|
$newFileName = $this->cacheDirectory.'/PHPExcel.'.$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 = array();
|
||||||
|
|
||||||
|
// 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 PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
* @param array of mixed $arguments Additional initialisation arguments
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_Worksheet $parent, $arguments)
|
||||||
|
{
|
||||||
|
$this->cacheDirectory = ((isset($arguments['dir'])) && ($arguments['dir'] !== null))
|
||||||
|
? $arguments['dir']
|
||||||
|
: PHPExcel_Shared_File::sys_get_temp_dir();
|
||||||
|
|
||||||
|
parent::__construct($parent);
|
||||||
|
if (is_null($this->fileHandle)) {
|
||||||
|
$baseUnique = $this->getUniqueID();
|
||||||
|
$this->fileName = $this->cacheDirectory.'/PHPExcel.'.$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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,103 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_ICache
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
interface PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Add or Update a cell in cache identified by coordinate address
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to update
|
||||||
|
* @param PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_Cell $cell);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add or Update a cell in cache
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function updateCacheData(PHPExcel_Cell $cell);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a cell from cache identified by coordinate address
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to retrieve
|
||||||
|
* @return PHPExcel_Cell Cell that was found, or null if not found
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function getCacheData($pCoord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a cell in cache identified by coordinate address
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to delete
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function deleteCacheData($pCoord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,149 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_Igbinary
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_Igbinary extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_Cell $cell)
|
||||||
|
{
|
||||||
|
if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
|
||||||
|
$this->storeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->currentObjectID = $pCoord;
|
||||||
|
$this->currentObject = $cell;
|
||||||
|
$this->currentCellIsDirty = true;
|
||||||
|
|
||||||
|
return $cell;
|
||||||
|
} // function addCacheData()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cell at a specific coordinate
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate of the cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if (!is_null($this->currentObject)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// 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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
if (!function_exists('igbinary_serialize')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,308 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_Memcache
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Prefix used to uniquely identify cache data for this worksheet
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $cachePrefix = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache timeout
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_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 PHPExcel_Exception("Failed to store cell {$this->currentObjectID} in MemCache");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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;
|
||||||
|
} // function addCacheData()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to check
|
||||||
|
* @return boolean
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_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 PHPExcel_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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_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 PHPExcel_Exception("Cell entry {$cellID} no longer exists in MemCache");
|
||||||
|
}
|
||||||
|
if (!$this->memcache->add($newCachePrefix . $cellID . '.cache', $obj, null, $this->cacheTime)) {
|
||||||
|
$this->__destruct();
|
||||||
|
throw new PHPExcel_Exception("Failed to store cell {$cellID} in MemCache");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cachePrefix = $newCachePrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the cell collection and disconnect from our parent
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if (!is_null($this->currentObject)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush the Memcache cache
|
||||||
|
$this->__destruct();
|
||||||
|
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// detach ourself from the worksheet, so that it can then delete this object successfully
|
||||||
|
$this->parent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise this new cell collection
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
* @param array of mixed $arguments Additional initialisation arguments
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_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, array($this, 'failureCallback'))) {
|
||||||
|
throw new PHPExcel_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 integer $port Memcache port
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function failureCallback($host, $port)
|
||||||
|
{
|
||||||
|
throw new PHPExcel_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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
if (!function_exists('memcache_add')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_Memory
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_Memory extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Dummy method callable from CacheBase, but unused by Memory cache
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_Worksheet $parent)
|
||||||
|
{
|
||||||
|
parent::copyCellCollection($parent);
|
||||||
|
|
||||||
|
$newCollection = array();
|
||||||
|
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 = array();
|
||||||
|
|
||||||
|
// detach ourself from the worksheet, so that it can then delete this object successfully
|
||||||
|
$this->parent = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_MemoryGZip
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_MemoryGZip extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
protected function storeData()
|
||||||
|
{
|
||||||
|
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
|
||||||
|
$this->cellCache[$this->currentObjectID] = gzdeflate(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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if (!is_null($this->currentObject)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// detach ourself from the worksheet, so that it can then delete this object successfully
|
||||||
|
$this->parent = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_MemorySerialized
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_MemorySerialized extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if (!is_null($this->currentObject)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// detach ourself from the worksheet, so that it can then delete this object successfully
|
||||||
|
$this->parent = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,200 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_PHPTemp
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Name of the file for this cache
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $fileHandle = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Memory limit to use before reverting to file cache
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $memoryCacheSize = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
protected function storeData()
|
||||||
|
{
|
||||||
|
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
|
||||||
|
fseek($this->fileHandle, 0, SEEK_END);
|
||||||
|
|
||||||
|
$this->cellCache[$this->currentObjectID] = array(
|
||||||
|
'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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if (!is_null($this->currentObject)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// 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 PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
* @param array of mixed $arguments Additional initialisation arguments
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_Worksheet $parent, $arguments)
|
||||||
|
{
|
||||||
|
$this->memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB';
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,307 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_SQLite
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_SQLite extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Database table name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $TableName = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Database handle
|
||||||
|
*
|
||||||
|
* @var resource
|
||||||
|
*/
|
||||||
|
private $DBHandle = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
protected function storeData()
|
||||||
|
{
|
||||||
|
if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
|
||||||
|
if (!$this->DBHandle->queryExec("INSERT OR REPLACE INTO kvp_".$this->TableName." VALUES('".$this->currentObjectID."','".sqlite_escape_string(serialize($this->currentObject))."')")) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
}
|
||||||
|
$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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_Cell Cell that was found, or null if not found
|
||||||
|
*/
|
||||||
|
public function getCacheData($pCoord)
|
||||||
|
{
|
||||||
|
if ($pCoord === $this->currentObjectID) {
|
||||||
|
return $this->currentObject;
|
||||||
|
}
|
||||||
|
$this->storeData();
|
||||||
|
|
||||||
|
$query = "SELECT value FROM kvp_".$this->TableName." WHERE id='".$pCoord."'";
|
||||||
|
$cellResultSet = $this->DBHandle->query($query, SQLITE_ASSOC);
|
||||||
|
if ($cellResultSet === false) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
} elseif ($cellResultSet->numRows() == 0) {
|
||||||
|
// Return null if requested entry doesn't exist in cache
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set current entry to the requested entry
|
||||||
|
$this->currentObjectID = $pCoord;
|
||||||
|
|
||||||
|
$cellResult = $cellResultSet->fetchSingle();
|
||||||
|
$this->currentObject = unserialize($cellResult);
|
||||||
|
// 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
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function isDataSet($pCoord)
|
||||||
|
{
|
||||||
|
if ($pCoord === $this->currentObjectID) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the requested entry exists in the cache
|
||||||
|
$query = "SELECT id FROM kvp_".$this->TableName." WHERE id='".$pCoord."'";
|
||||||
|
$cellResultSet = $this->DBHandle->query($query, SQLITE_ASSOC);
|
||||||
|
if ($cellResultSet === false) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
} elseif ($cellResultSet->numRows() == 0) {
|
||||||
|
// Return null if requested entry doesn't exist in cache
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a cell in cache identified by coordinate address
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to delete
|
||||||
|
* @throws PHPExcel_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
|
||||||
|
$query = "DELETE FROM kvp_".$this->TableName." WHERE id='".$pCoord."'";
|
||||||
|
if (!$this->DBHandle->queryExec($query)) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$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
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function moveCell($fromAddress, $toAddress)
|
||||||
|
{
|
||||||
|
if ($fromAddress === $this->currentObjectID) {
|
||||||
|
$this->currentObjectID = $toAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = "DELETE FROM kvp_".$this->TableName." WHERE id='".$toAddress."'";
|
||||||
|
$result = $this->DBHandle->exec($query);
|
||||||
|
if ($result === false) {
|
||||||
|
throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = "UPDATE kvp_".$this->TableName." SET id='".$toAddress."' WHERE id='".$fromAddress."'";
|
||||||
|
$result = $this->DBHandle->exec($query);
|
||||||
|
if ($result === false) {
|
||||||
|
throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of all cell addresses currently held in cache
|
||||||
|
*
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
public function getCellList()
|
||||||
|
{
|
||||||
|
if ($this->currentObjectID !== null) {
|
||||||
|
$this->storeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = "SELECT id FROM kvp_".$this->TableName;
|
||||||
|
$cellIdsResult = $this->DBHandle->unbufferedQuery($query, SQLITE_ASSOC);
|
||||||
|
if ($cellIdsResult === false) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$cellKeys = array();
|
||||||
|
foreach ($cellIdsResult as $row) {
|
||||||
|
$cellKeys[] = $row['id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $cellKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone the cell collection
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_Worksheet $parent)
|
||||||
|
{
|
||||||
|
$this->currentCellIsDirty;
|
||||||
|
$this->storeData();
|
||||||
|
|
||||||
|
// Get a new id for the new table name
|
||||||
|
$tableName = str_replace('.', '_', $this->getUniqueID());
|
||||||
|
if (!$this->DBHandle->queryExec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)
|
||||||
|
AS SELECT * FROM kvp_'.$this->TableName)
|
||||||
|
) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the existing cell cache file
|
||||||
|
$this->TableName = $tableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the cell collection and disconnect from our parent
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
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 PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_Worksheet $parent)
|
||||||
|
{
|
||||||
|
parent::__construct($parent);
|
||||||
|
if (is_null($this->DBHandle)) {
|
||||||
|
$this->TableName = str_replace('.', '_', $this->getUniqueID());
|
||||||
|
$_DBName = ':memory:';
|
||||||
|
|
||||||
|
$this->DBHandle = new SQLiteDatabase($_DBName);
|
||||||
|
if ($this->DBHandle === false) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
}
|
||||||
|
if (!$this->DBHandle->queryExec('CREATE TABLE kvp_'.$this->TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) {
|
||||||
|
throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy this cell collection
|
||||||
|
*/
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
if (!is_null($this->DBHandle)) {
|
||||||
|
$this->DBHandle->queryExec('DROP TABLE kvp_'.$this->TableName);
|
||||||
|
}
|
||||||
|
$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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
if (!function_exists('sqlite_open')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,346 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_SQLite3
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_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
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_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 PHPExcel_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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_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
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_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 PHPExcel_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 PHPExcel_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
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_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 PHPExcel_Exception($this->DBHandle->lastErrorMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of all cell addresses currently held in cache
|
||||||
|
*
|
||||||
|
* @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 PHPExcel_Exception($this->DBHandle->lastErrorMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
$cellKeys = array();
|
||||||
|
while ($row = $cellIdsResult->fetchArray(SQLITE3_ASSOC)) {
|
||||||
|
$cellKeys[] = $row['id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $cellKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone the cell collection
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_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 PHPExcel_Exception($this->DBHandle->lastErrorMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the existing cell cache file
|
||||||
|
$this->TableName = $tableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the cell collection and disconnect from our parent
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
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 PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_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 PHPExcel_Exception($this->DBHandle->lastErrorMsg());
|
||||||
|
}
|
||||||
|
if (!$this->DBHandle->exec('CREATE TABLE kvp_'.$this->TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) {
|
||||||
|
throw new PHPExcel_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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
if (!class_exists('SQLite3', false)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,289 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorage_Wincache
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Prefix used to uniquely identify cache data for this worksheet
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $cachePrefix = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache timeout
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $cacheTime = 600;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store cell data in cache for the current cell object if it's "dirty",
|
||||||
|
* and the 'nullify' the current cell object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws PHPExcel_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 PHPExcel_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 PHPExcel_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 PHPExcel_Cell $cell Cell to update
|
||||||
|
* @return PHPExcel_Cell
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addCacheData($pCoord, PHPExcel_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 PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
||||||
|
*
|
||||||
|
* @param string $pCoord Coordinate address of the cell to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
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 PHPExcel_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 PHPExcel_Exception
|
||||||
|
* @return PHPExcel_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 PHPExcel_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 PHPExcel_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 PHPExcel_Worksheet $parent The new worksheet
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function copyCellCollection(PHPExcel_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 PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');
|
||||||
|
}
|
||||||
|
if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->cacheTime)) {
|
||||||
|
$this->__destruct();
|
||||||
|
throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cachePrefix = $newCachePrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the cell collection and disconnect from our parent
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unsetWorksheetCells()
|
||||||
|
{
|
||||||
|
if (!is_null($this->currentObject)) {
|
||||||
|
$this->currentObject->detach();
|
||||||
|
$this->currentObject = $this->currentObjectID = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush the WinCache cache
|
||||||
|
$this->__destruct();
|
||||||
|
|
||||||
|
$this->cellCache = array();
|
||||||
|
|
||||||
|
// detach ourself from the worksheet, so that it can then delete this object successfully
|
||||||
|
$this->parent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise this new cell collection
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent The worksheet for this cell collection
|
||||||
|
* @param array of mixed $arguments Additional initialisation arguments
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_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 boolean
|
||||||
|
*/
|
||||||
|
public static function cacheMethodIsAvailable()
|
||||||
|
{
|
||||||
|
if (!function_exists('wincache_ucache_add')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,231 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CachedObjectStorageFactory
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_CachedObjectStorage
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_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_sqlite = 'SQLite';
|
||||||
|
const cache_to_sqlite3 = 'SQLite3';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the method used for cell cacheing
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private static $cacheStorageMethod = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the class used for cell cacheing
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private static $cacheStorageClass = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of all possible cache storage methods
|
||||||
|
*
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
private static $storageMethods = array(
|
||||||
|
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_sqlite,
|
||||||
|
self::cache_to_sqlite3,
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default arguments for each cache storage method
|
||||||
|
*
|
||||||
|
* @var array of mixed array
|
||||||
|
*/
|
||||||
|
private static $storageMethodDefaultParameters = array(
|
||||||
|
self::cache_in_memory => array(
|
||||||
|
),
|
||||||
|
self::cache_in_memory_gzip => array(
|
||||||
|
),
|
||||||
|
self::cache_in_memory_serialized => array(
|
||||||
|
),
|
||||||
|
self::cache_igbinary => array(
|
||||||
|
),
|
||||||
|
self::cache_to_phpTemp => array( 'memoryCacheSize' => '1MB'
|
||||||
|
),
|
||||||
|
self::cache_to_discISAM => array( 'dir' => null
|
||||||
|
),
|
||||||
|
self::cache_to_apc => array( 'cacheTime' => 600
|
||||||
|
),
|
||||||
|
self::cache_to_memcache => array( 'memcacheServer' => 'localhost',
|
||||||
|
'memcachePort' => 11211,
|
||||||
|
'cacheTime' => 600
|
||||||
|
),
|
||||||
|
self::cache_to_wincache => array( 'cacheTime' => 600
|
||||||
|
),
|
||||||
|
self::cache_to_sqlite => array(
|
||||||
|
),
|
||||||
|
self::cache_to_sqlite3 => array(
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arguments for the active cache storage method
|
||||||
|
*
|
||||||
|
* @var array of mixed array
|
||||||
|
*/
|
||||||
|
private static $storageMethodParameters = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current cache storage method
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
**/
|
||||||
|
public static function getCacheStorageMethod()
|
||||||
|
{
|
||||||
|
return self::$cacheStorageMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current cache storage class
|
||||||
|
*
|
||||||
|
* @return PHPExcel_CachedObjectStorage_ICache|null
|
||||||
|
**/
|
||||||
|
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 = array();
|
||||||
|
foreach (self::$storageMethods as $storageMethod) {
|
||||||
|
$cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $storageMethod;
|
||||||
|
if (call_user_func(array($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 array of mixed $arguments Additional arguments to pass to the cell caching class
|
||||||
|
* when instantiating
|
||||||
|
* @return boolean
|
||||||
|
**/
|
||||||
|
public static function initialize($method = self::cache_in_memory, $arguments = array())
|
||||||
|
{
|
||||||
|
if (!in_array($method, self::$storageMethods)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cacheStorageClass = 'PHPExcel_CachedObjectStorage_'.$method;
|
||||||
|
if (!call_user_func(array( $cacheStorageClass,
|
||||||
|
'cacheMethodIsAvailable'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
self::$storageMethodParameters[$method] = self::$storageMethodDefaultParameters[$method];
|
||||||
|
foreach ($arguments as $k => $v) {
|
||||||
|
if (array_key_exists($k, self::$storageMethodParameters[$method])) {
|
||||||
|
self::$storageMethodParameters[$method][$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::$cacheStorageMethod === null) {
|
||||||
|
self::$cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $method;
|
||||||
|
self::$cacheStorageMethod = $method;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise the cache storage
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $parent Enable cell caching for this worksheet
|
||||||
|
* @return PHPExcel_CachedObjectStorage_ICache
|
||||||
|
**/
|
||||||
|
public static function getInstance(PHPExcel_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 = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CalcEngine_CyclicReferenceStack
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CalcEngine_CyclicReferenceStack
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The call stack for calculated cells
|
||||||
|
*
|
||||||
|
* @var mixed[]
|
||||||
|
*/
|
||||||
|
private $stack = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of entries on the stack
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function count()
|
||||||
|
{
|
||||||
|
return count($this->stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Push a new entry onto the stack
|
||||||
|
*
|
||||||
|
* @param mixed $value
|
||||||
|
*/
|
||||||
|
public function push($value)
|
||||||
|
{
|
||||||
|
$this->stack[$value] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pop the last entry from the stack
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function pop()
|
||||||
|
{
|
||||||
|
return array_pop($this->stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test to see if a specified entry exists on the stack
|
||||||
|
*
|
||||||
|
* @param mixed $value The value to test
|
||||||
|
*/
|
||||||
|
public function onStack($value)
|
||||||
|
{
|
||||||
|
return isset($this->stack[$value]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the stack
|
||||||
|
*/
|
||||||
|
public function clear()
|
||||||
|
{
|
||||||
|
$this->stack = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array of all entries on the stack
|
||||||
|
*
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
public function showStack()
|
||||||
|
{
|
||||||
|
return $this->stack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,151 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_CalcEngine_Logger
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_CalcEngine_Logger
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Flag to determine whether a debug log should be generated by the calculation engine
|
||||||
|
* If true, then a debug log will be generated
|
||||||
|
* If false, then a debug log will not be generated
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $writeDebugLog = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to determine whether a debug log should be echoed by the calculation engine
|
||||||
|
* If true, then a debug log will be echoed
|
||||||
|
* If false, then a debug log will not be echoed
|
||||||
|
* A debug log can only be echoed if it is generated
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $echoDebugLog = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The debug log generated by the calculation engine
|
||||||
|
*
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
private $debugLog = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The calculation engine cell reference stack
|
||||||
|
*
|
||||||
|
* @var PHPExcel_CalcEngine_CyclicReferenceStack
|
||||||
|
*/
|
||||||
|
private $cellStack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate a Calculation engine logger
|
||||||
|
*
|
||||||
|
* @param PHPExcel_CalcEngine_CyclicReferenceStack $stack
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_CalcEngine_CyclicReferenceStack $stack)
|
||||||
|
{
|
||||||
|
$this->cellStack = $stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/Disable Calculation engine logging
|
||||||
|
*
|
||||||
|
* @param boolean $pValue
|
||||||
|
*/
|
||||||
|
public function setWriteDebugLog($pValue = false)
|
||||||
|
{
|
||||||
|
$this->writeDebugLog = $pValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether calculation engine logging is enabled or disabled
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getWriteDebugLog()
|
||||||
|
{
|
||||||
|
return $this->writeDebugLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/Disable echoing of debug log information
|
||||||
|
*
|
||||||
|
* @param boolean $pValue
|
||||||
|
*/
|
||||||
|
public function setEchoDebugLog($pValue = false)
|
||||||
|
{
|
||||||
|
$this->echoDebugLog = $pValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether echoing of debug log information is enabled or disabled
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getEchoDebugLog()
|
||||||
|
{
|
||||||
|
return $this->echoDebugLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write an entry to the calculation engine debug log
|
||||||
|
*/
|
||||||
|
public function writeDebugLog()
|
||||||
|
{
|
||||||
|
// Only write the debug log if logging is enabled
|
||||||
|
if ($this->writeDebugLog) {
|
||||||
|
$message = implode(func_get_args());
|
||||||
|
$cellReference = implode(' -> ', $this->cellStack->showStack());
|
||||||
|
if ($this->echoDebugLog) {
|
||||||
|
echo $cellReference,
|
||||||
|
($this->cellStack->count() > 0 ? ' => ' : ''),
|
||||||
|
$message,
|
||||||
|
PHP_EOL;
|
||||||
|
}
|
||||||
|
$this->debugLog[] = $cellReference .
|
||||||
|
($this->cellStack->count() > 0 ? ' => ' : '') .
|
||||||
|
$message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the calculation engine debug log
|
||||||
|
*/
|
||||||
|
public function clearLog()
|
||||||
|
{
|
||||||
|
$this->debugLog = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the calculation engine debug log
|
||||||
|
*
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
public function getLog()
|
||||||
|
{
|
||||||
|
return $this->debugLog;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,676 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_Database
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_Database
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* fieldExtract
|
||||||
|
*
|
||||||
|
* Extracts the column ID to use for the data field.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param mixed $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @return string|NULL
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static function fieldExtract($database, $field)
|
||||||
|
{
|
||||||
|
$field = strtoupper(PHPExcel_Calculation_Functions::flattenSingleValue($field));
|
||||||
|
$fieldNames = array_map('strtoupper', array_shift($database));
|
||||||
|
|
||||||
|
if (is_numeric($field)) {
|
||||||
|
$keys = array_keys($fieldNames);
|
||||||
|
return $keys[$field-1];
|
||||||
|
}
|
||||||
|
$key = array_search($field, $fieldNames);
|
||||||
|
return ($key) ? $key : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* filter
|
||||||
|
*
|
||||||
|
* Parses the selection criteria, extracts the database rows that match those criteria, and
|
||||||
|
* returns that subset of rows.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return array of mixed
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static function filter($database, $criteria)
|
||||||
|
{
|
||||||
|
$fieldNames = array_shift($database);
|
||||||
|
$criteriaNames = array_shift($criteria);
|
||||||
|
|
||||||
|
// Convert the criteria into a set of AND/OR conditions with [:placeholders]
|
||||||
|
$testConditions = $testValues = array();
|
||||||
|
$testConditionsCount = 0;
|
||||||
|
foreach ($criteriaNames as $key => $criteriaName) {
|
||||||
|
$testCondition = array();
|
||||||
|
$testConditionCount = 0;
|
||||||
|
foreach ($criteria as $row => $criterion) {
|
||||||
|
if ($criterion[$key] > '') {
|
||||||
|
$testCondition[] = '[:'.$criteriaName.']'.PHPExcel_Calculation_Functions::ifCondition($criterion[$key]);
|
||||||
|
$testConditionCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($testConditionCount > 1) {
|
||||||
|
$testConditions[] = 'OR(' . implode(',', $testCondition) . ')';
|
||||||
|
$testConditionsCount++;
|
||||||
|
} elseif ($testConditionCount == 1) {
|
||||||
|
$testConditions[] = $testCondition[0];
|
||||||
|
$testConditionsCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($testConditionsCount > 1) {
|
||||||
|
$testConditionSet = 'AND(' . implode(',', $testConditions) . ')';
|
||||||
|
} elseif ($testConditionsCount == 1) {
|
||||||
|
$testConditionSet = $testConditions[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through each row of the database
|
||||||
|
foreach ($database as $dataRow => $dataValues) {
|
||||||
|
// Substitute actual values from the database row for our [:placeholders]
|
||||||
|
$testConditionList = $testConditionSet;
|
||||||
|
foreach ($criteriaNames as $key => $criteriaName) {
|
||||||
|
$k = array_search($criteriaName, $fieldNames);
|
||||||
|
if (isset($dataValues[$k])) {
|
||||||
|
$dataValue = $dataValues[$k];
|
||||||
|
$dataValue = (is_string($dataValue)) ? PHPExcel_Calculation::wrapResult(strtoupper($dataValue)) : $dataValue;
|
||||||
|
$testConditionList = str_replace('[:' . $criteriaName . ']', $dataValue, $testConditionList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// evaluate the criteria against the row data
|
||||||
|
$result = PHPExcel_Calculation::getInstance()->_calculateFormulaValue('='.$testConditionList);
|
||||||
|
// If the row failed to meet the criteria, remove it from the database
|
||||||
|
if (!$result) {
|
||||||
|
unset($database[$dataRow]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $database;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static function getFilteredColumn($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
// reduce the database to a set of rows that match all the criteria
|
||||||
|
$database = self::filter($database, $criteria);
|
||||||
|
// extract an array of values for the requested column
|
||||||
|
$colData = array();
|
||||||
|
foreach ($database as $row) {
|
||||||
|
$colData[] = $row[$field];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $colData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DAVERAGE
|
||||||
|
*
|
||||||
|
* Averages the values in a column of a list or database that match conditions you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DAVERAGE(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DAVERAGE($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::AVERAGE(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DCOUNT
|
||||||
|
*
|
||||||
|
* Counts the cells that contain numbers in a column of a list or database that match conditions
|
||||||
|
* that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DCOUNT(database,[field],criteria)
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DAVERAGE(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return integer
|
||||||
|
*
|
||||||
|
* @TODO The field argument is optional. If field is omitted, DCOUNT counts all records in the
|
||||||
|
* database that match the criteria.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DCOUNT($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::COUNT(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DCOUNTA
|
||||||
|
*
|
||||||
|
* Counts the nonblank cells in a column of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DCOUNTA(database,[field],criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return integer
|
||||||
|
*
|
||||||
|
* @TODO The field argument is optional. If field is omitted, DCOUNTA counts all records in the
|
||||||
|
* database that match the criteria.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DCOUNTA($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// reduce the database to a set of rows that match all the criteria
|
||||||
|
$database = self::filter($database, $criteria);
|
||||||
|
// extract an array of values for the requested column
|
||||||
|
$colData = array();
|
||||||
|
foreach ($database as $row) {
|
||||||
|
$colData[] = $row[$field];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::COUNTA(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DGET
|
||||||
|
*
|
||||||
|
* Extracts a single value from a column of a list or database that matches conditions that you
|
||||||
|
* specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DGET(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return mixed
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DGET($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
$colData = self::getFilteredColumn($database, $field, $criteria);
|
||||||
|
if (count($colData) > 1) {
|
||||||
|
return PHPExcel_Calculation_Functions::NaN();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $colData[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DMAX
|
||||||
|
*
|
||||||
|
* Returns the largest number in a column of a list or database that matches conditions you that
|
||||||
|
* specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DMAX(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DMAX($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::MAX(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DMIN
|
||||||
|
*
|
||||||
|
* Returns the smallest number in a column of a list or database that matches conditions you that
|
||||||
|
* specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DMIN(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DMIN($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::MIN(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DPRODUCT
|
||||||
|
*
|
||||||
|
* Multiplies the values in a column of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DPRODUCT(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DPRODUCT($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_MathTrig::PRODUCT(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DSTDEV
|
||||||
|
*
|
||||||
|
* Estimates the standard deviation of a population based on a sample by using the numbers in a
|
||||||
|
* column of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DSTDEV(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DSTDEV($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::STDEV(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DSTDEVP
|
||||||
|
*
|
||||||
|
* Calculates the standard deviation of a population based on the entire population by using the
|
||||||
|
* numbers in a column of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DSTDEVP(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DSTDEVP($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::STDEVP(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DSUM
|
||||||
|
*
|
||||||
|
* Adds the numbers in a column of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DSUM(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DSUM($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_MathTrig::SUM(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DVAR
|
||||||
|
*
|
||||||
|
* Estimates the variance of a population based on a sample by using the numbers in a column
|
||||||
|
* of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DVAR(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DVAR($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::VARFunc(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DVARP
|
||||||
|
*
|
||||||
|
* Calculates the variance of a population based on the entire population by using the numbers
|
||||||
|
* in a column of a list or database that match conditions that you specify.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* DVARP(database,field,criteria)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Database Functions
|
||||||
|
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||||
|
* A database is a list of related data in which rows of related
|
||||||
|
* information are records, and columns of data are fields. The
|
||||||
|
* first row of the list contains labels for each column.
|
||||||
|
* @param string|integer $field Indicates which column is used in the function. Enter the
|
||||||
|
* column label enclosed between double quotation marks, such as
|
||||||
|
* "Age" or "Yield," or a number (without quotation marks) that
|
||||||
|
* represents the position of the column within the list: 1 for
|
||||||
|
* the first column, 2 for the second column, and so on.
|
||||||
|
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||||
|
* You can use any range for the criteria argument, as long as it
|
||||||
|
* includes at least one column label and at least one cell below
|
||||||
|
* the column label in which you specify a condition for the
|
||||||
|
* column.
|
||||||
|
* @return float
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function DVARP($database, $field, $criteria)
|
||||||
|
{
|
||||||
|
$field = self::fieldExtract($database, $field);
|
||||||
|
if (is_null($field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return PHPExcel_Calculation_Statistical::VARP(
|
||||||
|
self::getFilteredColumn($database, $field, $criteria)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_Exception
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_Exception extends PHPExcel_Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Error handler callback
|
||||||
|
*
|
||||||
|
* @param mixed $code
|
||||||
|
* @param mixed $string
|
||||||
|
* @param mixed $file
|
||||||
|
* @param mixed $line
|
||||||
|
* @param mixed $context
|
||||||
|
*/
|
||||||
|
public static function errorHandlerCallback($code, $string, $file, $line, $context)
|
||||||
|
{
|
||||||
|
$e = new self($string, $code);
|
||||||
|
$e->line = $line;
|
||||||
|
$e->file = $file;
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_ExceptionHandler
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_ExceptionHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Register errorhandler
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
set_error_handler(array('PHPExcel_Calculation_Exception', 'errorHandlerCallback'), E_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister errorhandler
|
||||||
|
*/
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
restore_error_handler();
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,622 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
PARTLY BASED ON:
|
||||||
|
Copyright (c) 2007 E. W. Bachtal, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
|
||||||
|
The software is provided "as is", without warranty of any kind, express or implied, including but not
|
||||||
|
limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In
|
||||||
|
no event shall the authors or copyright holders be liable for any claim, damages or other liability,
|
||||||
|
whether in an action of contract, tort or otherwise, arising from, out of or in connection with the
|
||||||
|
software or the use or other dealings in the software.
|
||||||
|
|
||||||
|
http://ewbi.blogs.com/develops/2007/03/excel_formula_p.html
|
||||||
|
http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_FormulaParser
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class PHPExcel_Calculation_FormulaParser
|
||||||
|
{
|
||||||
|
/* Character constants */
|
||||||
|
const QUOTE_DOUBLE = '"';
|
||||||
|
const QUOTE_SINGLE = '\'';
|
||||||
|
const BRACKET_CLOSE = ']';
|
||||||
|
const BRACKET_OPEN = '[';
|
||||||
|
const BRACE_OPEN = '{';
|
||||||
|
const BRACE_CLOSE = '}';
|
||||||
|
const PAREN_OPEN = '(';
|
||||||
|
const PAREN_CLOSE = ')';
|
||||||
|
const SEMICOLON = ';';
|
||||||
|
const WHITESPACE = ' ';
|
||||||
|
const COMMA = ',';
|
||||||
|
const ERROR_START = '#';
|
||||||
|
|
||||||
|
const OPERATORS_SN = "+-";
|
||||||
|
const OPERATORS_INFIX = "+-*/^&=><";
|
||||||
|
const OPERATORS_POSTFIX = "%";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formula
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $formula;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tokens
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Calculation_FormulaToken[]
|
||||||
|
*/
|
||||||
|
private $tokens = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Calculation_FormulaParser
|
||||||
|
*
|
||||||
|
* @param string $pFormula Formula to parse
|
||||||
|
* @throws PHPExcel_Calculation_Exception
|
||||||
|
*/
|
||||||
|
public function __construct($pFormula = '')
|
||||||
|
{
|
||||||
|
// Check parameters
|
||||||
|
if (is_null($pFormula)) {
|
||||||
|
throw new PHPExcel_Calculation_Exception("Invalid parameter passed: formula");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialise values
|
||||||
|
$this->formula = trim($pFormula);
|
||||||
|
// Parse!
|
||||||
|
$this->parseToTokens();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Formula
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormula()
|
||||||
|
{
|
||||||
|
return $this->formula;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Token
|
||||||
|
*
|
||||||
|
* @param int $pId Token id
|
||||||
|
* @return string
|
||||||
|
* @throws PHPExcel_Calculation_Exception
|
||||||
|
*/
|
||||||
|
public function getToken($pId = 0)
|
||||||
|
{
|
||||||
|
if (isset($this->tokens[$pId])) {
|
||||||
|
return $this->tokens[$pId];
|
||||||
|
} else {
|
||||||
|
throw new PHPExcel_Calculation_Exception("Token with id $pId does not exist.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Token count
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTokenCount()
|
||||||
|
{
|
||||||
|
return count($this->tokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Tokens
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Calculation_FormulaToken[]
|
||||||
|
*/
|
||||||
|
public function getTokens()
|
||||||
|
{
|
||||||
|
return $this->tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse to tokens
|
||||||
|
*/
|
||||||
|
private function parseToTokens()
|
||||||
|
{
|
||||||
|
// No attempt is made to verify formulas; assumes formulas are derived from Excel, where
|
||||||
|
// they can only exist if valid; stack overflows/underflows sunk as nulls without exceptions.
|
||||||
|
|
||||||
|
// Check if the formula has a valid starting =
|
||||||
|
$formulaLength = strlen($this->formula);
|
||||||
|
if ($formulaLength < 2 || $this->formula{0} != '=') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper variables
|
||||||
|
$tokens1 = $tokens2 = $stack = array();
|
||||||
|
$inString = $inPath = $inRange = $inError = false;
|
||||||
|
$token = $previousToken = $nextToken = null;
|
||||||
|
|
||||||
|
$index = 1;
|
||||||
|
$value = '';
|
||||||
|
|
||||||
|
$ERRORS = array("#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A");
|
||||||
|
$COMPARATORS_MULTI = array(">=", "<=", "<>");
|
||||||
|
|
||||||
|
while ($index < $formulaLength) {
|
||||||
|
// state-dependent character evaluation (order is important)
|
||||||
|
|
||||||
|
// double-quoted strings
|
||||||
|
// embeds are doubled
|
||||||
|
// end marks token
|
||||||
|
if ($inString) {
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) {
|
||||||
|
if ((($index + 2) <= $formulaLength) && ($this->formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE)) {
|
||||||
|
$value .= PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE;
|
||||||
|
++$index;
|
||||||
|
} else {
|
||||||
|
$inString = false;
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_TEXT);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value .= $this->formula{$index};
|
||||||
|
}
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// single-quoted strings (links)
|
||||||
|
// embeds are double
|
||||||
|
// end does not mark a token
|
||||||
|
if ($inPath) {
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) {
|
||||||
|
if ((($index + 2) <= $formulaLength) && ($this->formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE)) {
|
||||||
|
$value .= PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE;
|
||||||
|
++$index;
|
||||||
|
} else {
|
||||||
|
$inPath = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value .= $this->formula{$index};
|
||||||
|
}
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// bracked strings (R1C1 range index or linked workbook name)
|
||||||
|
// no embeds (changed to "()" by Excel)
|
||||||
|
// end does not mark a token
|
||||||
|
if ($inRange) {
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_CLOSE) {
|
||||||
|
$inRange = false;
|
||||||
|
}
|
||||||
|
$value .= $this->formula{$index};
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// error values
|
||||||
|
// end marks a token, determined from absolute list of values
|
||||||
|
if ($inError) {
|
||||||
|
$value .= $this->formula{$index};
|
||||||
|
++$index;
|
||||||
|
if (in_array($value, $ERRORS)) {
|
||||||
|
$inError = false;
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_ERROR);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// scientific notation check
|
||||||
|
if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_SN, $this->formula{$index}) !== false) {
|
||||||
|
if (strlen($value) > 1) {
|
||||||
|
if (preg_match("/^[1-9]{1}(\.[0-9]+)?E{1}$/", $this->formula{$index}) != 0) {
|
||||||
|
$value .= $this->formula{$index};
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// independent character evaluation (order not important)
|
||||||
|
|
||||||
|
// establish state-dependent character evaluations
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) {
|
||||||
|
if (strlen($value > 0)) {
|
||||||
|
// unexpected
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$inString = true;
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
// unexpected
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$inPath = true;
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_OPEN) {
|
||||||
|
$inRange = true;
|
||||||
|
$value .= PHPExcel_Calculation_FormulaParser::BRACKET_OPEN;
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::ERROR_START) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
// unexpected
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$inError = true;
|
||||||
|
$value .= PHPExcel_Calculation_FormulaParser::ERROR_START;
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark start and end of arrays and array rows
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_OPEN) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
// unexpected
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp = new PHPExcel_Calculation_FormulaToken("ARRAY", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
$stack[] = clone $tmp;
|
||||||
|
|
||||||
|
$tmp = new PHPExcel_Calculation_FormulaToken("ARRAYROW", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
$stack[] = clone $tmp;
|
||||||
|
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::SEMICOLON) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp = array_pop($stack);
|
||||||
|
$tmp->setValue("");
|
||||||
|
$tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
|
||||||
|
$tmp = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
|
||||||
|
$tmp = new PHPExcel_Calculation_FormulaToken("ARRAYROW", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
$stack[] = clone $tmp;
|
||||||
|
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_CLOSE) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp = array_pop($stack);
|
||||||
|
$tmp->setValue("");
|
||||||
|
$tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
|
||||||
|
$tmp = array_pop($stack);
|
||||||
|
$tmp->setValue("");
|
||||||
|
$tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim white-space
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken("", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE);
|
||||||
|
++$index;
|
||||||
|
while (($this->formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) && ($index < $formulaLength)) {
|
||||||
|
++$index;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// multi-character comparators
|
||||||
|
if (($index + 2) <= $formulaLength) {
|
||||||
|
if (in_array(substr($this->formula, $index, 2), $COMPARATORS_MULTI)) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken(substr($this->formula, $index, 2), PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL);
|
||||||
|
$index += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// standard infix operators
|
||||||
|
if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_INFIX, $this->formula{$index}) !== false) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] =new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($this->formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX);
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// standard postfix operators (only one)
|
||||||
|
if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_POSTFIX, $this->formula{$index}) !== false) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($this->formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX);
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// start subexpression or function
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_OPEN) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tmp = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
$stack[] = clone $tmp;
|
||||||
|
$value = "";
|
||||||
|
} else {
|
||||||
|
$tmp = new PHPExcel_Calculation_FormulaToken("", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
$stack[] = clone $tmp;
|
||||||
|
}
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// function, subexpression, or array parameters, or operand unions
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::COMMA) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp = array_pop($stack);
|
||||||
|
$tmp->setValue("");
|
||||||
|
$tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);
|
||||||
|
$stack[] = $tmp;
|
||||||
|
|
||||||
|
if ($tmp->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_UNION);
|
||||||
|
} else {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT);
|
||||||
|
}
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop subexpression
|
||||||
|
if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_CLOSE) {
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
$value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp = array_pop($stack);
|
||||||
|
$tmp->setValue("");
|
||||||
|
$tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);
|
||||||
|
$tokens1[] = $tmp;
|
||||||
|
|
||||||
|
++$index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// token accumulation
|
||||||
|
$value .= $this->formula{$index};
|
||||||
|
++$index;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dump remaining accumulation
|
||||||
|
if (strlen($value) > 0) {
|
||||||
|
$tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move tokenList to new set, excluding unnecessary white-space tokens and converting necessary ones to intersections
|
||||||
|
$tokenCount = count($tokens1);
|
||||||
|
for ($i = 0; $i < $tokenCount; ++$i) {
|
||||||
|
$token = $tokens1[$i];
|
||||||
|
if (isset($tokens1[$i - 1])) {
|
||||||
|
$previousToken = $tokens1[$i - 1];
|
||||||
|
} else {
|
||||||
|
$previousToken = null;
|
||||||
|
}
|
||||||
|
if (isset($tokens1[$i + 1])) {
|
||||||
|
$nextToken = $tokens1[$i + 1];
|
||||||
|
} else {
|
||||||
|
$nextToken = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($token)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token->getTokenType() != PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE) {
|
||||||
|
$tokens2[] = $token;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($previousToken)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! (
|
||||||
|
(($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||
|
||||||
|
(($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||
|
||||||
|
($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)
|
||||||
|
) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($nextToken)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! (
|
||||||
|
(($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) ||
|
||||||
|
(($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) ||
|
||||||
|
($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)
|
||||||
|
) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tokens2[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_INTERSECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move tokens to final list, switching infix "-" operators to prefix when appropriate, switching infix "+" operators
|
||||||
|
// to noop when appropriate, identifying operand and infix-operator subtypes, and pulling "@" from function names
|
||||||
|
$this->tokens = array();
|
||||||
|
|
||||||
|
$tokenCount = count($tokens2);
|
||||||
|
for ($i = 0; $i < $tokenCount; ++$i) {
|
||||||
|
$token = $tokens2[$i];
|
||||||
|
if (isset($tokens2[$i - 1])) {
|
||||||
|
$previousToken = $tokens2[$i - 1];
|
||||||
|
} else {
|
||||||
|
$previousToken = null;
|
||||||
|
}
|
||||||
|
if (isset($tokens2[$i + 1])) {
|
||||||
|
$nextToken = $tokens2[$i + 1];
|
||||||
|
} else {
|
||||||
|
$nextToken = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($token)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == "-") {
|
||||||
|
if ($i == 0) {
|
||||||
|
$token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX);
|
||||||
|
} elseif ((($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) &&
|
||||||
|
($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||
|
||||||
|
(($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) &&
|
||||||
|
($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||
|
||||||
|
($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) ||
|
||||||
|
($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)) {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH);
|
||||||
|
} else {
|
||||||
|
$token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tokens[] = $token;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == "+") {
|
||||||
|
if ($i == 0) {
|
||||||
|
continue;
|
||||||
|
} elseif ((($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) &&
|
||||||
|
($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||
|
||||||
|
(($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) &&
|
||||||
|
($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||
|
||||||
|
($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) ||
|
||||||
|
($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)) {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH);
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tokens[] = $token;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX &&
|
||||||
|
$token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) {
|
||||||
|
if (strpos("<>=", substr($token->getValue(), 0, 1)) !== false) {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL);
|
||||||
|
} elseif ($token->getValue() == "&") {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_CONCATENATION);
|
||||||
|
} else {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tokens[] = $token;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND &&
|
||||||
|
$token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) {
|
||||||
|
if (!is_numeric($token->getValue())) {
|
||||||
|
if (strtoupper($token->getValue()) == "TRUE" || strtoupper($token->getValue() == "FALSE")) {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL);
|
||||||
|
} else {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_RANGE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tokens[] = $token;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) {
|
||||||
|
if (strlen($token->getValue() > 0)) {
|
||||||
|
if (substr($token->getValue(), 0, 1) == "@") {
|
||||||
|
$token->setValue(substr($token->getValue(), 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tokens[] = $token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,176 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
PARTLY BASED ON:
|
||||||
|
Copyright (c) 2007 E. W. Bachtal, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
|
||||||
|
The software is provided "as is", without warranty of any kind, express or implied, including but not
|
||||||
|
limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In
|
||||||
|
no event shall the authors or copyright holders be liable for any claim, damages or other liability,
|
||||||
|
whether in an action of contract, tort or otherwise, arising from, out of or in connection with the
|
||||||
|
software or the use or other dealings in the software.
|
||||||
|
|
||||||
|
http://ewbi.blogs.com/develops/2007/03/excel_formula_p.html
|
||||||
|
http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_FormulaToken
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class PHPExcel_Calculation_FormulaToken
|
||||||
|
{
|
||||||
|
/* Token types */
|
||||||
|
const TOKEN_TYPE_NOOP = 'Noop';
|
||||||
|
const TOKEN_TYPE_OPERAND = 'Operand';
|
||||||
|
const TOKEN_TYPE_FUNCTION = 'Function';
|
||||||
|
const TOKEN_TYPE_SUBEXPRESSION = 'Subexpression';
|
||||||
|
const TOKEN_TYPE_ARGUMENT = 'Argument';
|
||||||
|
const TOKEN_TYPE_OPERATORPREFIX = 'OperatorPrefix';
|
||||||
|
const TOKEN_TYPE_OPERATORINFIX = 'OperatorInfix';
|
||||||
|
const TOKEN_TYPE_OPERATORPOSTFIX = 'OperatorPostfix';
|
||||||
|
const TOKEN_TYPE_WHITESPACE = 'Whitespace';
|
||||||
|
const TOKEN_TYPE_UNKNOWN = 'Unknown';
|
||||||
|
|
||||||
|
/* Token subtypes */
|
||||||
|
const TOKEN_SUBTYPE_NOTHING = 'Nothing';
|
||||||
|
const TOKEN_SUBTYPE_START = 'Start';
|
||||||
|
const TOKEN_SUBTYPE_STOP = 'Stop';
|
||||||
|
const TOKEN_SUBTYPE_TEXT = 'Text';
|
||||||
|
const TOKEN_SUBTYPE_NUMBER = 'Number';
|
||||||
|
const TOKEN_SUBTYPE_LOGICAL = 'Logical';
|
||||||
|
const TOKEN_SUBTYPE_ERROR = 'Error';
|
||||||
|
const TOKEN_SUBTYPE_RANGE = 'Range';
|
||||||
|
const TOKEN_SUBTYPE_MATH = 'Math';
|
||||||
|
const TOKEN_SUBTYPE_CONCATENATION = 'Concatenation';
|
||||||
|
const TOKEN_SUBTYPE_INTERSECTION = 'Intersection';
|
||||||
|
const TOKEN_SUBTYPE_UNION = 'Union';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token Type (represented by TOKEN_TYPE_*)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $tokenType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token SubType (represented by TOKEN_SUBTYPE_*)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $tokenSubType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Calculation_FormulaToken
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @param string $pTokenType Token type (represented by TOKEN_TYPE_*)
|
||||||
|
* @param string $pTokenSubType Token Subtype (represented by TOKEN_SUBTYPE_*)
|
||||||
|
*/
|
||||||
|
public function __construct($pValue, $pTokenType = PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN, $pTokenSubType = PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING)
|
||||||
|
{
|
||||||
|
// Initialise values
|
||||||
|
$this->value = $pValue;
|
||||||
|
$this->tokenType = $pTokenType;
|
||||||
|
$this->tokenSubType = $pTokenSubType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Value
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getValue()
|
||||||
|
{
|
||||||
|
return $this->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Value
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
public function setValue($value)
|
||||||
|
{
|
||||||
|
$this->value = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Token Type (represented by TOKEN_TYPE_*)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTokenType()
|
||||||
|
{
|
||||||
|
return $this->tokenType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Token Type
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
public function setTokenType($value = PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN)
|
||||||
|
{
|
||||||
|
$this->tokenType = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Token SubType (represented by TOKEN_SUBTYPE_*)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTokenSubType()
|
||||||
|
{
|
||||||
|
return $this->tokenSubType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Token SubType
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
public function setTokenSubType($value = PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING)
|
||||||
|
{
|
||||||
|
$this->tokenSubType = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,148 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_Function
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_Function
|
||||||
|
{
|
||||||
|
/* Function categories */
|
||||||
|
const CATEGORY_CUBE = 'Cube';
|
||||||
|
const CATEGORY_DATABASE = 'Database';
|
||||||
|
const CATEGORY_DATE_AND_TIME = 'Date and Time';
|
||||||
|
const CATEGORY_ENGINEERING = 'Engineering';
|
||||||
|
const CATEGORY_FINANCIAL = 'Financial';
|
||||||
|
const CATEGORY_INFORMATION = 'Information';
|
||||||
|
const CATEGORY_LOGICAL = 'Logical';
|
||||||
|
const CATEGORY_LOOKUP_AND_REFERENCE = 'Lookup and Reference';
|
||||||
|
const CATEGORY_MATH_AND_TRIG = 'Math and Trig';
|
||||||
|
const CATEGORY_STATISTICAL = 'Statistical';
|
||||||
|
const CATEGORY_TEXT_AND_DATA = 'Text and Data';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Category (represented by CATEGORY_*)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $category;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Excel name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $excelName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $phpExcelName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Calculation_Function
|
||||||
|
*
|
||||||
|
* @param string $pCategory Category (represented by CATEGORY_*)
|
||||||
|
* @param string $pExcelName Excel function name
|
||||||
|
* @param string $pPHPExcelName PHPExcel function mapping
|
||||||
|
* @throws PHPExcel_Calculation_Exception
|
||||||
|
*/
|
||||||
|
public function __construct($pCategory = null, $pExcelName = null, $pPHPExcelName = null)
|
||||||
|
{
|
||||||
|
if (($pCategory !== null) && ($pExcelName !== null) && ($pPHPExcelName !== null)) {
|
||||||
|
// Initialise values
|
||||||
|
$this->category = $pCategory;
|
||||||
|
$this->excelName = $pExcelName;
|
||||||
|
$this->phpExcelName = $pPHPExcelName;
|
||||||
|
} else {
|
||||||
|
throw new PHPExcel_Calculation_Exception("Invalid parameters passed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Category (represented by CATEGORY_*)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCategory()
|
||||||
|
{
|
||||||
|
return $this->category;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Category (represented by CATEGORY_*)
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @throws PHPExcel_Calculation_Exception
|
||||||
|
*/
|
||||||
|
public function setCategory($value = null)
|
||||||
|
{
|
||||||
|
if (!is_null($value)) {
|
||||||
|
$this->category = $value;
|
||||||
|
} else {
|
||||||
|
throw new PHPExcel_Calculation_Exception("Invalid parameter passed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Excel name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getExcelName()
|
||||||
|
{
|
||||||
|
return $this->excelName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Excel name
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
public function setExcelName($value)
|
||||||
|
{
|
||||||
|
$this->excelName = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get PHPExcel name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPHPExcelName()
|
||||||
|
{
|
||||||
|
return $this->phpExcelName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set PHPExcel name
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
public function setPHPExcelName($value)
|
||||||
|
{
|
||||||
|
$this->phpExcelName = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,760 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** MAX_VALUE */
|
||||||
|
define('MAX_VALUE', 1.2e308);
|
||||||
|
|
||||||
|
/** 2 / PI */
|
||||||
|
define('M_2DIVPI', 0.63661977236758134307553505349006);
|
||||||
|
|
||||||
|
/** MAX_ITERATIONS */
|
||||||
|
define('MAX_ITERATIONS', 256);
|
||||||
|
|
||||||
|
/** PRECISION */
|
||||||
|
define('PRECISION', 8.88E-016);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_Functions
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_Functions
|
||||||
|
{
|
||||||
|
|
||||||
|
/** constants */
|
||||||
|
const COMPATIBILITY_EXCEL = 'Excel';
|
||||||
|
const COMPATIBILITY_GNUMERIC = 'Gnumeric';
|
||||||
|
const COMPATIBILITY_OPENOFFICE = 'OpenOfficeCalc';
|
||||||
|
|
||||||
|
const RETURNDATE_PHP_NUMERIC = 'P';
|
||||||
|
const RETURNDATE_PHP_OBJECT = 'O';
|
||||||
|
const RETURNDATE_EXCEL = 'E';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compatibility mode to use for error checking and responses
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected static $compatibilityMode = self::COMPATIBILITY_EXCEL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Type to use when returning date values
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected static $returnDateType = self::RETURNDATE_EXCEL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of error codes
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static $errorCodes = array(
|
||||||
|
'null' => '#NULL!',
|
||||||
|
'divisionbyzero' => '#DIV/0!',
|
||||||
|
'value' => '#VALUE!',
|
||||||
|
'reference' => '#REF!',
|
||||||
|
'name' => '#NAME?',
|
||||||
|
'num' => '#NUM!',
|
||||||
|
'na' => '#N/A',
|
||||||
|
'gettingdata' => '#GETTING_DATA'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Compatibility Mode
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Function Configuration
|
||||||
|
* @param string $compatibilityMode Compatibility Mode
|
||||||
|
* Permitted values are:
|
||||||
|
* PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL 'Excel'
|
||||||
|
* PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC 'Gnumeric'
|
||||||
|
* PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc'
|
||||||
|
* @return boolean (Success or Failure)
|
||||||
|
*/
|
||||||
|
public static function setCompatibilityMode($compatibilityMode)
|
||||||
|
{
|
||||||
|
if (($compatibilityMode == self::COMPATIBILITY_EXCEL) ||
|
||||||
|
($compatibilityMode == self::COMPATIBILITY_GNUMERIC) ||
|
||||||
|
($compatibilityMode == self::COMPATIBILITY_OPENOFFICE)) {
|
||||||
|
self::$compatibilityMode = $compatibilityMode;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current Compatibility Mode
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Function Configuration
|
||||||
|
* @return string Compatibility Mode
|
||||||
|
* Possible Return values are:
|
||||||
|
* PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL 'Excel'
|
||||||
|
* PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC 'Gnumeric'
|
||||||
|
* PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc'
|
||||||
|
*/
|
||||||
|
public static function getCompatibilityMode()
|
||||||
|
{
|
||||||
|
return self::$compatibilityMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Return Date Format used by functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Function Configuration
|
||||||
|
* @param string $returnDateType Return Date Format
|
||||||
|
* Permitted values are:
|
||||||
|
* PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC 'P'
|
||||||
|
* PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT 'O'
|
||||||
|
* PHPExcel_Calculation_Functions::RETURNDATE_EXCEL 'E'
|
||||||
|
* @return boolean Success or failure
|
||||||
|
*/
|
||||||
|
public static function setReturnDateType($returnDateType)
|
||||||
|
{
|
||||||
|
if (($returnDateType == self::RETURNDATE_PHP_NUMERIC) ||
|
||||||
|
($returnDateType == self::RETURNDATE_PHP_OBJECT) ||
|
||||||
|
($returnDateType == self::RETURNDATE_EXCEL)) {
|
||||||
|
self::$returnDateType = $returnDateType;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current Return Date Format for functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Function Configuration
|
||||||
|
* @return string Return Date Format
|
||||||
|
* Possible Return values are:
|
||||||
|
* PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC 'P'
|
||||||
|
* PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT 'O'
|
||||||
|
* PHPExcel_Calculation_Functions::RETURNDATE_EXCEL 'E'
|
||||||
|
*/
|
||||||
|
public static function getReturnDateType()
|
||||||
|
{
|
||||||
|
return self::$returnDateType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DUMMY
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #Not Yet Implemented
|
||||||
|
*/
|
||||||
|
public static function DUMMY()
|
||||||
|
{
|
||||||
|
return '#Not Yet Implemented';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DIV0
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #Not Yet Implemented
|
||||||
|
*/
|
||||||
|
public static function DIV0()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['divisionbyzero'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NA
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =NA()
|
||||||
|
*
|
||||||
|
* Returns the error value #N/A
|
||||||
|
* #N/A is the error value that means "no value is available."
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @return string #N/A!
|
||||||
|
*/
|
||||||
|
public static function NA()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['na'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NaN
|
||||||
|
*
|
||||||
|
* Returns the error value #NUM!
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #NUM!
|
||||||
|
*/
|
||||||
|
public static function NaN()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['num'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NAME
|
||||||
|
*
|
||||||
|
* Returns the error value #NAME?
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #NAME?
|
||||||
|
*/
|
||||||
|
public static function NAME()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* REF
|
||||||
|
*
|
||||||
|
* Returns the error value #REF!
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #REF!
|
||||||
|
*/
|
||||||
|
public static function REF()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['reference'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NULL
|
||||||
|
*
|
||||||
|
* Returns the error value #NULL!
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #NULL!
|
||||||
|
*/
|
||||||
|
public static function NULL()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['null'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VALUE
|
||||||
|
*
|
||||||
|
* Returns the error value #VALUE!
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Error Returns
|
||||||
|
* @return string #VALUE!
|
||||||
|
*/
|
||||||
|
public static function VALUE()
|
||||||
|
{
|
||||||
|
return self::$errorCodes['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function isMatrixValue($idx)
|
||||||
|
{
|
||||||
|
return ((substr_count($idx, '.') <= 1) || (preg_match('/\.[A-Z]/', $idx) > 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function isValue($idx)
|
||||||
|
{
|
||||||
|
return (substr_count($idx, '.') == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function isCellValue($idx)
|
||||||
|
{
|
||||||
|
return (substr_count($idx, '.') > 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function ifCondition($condition)
|
||||||
|
{
|
||||||
|
$condition = PHPExcel_Calculation_Functions::flattenSingleValue($condition);
|
||||||
|
if (!isset($condition{0})) {
|
||||||
|
$condition = '=""';
|
||||||
|
}
|
||||||
|
if (!in_array($condition{0}, array('>', '<', '='))) {
|
||||||
|
if (!is_numeric($condition)) {
|
||||||
|
$condition = PHPExcel_Calculation::wrapResult(strtoupper($condition));
|
||||||
|
}
|
||||||
|
return '=' . $condition;
|
||||||
|
} else {
|
||||||
|
preg_match('/([<>=]+)(.*)/', $condition, $matches);
|
||||||
|
list(, $operator, $operand) = $matches;
|
||||||
|
|
||||||
|
if (!is_numeric($operand)) {
|
||||||
|
$operand = str_replace('"', '""', $operand);
|
||||||
|
$operand = PHPExcel_Calculation::wrapResult(strtoupper($operand));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $operator.$operand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ERROR_TYPE
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function ERROR_TYPE($value = '')
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
$i = 1;
|
||||||
|
foreach (self::$errorCodes as $errorCode) {
|
||||||
|
if ($value === $errorCode) {
|
||||||
|
return $i;
|
||||||
|
}
|
||||||
|
++$i;
|
||||||
|
}
|
||||||
|
return self::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_BLANK
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_BLANK($value = null)
|
||||||
|
{
|
||||||
|
if (!is_null($value)) {
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_null($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_ERR
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_ERR($value = '')
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
return self::IS_ERROR($value) && (!self::IS_NA($value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_ERROR
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_ERROR($value = '')
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if (!is_string($value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return in_array($value, array_values(self::$errorCodes));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_NA
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_NA($value = '')
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
return ($value === self::NA());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_EVEN
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_EVEN($value = null)
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if ($value === null) {
|
||||||
|
return self::NAME();
|
||||||
|
} elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) {
|
||||||
|
return self::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($value % 2 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_ODD
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_ODD($value = null)
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if ($value === null) {
|
||||||
|
return self::NAME();
|
||||||
|
} elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) {
|
||||||
|
return self::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (abs($value) % 2 == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_NUMBER
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_NUMBER($value = null)
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if (is_string($value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return is_numeric($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_LOGICAL
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_LOGICAL($value = null)
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
return is_bool($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_TEXT
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_TEXT($value = null)
|
||||||
|
{
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
return (is_string($value) && !self::IS_ERROR($value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IS_NONTEXT
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function IS_NONTEXT($value = null)
|
||||||
|
{
|
||||||
|
return !self::IS_TEXT($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VERSION
|
||||||
|
*
|
||||||
|
* @return string Version information
|
||||||
|
*/
|
||||||
|
public static function VERSION()
|
||||||
|
{
|
||||||
|
return 'PHPExcel ##VERSION##, ##DATE##';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* N
|
||||||
|
*
|
||||||
|
* Returns a value converted to a number
|
||||||
|
*
|
||||||
|
* @param value The value you want converted
|
||||||
|
* @return number N converts values listed in the following table
|
||||||
|
* If value is or refers to N returns
|
||||||
|
* A number That number
|
||||||
|
* A date The serial number of that date
|
||||||
|
* TRUE 1
|
||||||
|
* FALSE 0
|
||||||
|
* An error value The error value
|
||||||
|
* Anything else 0
|
||||||
|
*/
|
||||||
|
public static function N($value = null)
|
||||||
|
{
|
||||||
|
while (is_array($value)) {
|
||||||
|
$value = array_shift($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (gettype($value)) {
|
||||||
|
case 'double':
|
||||||
|
case 'float':
|
||||||
|
case 'integer':
|
||||||
|
return $value;
|
||||||
|
case 'boolean':
|
||||||
|
return (integer) $value;
|
||||||
|
case 'string':
|
||||||
|
// Errors
|
||||||
|
if ((strlen($value) > 0) && ($value{0} == '#')) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TYPE
|
||||||
|
*
|
||||||
|
* Returns a number that identifies the type of a value
|
||||||
|
*
|
||||||
|
* @param value The value you want tested
|
||||||
|
* @return number N converts values listed in the following table
|
||||||
|
* If value is or refers to N returns
|
||||||
|
* A number 1
|
||||||
|
* Text 2
|
||||||
|
* Logical Value 4
|
||||||
|
* An error value 16
|
||||||
|
* Array or Matrix 64
|
||||||
|
*/
|
||||||
|
public static function TYPE($value = null)
|
||||||
|
{
|
||||||
|
$value = self::flattenArrayIndexed($value);
|
||||||
|
if (is_array($value) && (count($value) > 1)) {
|
||||||
|
end($value);
|
||||||
|
$a = key($value);
|
||||||
|
// Range of cells is an error
|
||||||
|
if (self::isCellValue($a)) {
|
||||||
|
return 16;
|
||||||
|
// Test for Matrix
|
||||||
|
} elseif (self::isMatrixValue($a)) {
|
||||||
|
return 64;
|
||||||
|
}
|
||||||
|
} elseif (empty($value)) {
|
||||||
|
// Empty Cell
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
$value = self::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if (($value === null) || (is_float($value)) || (is_int($value))) {
|
||||||
|
return 1;
|
||||||
|
} elseif (is_bool($value)) {
|
||||||
|
return 4;
|
||||||
|
} elseif (is_array($value)) {
|
||||||
|
return 64;
|
||||||
|
} elseif (is_string($value)) {
|
||||||
|
// Errors
|
||||||
|
if ((strlen($value) > 0) && ($value{0} == '#')) {
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a multi-dimensional array to a simple 1-dimensional array
|
||||||
|
*
|
||||||
|
* @param array $array Array to be flattened
|
||||||
|
* @return array Flattened array
|
||||||
|
*/
|
||||||
|
public static function flattenArray($array)
|
||||||
|
{
|
||||||
|
if (!is_array($array)) {
|
||||||
|
return (array) $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arrayValues = array();
|
||||||
|
foreach ($array as $value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
foreach ($value as $val) {
|
||||||
|
if (is_array($val)) {
|
||||||
|
foreach ($val as $v) {
|
||||||
|
$arrayValues[] = $v;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$arrayValues[] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$arrayValues[] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arrayValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing
|
||||||
|
*
|
||||||
|
* @param array $array Array to be flattened
|
||||||
|
* @return array Flattened array
|
||||||
|
*/
|
||||||
|
public static function flattenArrayIndexed($array)
|
||||||
|
{
|
||||||
|
if (!is_array($array)) {
|
||||||
|
return (array) $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arrayValues = array();
|
||||||
|
foreach ($array as $k1 => $value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
foreach ($value as $k2 => $val) {
|
||||||
|
if (is_array($val)) {
|
||||||
|
foreach ($val as $k3 => $v) {
|
||||||
|
$arrayValues[$k1.'.'.$k2.'.'.$k3] = $v;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$arrayValues[$k1.'.'.$k2] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$arrayValues[$k1] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arrayValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an array to a single scalar value by extracting the first element
|
||||||
|
*
|
||||||
|
* @param mixed $value Array or scalar value
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function flattenSingleValue($value = '')
|
||||||
|
{
|
||||||
|
while (is_array($value)) {
|
||||||
|
$value = array_pop($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// There are a few mathematical functions that aren't available on all versions of PHP for all platforms
|
||||||
|
// These functions aren't available in Windows implementations of PHP prior to version 5.3.0
|
||||||
|
// So we test if they do exist for this version of PHP/operating platform; and if not we create them
|
||||||
|
//
|
||||||
|
if (!function_exists('acosh')) {
|
||||||
|
function acosh($x)
|
||||||
|
{
|
||||||
|
return 2 * log(sqrt(($x + 1) / 2) + sqrt(($x - 1) / 2));
|
||||||
|
} // function acosh()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('asinh')) {
|
||||||
|
function asinh($x)
|
||||||
|
{
|
||||||
|
return log($x + sqrt(1 + $x * $x));
|
||||||
|
} // function asinh()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('atanh')) {
|
||||||
|
function atanh($x)
|
||||||
|
{
|
||||||
|
return (log(1 + $x) - log(1 - $x)) / 2;
|
||||||
|
} // function atanh()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Strangely, PHP doesn't have a mb_str_replace multibyte function
|
||||||
|
// As we'll only ever use this function with UTF-8 characters, we can simply "hard-code" the character set
|
||||||
|
//
|
||||||
|
if ((!function_exists('mb_str_replace')) &&
|
||||||
|
(function_exists('mb_substr')) && (function_exists('mb_strlen')) && (function_exists('mb_strpos'))) {
|
||||||
|
function mb_str_replace($search, $replace, $subject)
|
||||||
|
{
|
||||||
|
if (is_array($subject)) {
|
||||||
|
$ret = array();
|
||||||
|
foreach ($subject as $key => $val) {
|
||||||
|
$ret[$key] = mb_str_replace($search, $replace, $val);
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ((array) $search as $key => $s) {
|
||||||
|
if ($s == '' && $s !== 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : '');
|
||||||
|
$pos = mb_strpos($subject, $s, 0, 'UTF-8');
|
||||||
|
while ($pos !== false) {
|
||||||
|
$subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8');
|
||||||
|
$pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $subject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,285 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_Logical
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_Logical
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* TRUE
|
||||||
|
*
|
||||||
|
* Returns the boolean TRUE.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =TRUE()
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @return boolean True
|
||||||
|
*/
|
||||||
|
public static function TRUE()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FALSE
|
||||||
|
*
|
||||||
|
* Returns the boolean FALSE.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =FALSE()
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @return boolean False
|
||||||
|
*/
|
||||||
|
public static function FALSE()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LOGICAL_AND
|
||||||
|
*
|
||||||
|
* Returns boolean TRUE if all its arguments are TRUE; returns FALSE if one or more argument is FALSE.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =AND(logical1[,logical2[, ...]])
|
||||||
|
*
|
||||||
|
* The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays
|
||||||
|
* or references that contain logical values.
|
||||||
|
*
|
||||||
|
* Boolean arguments are treated as True or False as appropriate
|
||||||
|
* Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False
|
||||||
|
* If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds
|
||||||
|
* the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @param mixed $arg,... Data values
|
||||||
|
* @return boolean The logical AND of the arguments.
|
||||||
|
*/
|
||||||
|
public static function LOGICAL_AND()
|
||||||
|
{
|
||||||
|
// Return value
|
||||||
|
$returnValue = true;
|
||||||
|
|
||||||
|
// Loop through the arguments
|
||||||
|
$aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
|
||||||
|
$argCount = -1;
|
||||||
|
foreach ($aArgs as $argCount => $arg) {
|
||||||
|
// Is it a boolean value?
|
||||||
|
if (is_bool($arg)) {
|
||||||
|
$returnValue = $returnValue && $arg;
|
||||||
|
} elseif ((is_numeric($arg)) && (!is_string($arg))) {
|
||||||
|
$returnValue = $returnValue && ($arg != 0);
|
||||||
|
} elseif (is_string($arg)) {
|
||||||
|
$arg = strtoupper($arg);
|
||||||
|
if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) {
|
||||||
|
$arg = true;
|
||||||
|
} elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) {
|
||||||
|
$arg = false;
|
||||||
|
} else {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
$returnValue = $returnValue && ($arg != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
if ($argCount < 0) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
return $returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LOGICAL_OR
|
||||||
|
*
|
||||||
|
* Returns boolean TRUE if any argument is TRUE; returns FALSE if all arguments are FALSE.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =OR(logical1[,logical2[, ...]])
|
||||||
|
*
|
||||||
|
* The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays
|
||||||
|
* or references that contain logical values.
|
||||||
|
*
|
||||||
|
* Boolean arguments are treated as True or False as appropriate
|
||||||
|
* Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False
|
||||||
|
* If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds
|
||||||
|
* the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @param mixed $arg,... Data values
|
||||||
|
* @return boolean The logical OR of the arguments.
|
||||||
|
*/
|
||||||
|
public static function LOGICAL_OR()
|
||||||
|
{
|
||||||
|
// Return value
|
||||||
|
$returnValue = false;
|
||||||
|
|
||||||
|
// Loop through the arguments
|
||||||
|
$aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
|
||||||
|
$argCount = -1;
|
||||||
|
foreach ($aArgs as $argCount => $arg) {
|
||||||
|
// Is it a boolean value?
|
||||||
|
if (is_bool($arg)) {
|
||||||
|
$returnValue = $returnValue || $arg;
|
||||||
|
} elseif ((is_numeric($arg)) && (!is_string($arg))) {
|
||||||
|
$returnValue = $returnValue || ($arg != 0);
|
||||||
|
} elseif (is_string($arg)) {
|
||||||
|
$arg = strtoupper($arg);
|
||||||
|
if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) {
|
||||||
|
$arg = true;
|
||||||
|
} elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) {
|
||||||
|
$arg = false;
|
||||||
|
} else {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
$returnValue = $returnValue || ($arg != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
if ($argCount < 0) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
return $returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOT
|
||||||
|
*
|
||||||
|
* Returns the boolean inverse of the argument.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =NOT(logical)
|
||||||
|
*
|
||||||
|
* The argument must evaluate to a logical value such as TRUE or FALSE
|
||||||
|
*
|
||||||
|
* Boolean arguments are treated as True or False as appropriate
|
||||||
|
* Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False
|
||||||
|
* If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds
|
||||||
|
* the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE
|
||||||
|
* @return boolean The boolean inverse of the argument.
|
||||||
|
*/
|
||||||
|
public static function NOT($logical = false)
|
||||||
|
{
|
||||||
|
$logical = PHPExcel_Calculation_Functions::flattenSingleValue($logical);
|
||||||
|
if (is_string($logical)) {
|
||||||
|
$logical = strtoupper($logical);
|
||||||
|
if (($logical == 'TRUE') || ($logical == PHPExcel_Calculation::getTRUE())) {
|
||||||
|
return false;
|
||||||
|
} elseif (($logical == 'FALSE') || ($logical == PHPExcel_Calculation::getFALSE())) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !$logical;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* STATEMENT_IF
|
||||||
|
*
|
||||||
|
* Returns one value if a condition you specify evaluates to TRUE and another value if it evaluates to FALSE.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =IF(condition[,returnIfTrue[,returnIfFalse]])
|
||||||
|
*
|
||||||
|
* Condition is any value or expression that can be evaluated to TRUE or FALSE.
|
||||||
|
* For example, A10=100 is a logical expression; if the value in cell A10 is equal to 100,
|
||||||
|
* the expression evaluates to TRUE. Otherwise, the expression evaluates to FALSE.
|
||||||
|
* This argument can use any comparison calculation operator.
|
||||||
|
* ReturnIfTrue is the value that is returned if condition evaluates to TRUE.
|
||||||
|
* For example, if this argument is the text string "Within budget" and the condition argument evaluates to TRUE,
|
||||||
|
* then the IF function returns the text "Within budget"
|
||||||
|
* If condition is TRUE and ReturnIfTrue is blank, this argument returns 0 (zero). To display the word TRUE, use
|
||||||
|
* the logical value TRUE for this argument.
|
||||||
|
* ReturnIfTrue can be another formula.
|
||||||
|
* ReturnIfFalse is the value that is returned if condition evaluates to FALSE.
|
||||||
|
* For example, if this argument is the text string "Over budget" and the condition argument evaluates to FALSE,
|
||||||
|
* then the IF function returns the text "Over budget".
|
||||||
|
* If condition is FALSE and ReturnIfFalse is omitted, then the logical value FALSE is returned.
|
||||||
|
* If condition is FALSE and ReturnIfFalse is blank, then the value 0 (zero) is returned.
|
||||||
|
* ReturnIfFalse can be another formula.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @param mixed $condition Condition to evaluate
|
||||||
|
* @param mixed $returnIfTrue Value to return when condition is true
|
||||||
|
* @param mixed $returnIfFalse Optional value to return when condition is false
|
||||||
|
* @return mixed The value of returnIfTrue or returnIfFalse determined by condition
|
||||||
|
*/
|
||||||
|
public static function STATEMENT_IF($condition = true, $returnIfTrue = 0, $returnIfFalse = false)
|
||||||
|
{
|
||||||
|
$condition = (is_null($condition)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($condition);
|
||||||
|
$returnIfTrue = (is_null($returnIfTrue)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfTrue);
|
||||||
|
$returnIfFalse = (is_null($returnIfFalse)) ? false : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfFalse);
|
||||||
|
|
||||||
|
return ($condition) ? $returnIfTrue : $returnIfFalse;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IFERROR
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =IFERROR(testValue,errorpart)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @param mixed $testValue Value to check, is also the value returned when no error
|
||||||
|
* @param mixed $errorpart Value to return when testValue is an error condition
|
||||||
|
* @return mixed The value of errorpart or testValue determined by error condition
|
||||||
|
*/
|
||||||
|
public static function IFERROR($testValue = '', $errorpart = '')
|
||||||
|
{
|
||||||
|
$testValue = (is_null($testValue)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($testValue);
|
||||||
|
$errorpart = (is_null($errorpart)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($errorpart);
|
||||||
|
|
||||||
|
return self::STATEMENT_IF(PHPExcel_Calculation_Functions::IS_ERROR($testValue), $errorpart, $testValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,878 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_LookupRef
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_LookupRef
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* CELL_ADDRESS
|
||||||
|
*
|
||||||
|
* Creates a cell address as text, given specified row and column numbers.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =ADDRESS(row, column, [relativity], [referenceStyle], [sheetText])
|
||||||
|
*
|
||||||
|
* @param row Row number to use in the cell reference
|
||||||
|
* @param column Column number to use in the cell reference
|
||||||
|
* @param relativity Flag indicating the type of reference to return
|
||||||
|
* 1 or omitted Absolute
|
||||||
|
* 2 Absolute row; relative column
|
||||||
|
* 3 Relative row; absolute column
|
||||||
|
* 4 Relative
|
||||||
|
* @param referenceStyle A logical value that specifies the A1 or R1C1 reference style.
|
||||||
|
* TRUE or omitted CELL_ADDRESS returns an A1-style reference
|
||||||
|
* FALSE CELL_ADDRESS returns an R1C1-style reference
|
||||||
|
* @param sheetText Optional Name of worksheet to use
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function CELL_ADDRESS($row, $column, $relativity = 1, $referenceStyle = true, $sheetText = '')
|
||||||
|
{
|
||||||
|
$row = PHPExcel_Calculation_Functions::flattenSingleValue($row);
|
||||||
|
$column = PHPExcel_Calculation_Functions::flattenSingleValue($column);
|
||||||
|
$relativity = PHPExcel_Calculation_Functions::flattenSingleValue($relativity);
|
||||||
|
$sheetText = PHPExcel_Calculation_Functions::flattenSingleValue($sheetText);
|
||||||
|
|
||||||
|
if (($row < 1) || ($column < 1)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sheetText > '') {
|
||||||
|
if (strpos($sheetText, ' ') !== false) {
|
||||||
|
$sheetText = "'".$sheetText."'";
|
||||||
|
}
|
||||||
|
$sheetText .='!';
|
||||||
|
}
|
||||||
|
if ((!is_bool($referenceStyle)) || $referenceStyle) {
|
||||||
|
$rowRelative = $columnRelative = '$';
|
||||||
|
$column = PHPExcel_Cell::stringFromColumnIndex($column-1);
|
||||||
|
if (($relativity == 2) || ($relativity == 4)) {
|
||||||
|
$columnRelative = '';
|
||||||
|
}
|
||||||
|
if (($relativity == 3) || ($relativity == 4)) {
|
||||||
|
$rowRelative = '';
|
||||||
|
}
|
||||||
|
return $sheetText.$columnRelative.$column.$rowRelative.$row;
|
||||||
|
} else {
|
||||||
|
if (($relativity == 2) || ($relativity == 4)) {
|
||||||
|
$column = '['.$column.']';
|
||||||
|
}
|
||||||
|
if (($relativity == 3) || ($relativity == 4)) {
|
||||||
|
$row = '['.$row.']';
|
||||||
|
}
|
||||||
|
return $sheetText.'R'.$row.'C'.$column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* COLUMN
|
||||||
|
*
|
||||||
|
* Returns the column number of the given cell reference
|
||||||
|
* If the cell reference is a range of cells, COLUMN returns the column numbers of each column in the reference as a horizontal array.
|
||||||
|
* If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the
|
||||||
|
* reference of the cell in which the COLUMN function appears; otherwise this function returns 0.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =COLUMN([cellAddress])
|
||||||
|
*
|
||||||
|
* @param cellAddress A reference to a range of cells for which you want the column numbers
|
||||||
|
* @return integer or array of integer
|
||||||
|
*/
|
||||||
|
public static function COLUMN($cellAddress = null)
|
||||||
|
{
|
||||||
|
if (is_null($cellAddress) || trim($cellAddress) === '') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($cellAddress)) {
|
||||||
|
foreach ($cellAddress as $columnKey => $value) {
|
||||||
|
$columnKey = preg_replace('/[^a-z]/i', '', $columnKey);
|
||||||
|
return (integer) PHPExcel_Cell::columnIndexFromString($columnKey);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strpos($cellAddress, '!') !== false) {
|
||||||
|
list($sheet, $cellAddress) = explode('!', $cellAddress);
|
||||||
|
}
|
||||||
|
if (strpos($cellAddress, ':') !== false) {
|
||||||
|
list($startAddress, $endAddress) = explode(':', $cellAddress);
|
||||||
|
$startAddress = preg_replace('/[^a-z]/i', '', $startAddress);
|
||||||
|
$endAddress = preg_replace('/[^a-z]/i', '', $endAddress);
|
||||||
|
$returnValue = array();
|
||||||
|
do {
|
||||||
|
$returnValue[] = (integer) PHPExcel_Cell::columnIndexFromString($startAddress);
|
||||||
|
} while ($startAddress++ != $endAddress);
|
||||||
|
return $returnValue;
|
||||||
|
} else {
|
||||||
|
$cellAddress = preg_replace('/[^a-z]/i', '', $cellAddress);
|
||||||
|
return (integer) PHPExcel_Cell::columnIndexFromString($cellAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* COLUMNS
|
||||||
|
*
|
||||||
|
* Returns the number of columns in an array or reference.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =COLUMNS(cellAddress)
|
||||||
|
*
|
||||||
|
* @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of columns
|
||||||
|
* @return integer The number of columns in cellAddress
|
||||||
|
*/
|
||||||
|
public static function COLUMNS($cellAddress = null)
|
||||||
|
{
|
||||||
|
if (is_null($cellAddress) || $cellAddress === '') {
|
||||||
|
return 1;
|
||||||
|
} elseif (!is_array($cellAddress)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
reset($cellAddress);
|
||||||
|
$isMatrix = (is_numeric(key($cellAddress)));
|
||||||
|
list($columns, $rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress);
|
||||||
|
|
||||||
|
if ($isMatrix) {
|
||||||
|
return $rows;
|
||||||
|
} else {
|
||||||
|
return $columns;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ROW
|
||||||
|
*
|
||||||
|
* Returns the row number of the given cell reference
|
||||||
|
* If the cell reference is a range of cells, ROW returns the row numbers of each row in the reference as a vertical array.
|
||||||
|
* If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the
|
||||||
|
* reference of the cell in which the ROW function appears; otherwise this function returns 0.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =ROW([cellAddress])
|
||||||
|
*
|
||||||
|
* @param cellAddress A reference to a range of cells for which you want the row numbers
|
||||||
|
* @return integer or array of integer
|
||||||
|
*/
|
||||||
|
public static function ROW($cellAddress = null)
|
||||||
|
{
|
||||||
|
if (is_null($cellAddress) || trim($cellAddress) === '') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($cellAddress)) {
|
||||||
|
foreach ($cellAddress as $columnKey => $rowValue) {
|
||||||
|
foreach ($rowValue as $rowKey => $cellValue) {
|
||||||
|
return (integer) preg_replace('/[^0-9]/i', '', $rowKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strpos($cellAddress, '!') !== false) {
|
||||||
|
list($sheet, $cellAddress) = explode('!', $cellAddress);
|
||||||
|
}
|
||||||
|
if (strpos($cellAddress, ':') !== false) {
|
||||||
|
list($startAddress, $endAddress) = explode(':', $cellAddress);
|
||||||
|
$startAddress = preg_replace('/[^0-9]/', '', $startAddress);
|
||||||
|
$endAddress = preg_replace('/[^0-9]/', '', $endAddress);
|
||||||
|
$returnValue = array();
|
||||||
|
do {
|
||||||
|
$returnValue[][] = (integer) $startAddress;
|
||||||
|
} while ($startAddress++ != $endAddress);
|
||||||
|
return $returnValue;
|
||||||
|
} else {
|
||||||
|
list($cellAddress) = explode(':', $cellAddress);
|
||||||
|
return (integer) preg_replace('/[^0-9]/', '', $cellAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ROWS
|
||||||
|
*
|
||||||
|
* Returns the number of rows in an array or reference.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =ROWS(cellAddress)
|
||||||
|
*
|
||||||
|
* @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of rows
|
||||||
|
* @return integer The number of rows in cellAddress
|
||||||
|
*/
|
||||||
|
public static function ROWS($cellAddress = null)
|
||||||
|
{
|
||||||
|
if (is_null($cellAddress) || $cellAddress === '') {
|
||||||
|
return 1;
|
||||||
|
} elseif (!is_array($cellAddress)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
reset($cellAddress);
|
||||||
|
$isMatrix = (is_numeric(key($cellAddress)));
|
||||||
|
list($columns, $rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress);
|
||||||
|
|
||||||
|
if ($isMatrix) {
|
||||||
|
return $columns;
|
||||||
|
} else {
|
||||||
|
return $rows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HYPERLINK
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =HYPERLINK(linkURL,displayName)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @category Logical Functions
|
||||||
|
* @param string $linkURL Value to check, is also the value returned when no error
|
||||||
|
* @param string $displayName Value to return when testValue is an error condition
|
||||||
|
* @param PHPExcel_Cell $pCell The cell to set the hyperlink in
|
||||||
|
* @return mixed The value of $displayName (or $linkURL if $displayName was blank)
|
||||||
|
*/
|
||||||
|
public static function HYPERLINK($linkURL = '', $displayName = null, PHPExcel_Cell $pCell = null)
|
||||||
|
{
|
||||||
|
$args = func_get_args();
|
||||||
|
$pCell = array_pop($args);
|
||||||
|
|
||||||
|
$linkURL = (is_null($linkURL)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($linkURL);
|
||||||
|
$displayName = (is_null($displayName)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($displayName);
|
||||||
|
|
||||||
|
if ((!is_object($pCell)) || (trim($linkURL) == '')) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((is_object($displayName)) || trim($displayName) == '') {
|
||||||
|
$displayName = $linkURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pCell->getHyperlink()->setUrl($linkURL);
|
||||||
|
|
||||||
|
return $displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* INDIRECT
|
||||||
|
*
|
||||||
|
* Returns the reference specified by a text string.
|
||||||
|
* References are immediately evaluated to display their contents.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =INDIRECT(cellAddress)
|
||||||
|
*
|
||||||
|
* NOTE - INDIRECT() does not yet support the optional a1 parameter introduced in Excel 2010
|
||||||
|
*
|
||||||
|
* @param cellAddress $cellAddress The cell address of the current cell (containing this formula)
|
||||||
|
* @param PHPExcel_Cell $pCell The current cell (containing this formula)
|
||||||
|
* @return mixed The cells referenced by cellAddress
|
||||||
|
*
|
||||||
|
* @todo Support for the optional a1 parameter introduced in Excel 2010
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function INDIRECT($cellAddress = null, PHPExcel_Cell $pCell = null)
|
||||||
|
{
|
||||||
|
$cellAddress = PHPExcel_Calculation_Functions::flattenSingleValue($cellAddress);
|
||||||
|
if (is_null($cellAddress) || $cellAddress === '') {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
|
||||||
|
$cellAddress1 = $cellAddress;
|
||||||
|
$cellAddress2 = null;
|
||||||
|
if (strpos($cellAddress, ':') !== false) {
|
||||||
|
list($cellAddress1, $cellAddress2) = explode(':', $cellAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress1, $matches)) ||
|
||||||
|
((!is_null($cellAddress2)) && (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress2, $matches)))) {
|
||||||
|
if (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $cellAddress1, $matches)) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($cellAddress, '!') !== false) {
|
||||||
|
list($sheetName, $cellAddress) = explode('!', $cellAddress);
|
||||||
|
$sheetName = trim($sheetName, "'");
|
||||||
|
$pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);
|
||||||
|
} else {
|
||||||
|
$pSheet = $pCell->getWorksheet();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Calculation::getInstance()->extractNamedRange($cellAddress, $pSheet, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($cellAddress, '!') !== false) {
|
||||||
|
list($sheetName, $cellAddress) = explode('!', $cellAddress);
|
||||||
|
$sheetName = trim($sheetName, "'");
|
||||||
|
$pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);
|
||||||
|
} else {
|
||||||
|
$pSheet = $pCell->getWorksheet();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OFFSET
|
||||||
|
*
|
||||||
|
* Returns a reference to a range that is a specified number of rows and columns from a cell or range of cells.
|
||||||
|
* The reference that is returned can be a single cell or a range of cells. You can specify the number of rows and
|
||||||
|
* the number of columns to be returned.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =OFFSET(cellAddress, rows, cols, [height], [width])
|
||||||
|
*
|
||||||
|
* @param cellAddress The reference from which you want to base the offset. Reference must refer to a cell or
|
||||||
|
* range of adjacent cells; otherwise, OFFSET returns the #VALUE! error value.
|
||||||
|
* @param rows The number of rows, up or down, that you want the upper-left cell to refer to.
|
||||||
|
* Using 5 as the rows argument specifies that the upper-left cell in the reference is
|
||||||
|
* five rows below reference. Rows can be positive (which means below the starting reference)
|
||||||
|
* or negative (which means above the starting reference).
|
||||||
|
* @param cols The number of columns, to the left or right, that you want the upper-left cell of the result
|
||||||
|
* to refer to. Using 5 as the cols argument specifies that the upper-left cell in the
|
||||||
|
* reference is five columns to the right of reference. Cols can be positive (which means
|
||||||
|
* to the right of the starting reference) or negative (which means to the left of the
|
||||||
|
* starting reference).
|
||||||
|
* @param height The height, in number of rows, that you want the returned reference to be. Height must be a positive number.
|
||||||
|
* @param width The width, in number of columns, that you want the returned reference to be. Width must be a positive number.
|
||||||
|
* @return string A reference to a cell or range of cells
|
||||||
|
*/
|
||||||
|
public static function OFFSET($cellAddress = null, $rows = 0, $columns = 0, $height = null, $width = null)
|
||||||
|
{
|
||||||
|
$rows = PHPExcel_Calculation_Functions::flattenSingleValue($rows);
|
||||||
|
$columns = PHPExcel_Calculation_Functions::flattenSingleValue($columns);
|
||||||
|
$height = PHPExcel_Calculation_Functions::flattenSingleValue($height);
|
||||||
|
$width = PHPExcel_Calculation_Functions::flattenSingleValue($width);
|
||||||
|
if ($cellAddress == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$args = func_get_args();
|
||||||
|
$pCell = array_pop($args);
|
||||||
|
if (!is_object($pCell)) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
|
||||||
|
$sheetName = null;
|
||||||
|
if (strpos($cellAddress, "!")) {
|
||||||
|
list($sheetName, $cellAddress) = explode("!", $cellAddress);
|
||||||
|
$sheetName = trim($sheetName, "'");
|
||||||
|
}
|
||||||
|
if (strpos($cellAddress, ":")) {
|
||||||
|
list($startCell, $endCell) = explode(":", $cellAddress);
|
||||||
|
} else {
|
||||||
|
$startCell = $endCell = $cellAddress;
|
||||||
|
}
|
||||||
|
list($startCellColumn, $startCellRow) = PHPExcel_Cell::coordinateFromString($startCell);
|
||||||
|
list($endCellColumn, $endCellRow) = PHPExcel_Cell::coordinateFromString($endCell);
|
||||||
|
|
||||||
|
$startCellRow += $rows;
|
||||||
|
$startCellColumn = PHPExcel_Cell::columnIndexFromString($startCellColumn) - 1;
|
||||||
|
$startCellColumn += $columns;
|
||||||
|
|
||||||
|
if (($startCellRow <= 0) || ($startCellColumn < 0)) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
$endCellColumn = PHPExcel_Cell::columnIndexFromString($endCellColumn) - 1;
|
||||||
|
if (($width != null) && (!is_object($width))) {
|
||||||
|
$endCellColumn = $startCellColumn + $width - 1;
|
||||||
|
} else {
|
||||||
|
$endCellColumn += $columns;
|
||||||
|
}
|
||||||
|
$startCellColumn = PHPExcel_Cell::stringFromColumnIndex($startCellColumn);
|
||||||
|
|
||||||
|
if (($height != null) && (!is_object($height))) {
|
||||||
|
$endCellRow = $startCellRow + $height - 1;
|
||||||
|
} else {
|
||||||
|
$endCellRow += $rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($endCellRow <= 0) || ($endCellColumn < 0)) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
$endCellColumn = PHPExcel_Cell::stringFromColumnIndex($endCellColumn);
|
||||||
|
|
||||||
|
$cellAddress = $startCellColumn.$startCellRow;
|
||||||
|
if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) {
|
||||||
|
$cellAddress .= ':'.$endCellColumn.$endCellRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sheetName !== null) {
|
||||||
|
$pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);
|
||||||
|
} else {
|
||||||
|
$pSheet = $pCell->getWorksheet();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CHOOSE
|
||||||
|
*
|
||||||
|
* Uses lookup_value to return a value from the list of value arguments.
|
||||||
|
* Use CHOOSE to select one of up to 254 values based on the lookup_value.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =CHOOSE(index_num, value1, [value2], ...)
|
||||||
|
*
|
||||||
|
* @param index_num Specifies which value argument is selected.
|
||||||
|
* Index_num must be a number between 1 and 254, or a formula or reference to a cell containing a number
|
||||||
|
* between 1 and 254.
|
||||||
|
* @param value1... Value1 is required, subsequent values are optional.
|
||||||
|
* Between 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on
|
||||||
|
* index_num. The arguments can be numbers, cell references, defined names, formulas, functions, or
|
||||||
|
* text.
|
||||||
|
* @return mixed The selected value
|
||||||
|
*/
|
||||||
|
public static function CHOOSE()
|
||||||
|
{
|
||||||
|
$chooseArgs = func_get_args();
|
||||||
|
$chosenEntry = PHPExcel_Calculation_Functions::flattenArray(array_shift($chooseArgs));
|
||||||
|
$entryCount = count($chooseArgs) - 1;
|
||||||
|
|
||||||
|
if (is_array($chosenEntry)) {
|
||||||
|
$chosenEntry = array_shift($chosenEntry);
|
||||||
|
}
|
||||||
|
if ((is_numeric($chosenEntry)) && (!is_bool($chosenEntry))) {
|
||||||
|
--$chosenEntry;
|
||||||
|
} else {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
$chosenEntry = floor($chosenEntry);
|
||||||
|
if (($chosenEntry < 0) || ($chosenEntry > $entryCount)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($chooseArgs[$chosenEntry])) {
|
||||||
|
return PHPExcel_Calculation_Functions::flattenArray($chooseArgs[$chosenEntry]);
|
||||||
|
} else {
|
||||||
|
return $chooseArgs[$chosenEntry];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MATCH
|
||||||
|
*
|
||||||
|
* The MATCH function searches for a specified item in a range of cells
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =MATCH(lookup_value, lookup_array, [match_type])
|
||||||
|
*
|
||||||
|
* @param lookup_value The value that you want to match in lookup_array
|
||||||
|
* @param lookup_array 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.
|
||||||
|
* @return integer The relative position of the found item
|
||||||
|
*/
|
||||||
|
public static function MATCH($lookup_value, $lookup_array, $match_type = 1)
|
||||||
|
{
|
||||||
|
$lookup_array = PHPExcel_Calculation_Functions::flattenArray($lookup_array);
|
||||||
|
$lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);
|
||||||
|
$match_type = (is_null($match_type)) ? 1 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($match_type);
|
||||||
|
// MATCH is not case sensitive
|
||||||
|
$lookup_value = strtolower($lookup_value);
|
||||||
|
|
||||||
|
// lookup_value type has to be number, text, or logical values
|
||||||
|
if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) {
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
// match_type is 0, 1 or -1
|
||||||
|
if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) {
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
// lookup_array should not be empty
|
||||||
|
$lookupArraySize = count($lookup_array);
|
||||||
|
if ($lookupArraySize <= 0) {
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
// lookup_array should contain only number, text, or logical values, or empty (null) cells
|
||||||
|
foreach ($lookup_array as $i => $lookupArrayValue) {
|
||||||
|
// check the type of the value
|
||||||
|
if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) &&
|
||||||
|
(!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) {
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
// convert strings to lowercase for case-insensitive testing
|
||||||
|
if (is_string($lookupArrayValue)) {
|
||||||
|
$lookup_array[$i] = strtolower($lookupArrayValue);
|
||||||
|
}
|
||||||
|
if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) {
|
||||||
|
$lookup_array = array_slice($lookup_array, 0, $i-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if match_type is 1 or -1, the list has to be ordered
|
||||||
|
if ($match_type == 1) {
|
||||||
|
asort($lookup_array);
|
||||||
|
$keySet = array_keys($lookup_array);
|
||||||
|
} elseif ($match_type == -1) {
|
||||||
|
arsort($lookup_array);
|
||||||
|
$keySet = array_keys($lookup_array);
|
||||||
|
}
|
||||||
|
|
||||||
|
// **
|
||||||
|
// find the match
|
||||||
|
// **
|
||||||
|
foreach ($lookup_array as $i => $lookupArrayValue) {
|
||||||
|
if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) {
|
||||||
|
// exact match
|
||||||
|
return ++$i;
|
||||||
|
} elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) {
|
||||||
|
$i = array_search($i, $keySet);
|
||||||
|
// if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value
|
||||||
|
if ($i < 1) {
|
||||||
|
// 1st cell was already smaller than the lookup_value
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// the previous cell was the match
|
||||||
|
return $keySet[$i-1]+1;
|
||||||
|
}
|
||||||
|
} elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) {
|
||||||
|
$i = array_search($i, $keySet);
|
||||||
|
// if match_type is 1 <=> find the largest value that is less than or equal to lookup_value
|
||||||
|
if ($i < 1) {
|
||||||
|
// 1st cell was already bigger than the lookup_value
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// the previous cell was the match
|
||||||
|
return $keySet[$i-1]+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// unsuccessful in finding a match, return #N/A error value
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* INDEX
|
||||||
|
*
|
||||||
|
* Uses an index to choose a value from a reference or array
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* =INDEX(range_array, row_num, [column_num])
|
||||||
|
*
|
||||||
|
* @param range_array A range of cells or an array constant
|
||||||
|
* @param row_num The row in array from which to return a value. If row_num is omitted, column_num is required.
|
||||||
|
* @param column_num The column in array from which to return a value. If column_num is omitted, row_num is required.
|
||||||
|
* @return mixed the value of a specified cell or array of cells
|
||||||
|
*/
|
||||||
|
public static function INDEX($arrayValues, $rowNum = 0, $columnNum = 0)
|
||||||
|
{
|
||||||
|
if (($rowNum < 0) || ($columnNum < 0)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_array($arrayValues)) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
}
|
||||||
|
|
||||||
|
$rowKeys = array_keys($arrayValues);
|
||||||
|
$columnKeys = @array_keys($arrayValues[$rowKeys[0]]);
|
||||||
|
|
||||||
|
if ($columnNum > count($columnKeys)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
} elseif ($columnNum == 0) {
|
||||||
|
if ($rowNum == 0) {
|
||||||
|
return $arrayValues;
|
||||||
|
}
|
||||||
|
$rowNum = $rowKeys[--$rowNum];
|
||||||
|
$returnArray = array();
|
||||||
|
foreach ($arrayValues as $arrayColumn) {
|
||||||
|
if (is_array($arrayColumn)) {
|
||||||
|
if (isset($arrayColumn[$rowNum])) {
|
||||||
|
$returnArray[] = $arrayColumn[$rowNum];
|
||||||
|
} else {
|
||||||
|
return $arrayValues[$rowNum];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return $arrayValues[$rowNum];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $returnArray;
|
||||||
|
}
|
||||||
|
$columnNum = $columnKeys[--$columnNum];
|
||||||
|
if ($rowNum > count($rowKeys)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
} elseif ($rowNum == 0) {
|
||||||
|
return $arrayValues[$columnNum];
|
||||||
|
}
|
||||||
|
$rowNum = $rowKeys[--$rowNum];
|
||||||
|
|
||||||
|
return $arrayValues[$rowNum][$columnNum];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TRANSPOSE
|
||||||
|
*
|
||||||
|
* @param array $matrixData A matrix of values
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* Unlike the Excel TRANSPOSE function, which will only work on a single row or column, this function will transpose a full matrix.
|
||||||
|
*/
|
||||||
|
public static function TRANSPOSE($matrixData)
|
||||||
|
{
|
||||||
|
$returnMatrix = array();
|
||||||
|
if (!is_array($matrixData)) {
|
||||||
|
$matrixData = array(array($matrixData));
|
||||||
|
}
|
||||||
|
|
||||||
|
$column = 0;
|
||||||
|
foreach ($matrixData as $matrixRow) {
|
||||||
|
$row = 0;
|
||||||
|
foreach ($matrixRow as $matrixCell) {
|
||||||
|
$returnMatrix[$row][$column] = $matrixCell;
|
||||||
|
++$row;
|
||||||
|
}
|
||||||
|
++$column;
|
||||||
|
}
|
||||||
|
return $returnMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static function vlookupSort($a, $b)
|
||||||
|
{
|
||||||
|
reset($a);
|
||||||
|
$firstColumn = key($a);
|
||||||
|
if (($aLower = strtolower($a[$firstColumn])) == ($bLower = strtolower($b[$firstColumn]))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ($aLower < $bLower) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VLOOKUP
|
||||||
|
* The VLOOKUP function searches for value in the left-most column of lookup_array and returns the value in the same row based on the index_number.
|
||||||
|
* @param lookup_value The value that you want to match in lookup_array
|
||||||
|
* @param lookup_array The range of cells being searched
|
||||||
|
* @param index_number The column number in table_array from which the matching value must be returned. The first column is 1.
|
||||||
|
* @param not_exact_match Determines if you are looking for an exact match based on lookup_value.
|
||||||
|
* @return mixed The value of the found cell
|
||||||
|
*/
|
||||||
|
public static function VLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true)
|
||||||
|
{
|
||||||
|
$lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);
|
||||||
|
$index_number = PHPExcel_Calculation_Functions::flattenSingleValue($index_number);
|
||||||
|
$not_exact_match = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match);
|
||||||
|
|
||||||
|
// index_number must be greater than or equal to 1
|
||||||
|
if ($index_number < 1) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
// index_number must be less than or equal to the number of columns in lookup_array
|
||||||
|
if ((!is_array($lookup_array)) || (empty($lookup_array))) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
} else {
|
||||||
|
$f = array_keys($lookup_array);
|
||||||
|
$firstRow = array_pop($f);
|
||||||
|
if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
} else {
|
||||||
|
$columnKeys = array_keys($lookup_array[$firstRow]);
|
||||||
|
$returnColumn = $columnKeys[--$index_number];
|
||||||
|
$firstColumn = array_shift($columnKeys);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$not_exact_match) {
|
||||||
|
uasort($lookup_array, array('self', 'vlookupSort'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$rowNumber = $rowValue = false;
|
||||||
|
foreach ($lookup_array as $rowKey => $rowData) {
|
||||||
|
if ((is_numeric($lookup_value) && is_numeric($rowData[$firstColumn]) && ($rowData[$firstColumn] > $lookup_value)) ||
|
||||||
|
(!is_numeric($lookup_value) && !is_numeric($rowData[$firstColumn]) && (strtolower($rowData[$firstColumn]) > strtolower($lookup_value)))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$rowNumber = $rowKey;
|
||||||
|
$rowValue = $rowData[$firstColumn];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($rowNumber !== false) {
|
||||||
|
if ((!$not_exact_match) && ($rowValue != $lookup_value)) {
|
||||||
|
// if an exact match is required, we have what we need to return an appropriate response
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
} else {
|
||||||
|
// otherwise return the appropriate value
|
||||||
|
return $lookup_array[$rowNumber][$returnColumn];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HLOOKUP
|
||||||
|
* The HLOOKUP function searches for value in the top-most row of lookup_array and returns the value in the same column based on the index_number.
|
||||||
|
* @param lookup_value The value that you want to match in lookup_array
|
||||||
|
* @param lookup_array The range of cells being searched
|
||||||
|
* @param index_number The row number in table_array from which the matching value must be returned. The first row is 1.
|
||||||
|
* @param not_exact_match Determines if you are looking for an exact match based on lookup_value.
|
||||||
|
* @return mixed The value of the found cell
|
||||||
|
*/
|
||||||
|
public static function HLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true)
|
||||||
|
{
|
||||||
|
$lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);
|
||||||
|
$index_number = PHPExcel_Calculation_Functions::flattenSingleValue($index_number);
|
||||||
|
$not_exact_match = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match);
|
||||||
|
|
||||||
|
// index_number must be greater than or equal to 1
|
||||||
|
if ($index_number < 1) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
// index_number must be less than or equal to the number of columns in lookup_array
|
||||||
|
if ((!is_array($lookup_array)) || (empty($lookup_array))) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
} else {
|
||||||
|
$f = array_keys($lookup_array);
|
||||||
|
$firstRow = array_pop($f);
|
||||||
|
if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) {
|
||||||
|
return PHPExcel_Calculation_Functions::REF();
|
||||||
|
} else {
|
||||||
|
$columnKeys = array_keys($lookup_array[$firstRow]);
|
||||||
|
$firstkey = $f[0] - 1;
|
||||||
|
$returnColumn = $firstkey + $index_number;
|
||||||
|
$firstColumn = array_shift($f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$not_exact_match) {
|
||||||
|
$firstRowH = asort($lookup_array[$firstColumn]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rowNumber = $rowValue = false;
|
||||||
|
foreach ($lookup_array[$firstColumn] as $rowKey => $rowData) {
|
||||||
|
if ((is_numeric($lookup_value) && is_numeric($rowData) && ($rowData > $lookup_value)) ||
|
||||||
|
(!is_numeric($lookup_value) && !is_numeric($rowData) && (strtolower($rowData) > strtolower($lookup_value)))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$rowNumber = $rowKey;
|
||||||
|
$rowValue = $rowData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($rowNumber !== false) {
|
||||||
|
if ((!$not_exact_match) && ($rowValue != $lookup_value)) {
|
||||||
|
// if an exact match is required, we have what we need to return an appropriate response
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
} else {
|
||||||
|
// otherwise return the appropriate value
|
||||||
|
return $lookup_array[$returnColumn][$rowNumber];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LOOKUP
|
||||||
|
* The LOOKUP function searches for value either from a one-row or one-column range or from an array.
|
||||||
|
* @param lookup_value The value that you want to match in lookup_array
|
||||||
|
* @param lookup_vector The range of cells being searched
|
||||||
|
* @param result_vector The column from which the matching value must be returned
|
||||||
|
* @return mixed The value of the found cell
|
||||||
|
*/
|
||||||
|
public static function LOOKUP($lookup_value, $lookup_vector, $result_vector = null)
|
||||||
|
{
|
||||||
|
$lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);
|
||||||
|
|
||||||
|
if (!is_array($lookup_vector)) {
|
||||||
|
return PHPExcel_Calculation_Functions::NA();
|
||||||
|
}
|
||||||
|
$lookupRows = count($lookup_vector);
|
||||||
|
$l = array_keys($lookup_vector);
|
||||||
|
$l = array_shift($l);
|
||||||
|
$lookupColumns = count($lookup_vector[$l]);
|
||||||
|
if ((($lookupRows == 1) && ($lookupColumns > 1)) || (($lookupRows == 2) && ($lookupColumns != 2))) {
|
||||||
|
$lookup_vector = self::TRANSPOSE($lookup_vector);
|
||||||
|
$lookupRows = count($lookup_vector);
|
||||||
|
$l = array_keys($lookup_vector);
|
||||||
|
$lookupColumns = count($lookup_vector[array_shift($l)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($result_vector)) {
|
||||||
|
$result_vector = $lookup_vector;
|
||||||
|
}
|
||||||
|
$resultRows = count($result_vector);
|
||||||
|
$l = array_keys($result_vector);
|
||||||
|
$l = array_shift($l);
|
||||||
|
$resultColumns = count($result_vector[$l]);
|
||||||
|
if ((($resultRows == 1) && ($resultColumns > 1)) || (($resultRows == 2) && ($resultColumns != 2))) {
|
||||||
|
$result_vector = self::TRANSPOSE($result_vector);
|
||||||
|
$resultRows = count($result_vector);
|
||||||
|
$r = array_keys($result_vector);
|
||||||
|
$resultColumns = count($result_vector[array_shift($r)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($lookupRows == 2) {
|
||||||
|
$result_vector = array_pop($lookup_vector);
|
||||||
|
$lookup_vector = array_shift($lookup_vector);
|
||||||
|
}
|
||||||
|
if ($lookupColumns != 2) {
|
||||||
|
foreach ($lookup_vector as &$value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
$k = array_keys($value);
|
||||||
|
$key1 = $key2 = array_shift($k);
|
||||||
|
$key2++;
|
||||||
|
$dataValue1 = $value[$key1];
|
||||||
|
} else {
|
||||||
|
$key1 = 0;
|
||||||
|
$key2 = 1;
|
||||||
|
$dataValue1 = $value;
|
||||||
|
}
|
||||||
|
$dataValue2 = array_shift($result_vector);
|
||||||
|
if (is_array($dataValue2)) {
|
||||||
|
$dataValue2 = array_shift($dataValue2);
|
||||||
|
}
|
||||||
|
$value = array($key1 => $dataValue1, $key2 => $dataValue2);
|
||||||
|
}
|
||||||
|
unset($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::VLOOKUP($lookup_value, $lookup_vector, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,651 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_TextData
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_TextData
|
||||||
|
{
|
||||||
|
private static $invalidChars;
|
||||||
|
|
||||||
|
private static function unicodeToOrd($c)
|
||||||
|
{
|
||||||
|
if (ord($c{0}) >=0 && ord($c{0}) <= 127) {
|
||||||
|
return ord($c{0});
|
||||||
|
} elseif (ord($c{0}) >= 192 && ord($c{0}) <= 223) {
|
||||||
|
return (ord($c{0})-192)*64 + (ord($c{1})-128);
|
||||||
|
} elseif (ord($c{0}) >= 224 && ord($c{0}) <= 239) {
|
||||||
|
return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128);
|
||||||
|
} elseif (ord($c{0}) >= 240 && ord($c{0}) <= 247) {
|
||||||
|
return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128);
|
||||||
|
} elseif (ord($c{0}) >= 248 && ord($c{0}) <= 251) {
|
||||||
|
return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128);
|
||||||
|
} elseif (ord($c{0}) >= 252 && ord($c{0}) <= 253) {
|
||||||
|
return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128);
|
||||||
|
} elseif (ord($c{0}) >= 254 && ord($c{0}) <= 255) {
|
||||||
|
// error
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CHARACTER
|
||||||
|
*
|
||||||
|
* @param string $character Value
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static function CHARACTER($character)
|
||||||
|
{
|
||||||
|
$character = PHPExcel_Calculation_Functions::flattenSingleValue($character);
|
||||||
|
|
||||||
|
if ((!is_numeric($character)) || ($character < 0)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mb_convert_encoding')) {
|
||||||
|
return mb_convert_encoding('&#'.intval($character).';', 'UTF-8', 'HTML-ENTITIES');
|
||||||
|
} else {
|
||||||
|
return chr(intval($character));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TRIMNONPRINTABLE
|
||||||
|
*
|
||||||
|
* @param mixed $stringValue Value to check
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function TRIMNONPRINTABLE($stringValue = '')
|
||||||
|
{
|
||||||
|
$stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue);
|
||||||
|
|
||||||
|
if (is_bool($stringValue)) {
|
||||||
|
return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::$invalidChars == null) {
|
||||||
|
self::$invalidChars = range(chr(0), chr(31));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($stringValue) || is_numeric($stringValue)) {
|
||||||
|
return str_replace(self::$invalidChars, '', trim($stringValue, "\x00..\x1F"));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TRIMSPACES
|
||||||
|
*
|
||||||
|
* @param mixed $stringValue Value to check
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function TRIMSPACES($stringValue = '')
|
||||||
|
{
|
||||||
|
$stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue);
|
||||||
|
if (is_bool($stringValue)) {
|
||||||
|
return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($stringValue) || is_numeric($stringValue)) {
|
||||||
|
return trim(preg_replace('/ +/', ' ', trim($stringValue, ' ')), ' ');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ASCIICODE
|
||||||
|
*
|
||||||
|
* @param string $characters Value
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static function ASCIICODE($characters)
|
||||||
|
{
|
||||||
|
if (($characters === null) || ($characters === '')) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
$characters = PHPExcel_Calculation_Functions::flattenSingleValue($characters);
|
||||||
|
if (is_bool($characters)) {
|
||||||
|
if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
|
||||||
|
$characters = (int) $characters;
|
||||||
|
} else {
|
||||||
|
$characters = ($characters) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$character = $characters;
|
||||||
|
if ((function_exists('mb_strlen')) && (function_exists('mb_substr'))) {
|
||||||
|
if (mb_strlen($characters, 'UTF-8') > 1) {
|
||||||
|
$character = mb_substr($characters, 0, 1, 'UTF-8');
|
||||||
|
}
|
||||||
|
return self::unicodeToOrd($character);
|
||||||
|
} else {
|
||||||
|
if (strlen($characters) > 0) {
|
||||||
|
$character = substr($characters, 0, 1);
|
||||||
|
}
|
||||||
|
return ord($character);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CONCATENATE
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function CONCATENATE()
|
||||||
|
{
|
||||||
|
$returnValue = '';
|
||||||
|
|
||||||
|
// Loop through arguments
|
||||||
|
$aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
|
||||||
|
foreach ($aArgs as $arg) {
|
||||||
|
if (is_bool($arg)) {
|
||||||
|
if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
|
||||||
|
$arg = (int) $arg;
|
||||||
|
} else {
|
||||||
|
$arg = ($arg) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$returnValue .= $arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DOLLAR
|
||||||
|
*
|
||||||
|
* This function converts a number to text using currency format, with the decimals rounded to the specified place.
|
||||||
|
* The format used is $#,##0.00_);($#,##0.00)..
|
||||||
|
*
|
||||||
|
* @param float $value The value to format
|
||||||
|
* @param int $decimals The number of digits to display to the right of the decimal point.
|
||||||
|
* If decimals is negative, number is rounded to the left of the decimal point.
|
||||||
|
* If you omit decimals, it is assumed to be 2
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function DOLLAR($value = 0, $decimals = 2)
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
$decimals = is_null($decimals) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($decimals);
|
||||||
|
|
||||||
|
// Validate parameters
|
||||||
|
if (!is_numeric($value) || !is_numeric($decimals)) {
|
||||||
|
return PHPExcel_Calculation_Functions::NaN();
|
||||||
|
}
|
||||||
|
$decimals = floor($decimals);
|
||||||
|
|
||||||
|
$mask = '$#,##0';
|
||||||
|
if ($decimals > 0) {
|
||||||
|
$mask .= '.' . str_repeat('0', $decimals);
|
||||||
|
} else {
|
||||||
|
$round = pow(10, abs($decimals));
|
||||||
|
if ($value < 0) {
|
||||||
|
$round = 0-$round;
|
||||||
|
}
|
||||||
|
$value = PHPExcel_Calculation_MathTrig::MROUND($value, $round);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Style_NumberFormat::toFormattedString($value, $mask);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SEARCHSENSITIVE
|
||||||
|
*
|
||||||
|
* @param string $needle The string to look for
|
||||||
|
* @param string $haystack The string in which to look
|
||||||
|
* @param int $offset Offset within $haystack
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function SEARCHSENSITIVE($needle, $haystack, $offset = 1)
|
||||||
|
{
|
||||||
|
$needle = PHPExcel_Calculation_Functions::flattenSingleValue($needle);
|
||||||
|
$haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack);
|
||||||
|
$offset = PHPExcel_Calculation_Functions::flattenSingleValue($offset);
|
||||||
|
|
||||||
|
if (!is_bool($needle)) {
|
||||||
|
if (is_bool($haystack)) {
|
||||||
|
$haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) {
|
||||||
|
if (PHPExcel_Shared_String::CountCharacters($needle) == 0) {
|
||||||
|
return $offset;
|
||||||
|
}
|
||||||
|
if (function_exists('mb_strpos')) {
|
||||||
|
$pos = mb_strpos($haystack, $needle, --$offset, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
$pos = strpos($haystack, $needle, --$offset);
|
||||||
|
}
|
||||||
|
if ($pos !== false) {
|
||||||
|
return ++$pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SEARCHINSENSITIVE
|
||||||
|
*
|
||||||
|
* @param string $needle The string to look for
|
||||||
|
* @param string $haystack The string in which to look
|
||||||
|
* @param int $offset Offset within $haystack
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function SEARCHINSENSITIVE($needle, $haystack, $offset = 1)
|
||||||
|
{
|
||||||
|
$needle = PHPExcel_Calculation_Functions::flattenSingleValue($needle);
|
||||||
|
$haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack);
|
||||||
|
$offset = PHPExcel_Calculation_Functions::flattenSingleValue($offset);
|
||||||
|
|
||||||
|
if (!is_bool($needle)) {
|
||||||
|
if (is_bool($haystack)) {
|
||||||
|
$haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) {
|
||||||
|
if (PHPExcel_Shared_String::CountCharacters($needle) == 0) {
|
||||||
|
return $offset;
|
||||||
|
}
|
||||||
|
if (function_exists('mb_stripos')) {
|
||||||
|
$pos = mb_stripos($haystack, $needle, --$offset, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
$pos = stripos($haystack, $needle, --$offset);
|
||||||
|
}
|
||||||
|
if ($pos !== false) {
|
||||||
|
return ++$pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FIXEDFORMAT
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @param integer $decimals
|
||||||
|
* @param boolean $no_commas
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function FIXEDFORMAT($value, $decimals = 2, $no_commas = false)
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
$decimals = PHPExcel_Calculation_Functions::flattenSingleValue($decimals);
|
||||||
|
$no_commas = PHPExcel_Calculation_Functions::flattenSingleValue($no_commas);
|
||||||
|
|
||||||
|
// Validate parameters
|
||||||
|
if (!is_numeric($value) || !is_numeric($decimals)) {
|
||||||
|
return PHPExcel_Calculation_Functions::NaN();
|
||||||
|
}
|
||||||
|
$decimals = floor($decimals);
|
||||||
|
|
||||||
|
$valueResult = round($value, $decimals);
|
||||||
|
if ($decimals < 0) {
|
||||||
|
$decimals = 0;
|
||||||
|
}
|
||||||
|
if (!$no_commas) {
|
||||||
|
$valueResult = number_format($valueResult, $decimals);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (string) $valueResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LEFT
|
||||||
|
*
|
||||||
|
* @param string $value Value
|
||||||
|
* @param int $chars Number of characters
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function LEFT($value = '', $chars = 1)
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
$chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);
|
||||||
|
|
||||||
|
if ($chars < 0) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_bool($value)) {
|
||||||
|
$value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mb_substr')) {
|
||||||
|
return mb_substr($value, 0, $chars, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
return substr($value, 0, $chars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MID
|
||||||
|
*
|
||||||
|
* @param string $value Value
|
||||||
|
* @param int $start Start character
|
||||||
|
* @param int $chars Number of characters
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function MID($value = '', $start = 1, $chars = null)
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
$start = PHPExcel_Calculation_Functions::flattenSingleValue($start);
|
||||||
|
$chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);
|
||||||
|
|
||||||
|
if (($start < 1) || ($chars < 0)) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_bool($value)) {
|
||||||
|
$value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mb_substr')) {
|
||||||
|
return mb_substr($value, --$start, $chars, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
return substr($value, --$start, $chars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RIGHT
|
||||||
|
*
|
||||||
|
* @param string $value Value
|
||||||
|
* @param int $chars Number of characters
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function RIGHT($value = '', $chars = 1)
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
$chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);
|
||||||
|
|
||||||
|
if ($chars < 0) {
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_bool($value)) {
|
||||||
|
$value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((function_exists('mb_substr')) && (function_exists('mb_strlen'))) {
|
||||||
|
return mb_substr($value, mb_strlen($value, 'UTF-8') - $chars, $chars, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
return substr($value, strlen($value) - $chars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* STRINGLENGTH
|
||||||
|
*
|
||||||
|
* @param string $value Value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function STRINGLENGTH($value = '')
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if (is_bool($value)) {
|
||||||
|
$value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mb_strlen')) {
|
||||||
|
return mb_strlen($value, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
return strlen($value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LOWERCASE
|
||||||
|
*
|
||||||
|
* Converts a string value to upper case.
|
||||||
|
*
|
||||||
|
* @param string $mixedCaseString
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function LOWERCASE($mixedCaseString)
|
||||||
|
{
|
||||||
|
$mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString);
|
||||||
|
|
||||||
|
if (is_bool($mixedCaseString)) {
|
||||||
|
$mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Shared_String::StrToLower($mixedCaseString);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UPPERCASE
|
||||||
|
*
|
||||||
|
* Converts a string value to upper case.
|
||||||
|
*
|
||||||
|
* @param string $mixedCaseString
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function UPPERCASE($mixedCaseString)
|
||||||
|
{
|
||||||
|
$mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString);
|
||||||
|
|
||||||
|
if (is_bool($mixedCaseString)) {
|
||||||
|
$mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Shared_String::StrToUpper($mixedCaseString);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PROPERCASE
|
||||||
|
*
|
||||||
|
* Converts a string value to upper case.
|
||||||
|
*
|
||||||
|
* @param string $mixedCaseString
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function PROPERCASE($mixedCaseString)
|
||||||
|
{
|
||||||
|
$mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString);
|
||||||
|
|
||||||
|
if (is_bool($mixedCaseString)) {
|
||||||
|
$mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Shared_String::StrToTitle($mixedCaseString);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* REPLACE
|
||||||
|
*
|
||||||
|
* @param string $oldText String to modify
|
||||||
|
* @param int $start Start character
|
||||||
|
* @param int $chars Number of characters
|
||||||
|
* @param string $newText String to replace in defined position
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function REPLACE($oldText = '', $start = 1, $chars = null, $newText)
|
||||||
|
{
|
||||||
|
$oldText = PHPExcel_Calculation_Functions::flattenSingleValue($oldText);
|
||||||
|
$start = PHPExcel_Calculation_Functions::flattenSingleValue($start);
|
||||||
|
$chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);
|
||||||
|
$newText = PHPExcel_Calculation_Functions::flattenSingleValue($newText);
|
||||||
|
|
||||||
|
$left = self::LEFT($oldText, $start-1);
|
||||||
|
$right = self::RIGHT($oldText, self::STRINGLENGTH($oldText)-($start+$chars)+1);
|
||||||
|
|
||||||
|
return $left.$newText.$right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SUBSTITUTE
|
||||||
|
*
|
||||||
|
* @param string $text Value
|
||||||
|
* @param string $fromText From Value
|
||||||
|
* @param string $toText To Value
|
||||||
|
* @param integer $instance Instance Number
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function SUBSTITUTE($text = '', $fromText = '', $toText = '', $instance = 0)
|
||||||
|
{
|
||||||
|
$text = PHPExcel_Calculation_Functions::flattenSingleValue($text);
|
||||||
|
$fromText = PHPExcel_Calculation_Functions::flattenSingleValue($fromText);
|
||||||
|
$toText = PHPExcel_Calculation_Functions::flattenSingleValue($toText);
|
||||||
|
$instance = floor(PHPExcel_Calculation_Functions::flattenSingleValue($instance));
|
||||||
|
|
||||||
|
if ($instance == 0) {
|
||||||
|
if (function_exists('mb_str_replace')) {
|
||||||
|
return mb_str_replace($fromText, $toText, $text);
|
||||||
|
} else {
|
||||||
|
return str_replace($fromText, $toText, $text);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$pos = -1;
|
||||||
|
while ($instance > 0) {
|
||||||
|
if (function_exists('mb_strpos')) {
|
||||||
|
$pos = mb_strpos($text, $fromText, $pos+1, 'UTF-8');
|
||||||
|
} else {
|
||||||
|
$pos = strpos($text, $fromText, $pos+1);
|
||||||
|
}
|
||||||
|
if ($pos === false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
--$instance;
|
||||||
|
}
|
||||||
|
if ($pos !== false) {
|
||||||
|
if (function_exists('mb_strlen')) {
|
||||||
|
return self::REPLACE($text, ++$pos, mb_strlen($fromText, 'UTF-8'), $toText);
|
||||||
|
} else {
|
||||||
|
return self::REPLACE($text, ++$pos, strlen($fromText), $toText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETURNSTRING
|
||||||
|
*
|
||||||
|
* @param mixed $testValue Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function RETURNSTRING($testValue = '')
|
||||||
|
{
|
||||||
|
$testValue = PHPExcel_Calculation_Functions::flattenSingleValue($testValue);
|
||||||
|
|
||||||
|
if (is_string($testValue)) {
|
||||||
|
return $testValue;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TEXTFORMAT
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @param string $format Format mask to use
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function TEXTFORMAT($value, $format)
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
$format = PHPExcel_Calculation_Functions::flattenSingleValue($format);
|
||||||
|
|
||||||
|
if ((is_string($value)) && (!is_numeric($value)) && PHPExcel_Shared_Date::isDateTimeFormatCode($format)) {
|
||||||
|
$value = PHPExcel_Calculation_DateTime::DATEVALUE($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (string) PHPExcel_Style_NumberFormat::toFormattedString($value, $format);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VALUE
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to check
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function VALUE($value = '')
|
||||||
|
{
|
||||||
|
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
|
||||||
|
|
||||||
|
if (!is_numeric($value)) {
|
||||||
|
$numberValue = str_replace(
|
||||||
|
PHPExcel_Shared_String::getThousandsSeparator(),
|
||||||
|
'',
|
||||||
|
trim($value, " \t\n\r\0\x0B" . PHPExcel_Shared_String::getCurrencyCode())
|
||||||
|
);
|
||||||
|
if (is_numeric($numberValue)) {
|
||||||
|
return (float) $numberValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dateSetting = PHPExcel_Calculation_Functions::getReturnDateType();
|
||||||
|
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
|
||||||
|
|
||||||
|
if (strpos($value, ':') !== false) {
|
||||||
|
$timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($value);
|
||||||
|
if ($timeValue !== PHPExcel_Calculation_Functions::VALUE()) {
|
||||||
|
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
|
||||||
|
return $timeValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$dateValue = PHPExcel_Calculation_DateTime::DATEVALUE($value);
|
||||||
|
if ($dateValue !== PHPExcel_Calculation_Functions::VALUE()) {
|
||||||
|
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
|
||||||
|
return $dateValue;
|
||||||
|
}
|
||||||
|
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
|
||||||
|
|
||||||
|
return PHPExcel_Calculation_Functions::VALUE();
|
||||||
|
}
|
||||||
|
return (float) $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Calculation_Token_Stack
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Calculation
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Calculation_Token_Stack
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The parser stack for formulae
|
||||||
|
*
|
||||||
|
* @var mixed[]
|
||||||
|
*/
|
||||||
|
private $stack = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count of entries in the parser stack
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $count = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of entries on the stack
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function count()
|
||||||
|
{
|
||||||
|
return $this->count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Push a new entry onto the stack
|
||||||
|
*
|
||||||
|
* @param mixed $type
|
||||||
|
* @param mixed $value
|
||||||
|
* @param mixed $reference
|
||||||
|
*/
|
||||||
|
public function push($type, $value, $reference = null)
|
||||||
|
{
|
||||||
|
$this->stack[$this->count++] = array(
|
||||||
|
'type' => $type,
|
||||||
|
'value' => $value,
|
||||||
|
'reference' => $reference
|
||||||
|
);
|
||||||
|
if ($type == 'Function') {
|
||||||
|
$localeFunction = PHPExcel_Calculation::localeFunc($value);
|
||||||
|
if ($localeFunction != $value) {
|
||||||
|
$this->stack[($this->count - 1)]['localeValue'] = $localeFunction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pop the last entry from the stack
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function pop()
|
||||||
|
{
|
||||||
|
if ($this->count > 0) {
|
||||||
|
return $this->stack[--$this->count];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an entry from the stack without removing it
|
||||||
|
*
|
||||||
|
* @param integer $n number indicating how far back in the stack we want to look
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function last($n = 1)
|
||||||
|
{
|
||||||
|
if ($this->count - $n < 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return $this->stack[$this->count - $n];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the stack
|
||||||
|
*/
|
||||||
|
public function clear()
|
||||||
|
{
|
||||||
|
$this->stack = array();
|
||||||
|
$this->count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,351 @@
|
||||||
|
ABS
|
||||||
|
ACCRINT
|
||||||
|
ACCRINTM
|
||||||
|
ACOS
|
||||||
|
ACOSH
|
||||||
|
ADDRESS
|
||||||
|
AMORDEGRC
|
||||||
|
AMORLINC
|
||||||
|
AND
|
||||||
|
AREAS
|
||||||
|
ASC
|
||||||
|
ASIN
|
||||||
|
ASINH
|
||||||
|
ATAN
|
||||||
|
ATAN2
|
||||||
|
ATANH
|
||||||
|
AVEDEV
|
||||||
|
AVERAGE
|
||||||
|
AVERAGEA
|
||||||
|
AVERAGEIF
|
||||||
|
AVERAGEIFS
|
||||||
|
BAHTTEXT
|
||||||
|
BESSELI
|
||||||
|
BESSELJ
|
||||||
|
BESSELK
|
||||||
|
BESSELY
|
||||||
|
BETADIST
|
||||||
|
BETAINV
|
||||||
|
BIN2DEC
|
||||||
|
BIN2HEX
|
||||||
|
BIN2OCT
|
||||||
|
BINOMDIST
|
||||||
|
CEILING
|
||||||
|
CELL
|
||||||
|
CHAR
|
||||||
|
CHIDIST
|
||||||
|
CHIINV
|
||||||
|
CHITEST
|
||||||
|
CHOOSE
|
||||||
|
CLEAN
|
||||||
|
CODE
|
||||||
|
COLUMN
|
||||||
|
COLUMNS
|
||||||
|
COMBIN
|
||||||
|
COMPLEX
|
||||||
|
CONCATENATE
|
||||||
|
CONFIDENCE
|
||||||
|
CONVERT
|
||||||
|
CORREL
|
||||||
|
COS
|
||||||
|
COSH
|
||||||
|
COUNT
|
||||||
|
COUNTA
|
||||||
|
COUNTBLANK
|
||||||
|
COUNTIF
|
||||||
|
COUNTIFS
|
||||||
|
COUPDAYBS
|
||||||
|
COUPDAYBS
|
||||||
|
COUPDAYSNC
|
||||||
|
COUPNCD
|
||||||
|
COUPNUM
|
||||||
|
COUPPCD
|
||||||
|
COVAR
|
||||||
|
CRITBINOM
|
||||||
|
CUBEKPIMEMBER
|
||||||
|
CUBEMEMBER
|
||||||
|
CUBEMEMBERPROPERTY
|
||||||
|
CUBERANKEDMEMBER
|
||||||
|
CUBESET
|
||||||
|
CUBESETCOUNT
|
||||||
|
CUBEVALUE
|
||||||
|
CUMIPMT
|
||||||
|
CUMPRINC
|
||||||
|
DATE
|
||||||
|
DATEDIF
|
||||||
|
DATEVALUE
|
||||||
|
DAVERAGE
|
||||||
|
DAY
|
||||||
|
DAYS360
|
||||||
|
DB
|
||||||
|
DCOUNT
|
||||||
|
DCOUNTA
|
||||||
|
DDB
|
||||||
|
DEC2BIN
|
||||||
|
DEC2HEX
|
||||||
|
DEC2OCT
|
||||||
|
DEGREES
|
||||||
|
DELTA
|
||||||
|
DEVSQ
|
||||||
|
DGET
|
||||||
|
DISC
|
||||||
|
DMAX
|
||||||
|
DMIN
|
||||||
|
DOLLAR
|
||||||
|
DOLLARDE
|
||||||
|
DOLLARFR
|
||||||
|
DPRODUCT
|
||||||
|
DSTDEV
|
||||||
|
DSTDEVP
|
||||||
|
DSUM
|
||||||
|
DURATION
|
||||||
|
DVAR
|
||||||
|
DVARP
|
||||||
|
EDATE
|
||||||
|
EFFECT
|
||||||
|
EOMONTH
|
||||||
|
ERF
|
||||||
|
ERFC
|
||||||
|
ERROR.TYPE
|
||||||
|
EVEN
|
||||||
|
EXACT
|
||||||
|
EXP
|
||||||
|
EXPONDIST
|
||||||
|
FACT
|
||||||
|
FACTDOUBLE
|
||||||
|
FALSE
|
||||||
|
FDIST
|
||||||
|
FIND
|
||||||
|
FINDB
|
||||||
|
FINV
|
||||||
|
FISHER
|
||||||
|
FISHERINV
|
||||||
|
FIXED
|
||||||
|
FLOOR
|
||||||
|
FORECAST
|
||||||
|
FREQUENCY
|
||||||
|
FTEST
|
||||||
|
FV
|
||||||
|
FVSCHEDULE
|
||||||
|
GAMAMDIST
|
||||||
|
GAMMAINV
|
||||||
|
GAMMALN
|
||||||
|
GCD
|
||||||
|
GEOMEAN
|
||||||
|
GESTEP
|
||||||
|
GETPIVOTDATA
|
||||||
|
GROWTH
|
||||||
|
HARMEAN
|
||||||
|
HEX2BIN
|
||||||
|
HEX2OCT
|
||||||
|
HLOOKUP
|
||||||
|
HOUR
|
||||||
|
HYPERLINK
|
||||||
|
HYPGEOMDIST
|
||||||
|
IF
|
||||||
|
IFERROR
|
||||||
|
IMABS
|
||||||
|
IMAGINARY
|
||||||
|
IMARGUMENT
|
||||||
|
IMCONJUGATE
|
||||||
|
IMCOS
|
||||||
|
IMEXP
|
||||||
|
IMLN
|
||||||
|
IMLOG10
|
||||||
|
IMLOG2
|
||||||
|
IMPOWER
|
||||||
|
IMPRODUCT
|
||||||
|
IMREAL
|
||||||
|
IMSIN
|
||||||
|
IMSQRT
|
||||||
|
IMSUB
|
||||||
|
IMSUM
|
||||||
|
INDEX
|
||||||
|
INDIRECT
|
||||||
|
INFO
|
||||||
|
INT
|
||||||
|
INTERCEPT
|
||||||
|
INTRATE
|
||||||
|
IPMT
|
||||||
|
IRR
|
||||||
|
ISBLANK
|
||||||
|
ISERR
|
||||||
|
ISERROR
|
||||||
|
ISEVEN
|
||||||
|
ISLOGICAL
|
||||||
|
ISNA
|
||||||
|
ISNONTEXT
|
||||||
|
ISNUMBER
|
||||||
|
ISODD
|
||||||
|
ISPMT
|
||||||
|
ISREF
|
||||||
|
ISTEXT
|
||||||
|
JIS
|
||||||
|
KURT
|
||||||
|
LARGE
|
||||||
|
LCM
|
||||||
|
LEFT
|
||||||
|
LEFTB
|
||||||
|
LEN
|
||||||
|
LENB
|
||||||
|
LINEST
|
||||||
|
LN
|
||||||
|
LOG
|
||||||
|
LOG10
|
||||||
|
LOGEST
|
||||||
|
LOGINV
|
||||||
|
LOGNORMDIST
|
||||||
|
LOOKUP
|
||||||
|
LOWER
|
||||||
|
MATCH
|
||||||
|
MAX
|
||||||
|
MAXA
|
||||||
|
MDETERM
|
||||||
|
MDURATION
|
||||||
|
MEDIAN
|
||||||
|
MID
|
||||||
|
MIDB
|
||||||
|
MIN
|
||||||
|
MINA
|
||||||
|
MINUTE
|
||||||
|
MINVERSE
|
||||||
|
MIRR
|
||||||
|
MMULT
|
||||||
|
MOD
|
||||||
|
MODE
|
||||||
|
MONTH
|
||||||
|
MROUND
|
||||||
|
MULTINOMIAL
|
||||||
|
N
|
||||||
|
NA
|
||||||
|
NEGBINOMDIST
|
||||||
|
NETWORKDAYS
|
||||||
|
NOMINAL
|
||||||
|
NORMDIST
|
||||||
|
NORMINV
|
||||||
|
NORMSDIST
|
||||||
|
NORMSINV
|
||||||
|
NOT
|
||||||
|
NOW
|
||||||
|
NPER
|
||||||
|
NPV
|
||||||
|
OCT2BIN
|
||||||
|
OCT2DEC
|
||||||
|
OCT2HEX
|
||||||
|
ODD
|
||||||
|
ODDFPRICE
|
||||||
|
ODDFYIELD
|
||||||
|
ODDLPRICE
|
||||||
|
ODDLYIELD
|
||||||
|
OFFSET
|
||||||
|
OR
|
||||||
|
PEARSON
|
||||||
|
PERCENTILE
|
||||||
|
PERCENTRANK
|
||||||
|
PERMUT
|
||||||
|
PHONETIC
|
||||||
|
PI
|
||||||
|
PMT
|
||||||
|
POISSON
|
||||||
|
POWER
|
||||||
|
PPMT
|
||||||
|
PRICE
|
||||||
|
PRICEDISC
|
||||||
|
PRICEMAT
|
||||||
|
PROB
|
||||||
|
PRODUCT
|
||||||
|
PROPER
|
||||||
|
PV
|
||||||
|
QUARTILE
|
||||||
|
QUOTIENT
|
||||||
|
RADIANS
|
||||||
|
RAND
|
||||||
|
RANDBETWEEN
|
||||||
|
RANK
|
||||||
|
RATE
|
||||||
|
RECEIVED
|
||||||
|
REPLACE
|
||||||
|
REPLACEB
|
||||||
|
REPT
|
||||||
|
RIGHT
|
||||||
|
RIGHTB
|
||||||
|
ROMAN
|
||||||
|
ROUND
|
||||||
|
ROUNDDOWN
|
||||||
|
ROUNDUP
|
||||||
|
ROW
|
||||||
|
ROWS
|
||||||
|
RSQ
|
||||||
|
RTD
|
||||||
|
SEARCH
|
||||||
|
SEARCHB
|
||||||
|
SECOND
|
||||||
|
SERIESSUM
|
||||||
|
SIGN
|
||||||
|
SIN
|
||||||
|
SINH
|
||||||
|
SKEW
|
||||||
|
SLN
|
||||||
|
SLOPE
|
||||||
|
SMALL
|
||||||
|
SQRT
|
||||||
|
SQRTPI
|
||||||
|
STANDARDIZE
|
||||||
|
STDEV
|
||||||
|
STDEVA
|
||||||
|
STDEVP
|
||||||
|
STDEVPA
|
||||||
|
STEYX
|
||||||
|
SUBSTITUTE
|
||||||
|
SUBTOTAL
|
||||||
|
SUM
|
||||||
|
SUMIF
|
||||||
|
SUMIFS
|
||||||
|
SUMPRODUCT
|
||||||
|
SUMSQ
|
||||||
|
SUMX2MY2
|
||||||
|
SUMX2PY2
|
||||||
|
SUMXMY2
|
||||||
|
SYD
|
||||||
|
T
|
||||||
|
TAN
|
||||||
|
TANH
|
||||||
|
TBILLEQ
|
||||||
|
TBILLPRICE
|
||||||
|
TBILLYIELD
|
||||||
|
TDIST
|
||||||
|
TEXT
|
||||||
|
TIME
|
||||||
|
TIMEVALUE
|
||||||
|
TINV
|
||||||
|
TODAY
|
||||||
|
TRANSPOSE
|
||||||
|
TREND
|
||||||
|
TRIM
|
||||||
|
TRIMMEAN
|
||||||
|
TRUE
|
||||||
|
TRUNC
|
||||||
|
TTEST
|
||||||
|
TYPE
|
||||||
|
UPPER
|
||||||
|
USDOLLAR
|
||||||
|
VALUE
|
||||||
|
VAR
|
||||||
|
VARA
|
||||||
|
VARP
|
||||||
|
VARPA
|
||||||
|
VDB
|
||||||
|
VERSION
|
||||||
|
VLOOKUP
|
||||||
|
WEEKDAY
|
||||||
|
WEEKNUM
|
||||||
|
WEIBULL
|
||||||
|
WORKDAY
|
||||||
|
XIRR
|
||||||
|
XNPV
|
||||||
|
YEAR
|
||||||
|
YEARFRAC
|
||||||
|
YIELD
|
||||||
|
YIELDDISC
|
||||||
|
YIELDMAT
|
||||||
|
ZTEST
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,187 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Cell_AdvancedValueBinder
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Bind value to a cell
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Cell $cell Cell to bind value to
|
||||||
|
* @param mixed $value Value to bind in cell
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function bindValue(PHPExcel_Cell $cell, $value = null)
|
||||||
|
{
|
||||||
|
// sanitize UTF-8 strings
|
||||||
|
if (is_string($value)) {
|
||||||
|
$value = PHPExcel_Shared_String::SanitizeUTF8($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find out data type
|
||||||
|
$dataType = parent::dataTypeForValue($value);
|
||||||
|
|
||||||
|
// Style logic - strings
|
||||||
|
if ($dataType === PHPExcel_Cell_DataType::TYPE_STRING && !$value instanceof PHPExcel_RichText) {
|
||||||
|
// Test for booleans using locale-setting
|
||||||
|
if ($value == PHPExcel_Calculation::getTRUE()) {
|
||||||
|
$cell->setValueExplicit(true, PHPExcel_Cell_DataType::TYPE_BOOL);
|
||||||
|
return true;
|
||||||
|
} elseif ($value == PHPExcel_Calculation::getFALSE()) {
|
||||||
|
$cell->setValueExplicit(false, PHPExcel_Cell_DataType::TYPE_BOOL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for number in scientific format
|
||||||
|
if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NUMBER.'$/', $value)) {
|
||||||
|
$cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for fraction
|
||||||
|
if (preg_match('/^([+-]?)\s*([0-9]+)\s?\/\s*([0-9]+)$/', $value, $matches)) {
|
||||||
|
// Convert value to number
|
||||||
|
$value = $matches[2] / $matches[3];
|
||||||
|
if ($matches[1] == '-') {
|
||||||
|
$value = 0 - $value;
|
||||||
|
}
|
||||||
|
$cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode('??/??');
|
||||||
|
return true;
|
||||||
|
} elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) {
|
||||||
|
// Convert value to number
|
||||||
|
$value = $matches[2] + ($matches[3] / $matches[4]);
|
||||||
|
if ($matches[1] == '-') {
|
||||||
|
$value = 0 - $value;
|
||||||
|
}
|
||||||
|
$cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode('# ??/??');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for percentage
|
||||||
|
if (preg_match('/^\-?[0-9]*\.?[0-9]*\s?\%$/', $value)) {
|
||||||
|
// Convert value to number
|
||||||
|
$value = (float) str_replace('%', '', $value) / 100;
|
||||||
|
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for currency
|
||||||
|
$currencyCode = PHPExcel_Shared_String::getCurrencyCode();
|
||||||
|
$decimalSeparator = PHPExcel_Shared_String::getDecimalSeparator();
|
||||||
|
$thousandsSeparator = PHPExcel_Shared_String::getThousandsSeparator();
|
||||||
|
if (preg_match('/^'.preg_quote($currencyCode).' *(\d{1,3}('.preg_quote($thousandsSeparator).'\d{3})*|(\d+))('.preg_quote($decimalSeparator).'\d{2})?$/', $value)) {
|
||||||
|
// Convert value to number
|
||||||
|
$value = (float) trim(str_replace(array($currencyCode, $thousandsSeparator, $decimalSeparator), array('', '', '.'), $value));
|
||||||
|
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode(
|
||||||
|
str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
} elseif (preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) {
|
||||||
|
// Convert value to number
|
||||||
|
$value = (float) trim(str_replace(array('$',','), '', $value));
|
||||||
|
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for time without seconds e.g. '9:45', '09:45'
|
||||||
|
if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) {
|
||||||
|
// Convert value to number
|
||||||
|
list($h, $m) = explode(':', $value);
|
||||||
|
$days = $h / 24 + $m / 1440;
|
||||||
|
$cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for time with seconds '9:45:59', '09:45:59'
|
||||||
|
if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) {
|
||||||
|
// Convert value to number
|
||||||
|
list($h, $m, $s) = explode(':', $value);
|
||||||
|
$days = $h / 24 + $m / 1440 + $s / 86400;
|
||||||
|
// Convert value to number
|
||||||
|
$cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for datetime, e.g. '2008-12-31', '2008-12-31 15:59', '2008-12-31 15:59:10'
|
||||||
|
if (($d = PHPExcel_Shared_Date::stringToExcel($value)) !== false) {
|
||||||
|
// Convert value to number
|
||||||
|
$cell->setValueExplicit($d, PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
||||||
|
// Determine style. Either there is a time part or not. Look for ':'
|
||||||
|
if (strpos($value, ':') !== false) {
|
||||||
|
$formatCode = 'yyyy-mm-dd h:mm';
|
||||||
|
} else {
|
||||||
|
$formatCode = 'yyyy-mm-dd';
|
||||||
|
}
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getNumberFormat()->setFormatCode($formatCode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for newline character "\n"
|
||||||
|
if (strpos($value, "\n") !== false) {
|
||||||
|
$value = PHPExcel_Shared_String::SanitizeUTF8($value);
|
||||||
|
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
|
||||||
|
// Set style
|
||||||
|
$cell->getWorksheet()->getStyle($cell->getCoordinate())
|
||||||
|
->getAlignment()->setWrapText(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not bound yet? Use parent...
|
||||||
|
return parent::bindValue($cell, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,115 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Cell_DataType
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Cell_DataType
|
||||||
|
{
|
||||||
|
/* Data types */
|
||||||
|
const TYPE_STRING2 = 'str';
|
||||||
|
const TYPE_STRING = 's';
|
||||||
|
const TYPE_FORMULA = 'f';
|
||||||
|
const TYPE_NUMERIC = 'n';
|
||||||
|
const TYPE_BOOL = 'b';
|
||||||
|
const TYPE_NULL = 'null';
|
||||||
|
const TYPE_INLINE = 'inlineStr';
|
||||||
|
const TYPE_ERROR = 'e';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of error codes
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private static $errorCodes = array(
|
||||||
|
'#NULL!' => 0,
|
||||||
|
'#DIV/0!' => 1,
|
||||||
|
'#VALUE!' => 2,
|
||||||
|
'#REF!' => 3,
|
||||||
|
'#NAME?' => 4,
|
||||||
|
'#NUM!' => 5,
|
||||||
|
'#N/A' => 6
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get list of error codes
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getErrorCodes()
|
||||||
|
{
|
||||||
|
return self::$errorCodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DataType for value
|
||||||
|
*
|
||||||
|
* @deprecated Replaced by PHPExcel_Cell_IValueBinder infrastructure, will be removed in version 1.8.0
|
||||||
|
* @param mixed $pValue
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function dataTypeForValue($pValue = null)
|
||||||
|
{
|
||||||
|
return PHPExcel_Cell_DefaultValueBinder::dataTypeForValue($pValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a string that it satisfies Excel requirements
|
||||||
|
*
|
||||||
|
* @param mixed Value to sanitize to an Excel string
|
||||||
|
* @return mixed Sanitized value
|
||||||
|
*/
|
||||||
|
public static function checkString($pValue = null)
|
||||||
|
{
|
||||||
|
if ($pValue instanceof PHPExcel_RichText) {
|
||||||
|
// TODO: Sanitize Rich-Text string (max. character count is 32,767)
|
||||||
|
return $pValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// string must never be longer than 32,767 characters, truncate if necessary
|
||||||
|
$pValue = PHPExcel_Shared_String::Substring($pValue, 0, 32767);
|
||||||
|
|
||||||
|
// we require that newline is represented as "\n" in core, not as "\r\n" or "\r"
|
||||||
|
$pValue = str_replace(array("\r\n", "\r"), "\n", $pValue);
|
||||||
|
|
||||||
|
return $pValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a value that it is a valid error code
|
||||||
|
*
|
||||||
|
* @param mixed Value to sanitize to an Excel error code
|
||||||
|
* @return string Sanitized value
|
||||||
|
*/
|
||||||
|
public static function checkErrorCode($pValue = null)
|
||||||
|
{
|
||||||
|
$pValue = (string) $pValue;
|
||||||
|
|
||||||
|
if (!array_key_exists($pValue, self::$errorCodes)) {
|
||||||
|
$pValue = '#NULL!';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $pValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,492 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Cell_DataValidation
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Cell_DataValidation
|
||||||
|
{
|
||||||
|
/* Data validation types */
|
||||||
|
const TYPE_NONE = 'none';
|
||||||
|
const TYPE_CUSTOM = 'custom';
|
||||||
|
const TYPE_DATE = 'date';
|
||||||
|
const TYPE_DECIMAL = 'decimal';
|
||||||
|
const TYPE_LIST = 'list';
|
||||||
|
const TYPE_TEXTLENGTH = 'textLength';
|
||||||
|
const TYPE_TIME = 'time';
|
||||||
|
const TYPE_WHOLE = 'whole';
|
||||||
|
|
||||||
|
/* Data validation error styles */
|
||||||
|
const STYLE_STOP = 'stop';
|
||||||
|
const STYLE_WARNING = 'warning';
|
||||||
|
const STYLE_INFORMATION = 'information';
|
||||||
|
|
||||||
|
/* Data validation operators */
|
||||||
|
const OPERATOR_BETWEEN = 'between';
|
||||||
|
const OPERATOR_EQUAL = 'equal';
|
||||||
|
const OPERATOR_GREATERTHAN = 'greaterThan';
|
||||||
|
const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual';
|
||||||
|
const OPERATOR_LESSTHAN = 'lessThan';
|
||||||
|
const OPERATOR_LESSTHANOREQUAL = 'lessThanOrEqual';
|
||||||
|
const OPERATOR_NOTBETWEEN = 'notBetween';
|
||||||
|
const OPERATOR_NOTEQUAL = 'notEqual';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formula 1
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $formula1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formula 2
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $formula2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $type = PHPExcel_Cell_DataValidation::TYPE_NONE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error style
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Operator
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $operator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow Blank
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $allowBlank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show DropDown
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showDropDown;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show InputMessage
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showInputMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show ErrorMessage
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showErrorMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error title
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $errorTitle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompt title
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $promptTitle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompt
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $prompt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// Initialise member variables
|
||||||
|
$this->formula1 = '';
|
||||||
|
$this->formula2 = '';
|
||||||
|
$this->type = PHPExcel_Cell_DataValidation::TYPE_NONE;
|
||||||
|
$this->errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;
|
||||||
|
$this->operator = '';
|
||||||
|
$this->allowBlank = false;
|
||||||
|
$this->showDropDown = false;
|
||||||
|
$this->showInputMessage = false;
|
||||||
|
$this->showErrorMessage = false;
|
||||||
|
$this->errorTitle = '';
|
||||||
|
$this->error = '';
|
||||||
|
$this->promptTitle = '';
|
||||||
|
$this->prompt = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Formula 1
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormula1()
|
||||||
|
{
|
||||||
|
return $this->formula1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Formula 1
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setFormula1($value = '')
|
||||||
|
{
|
||||||
|
$this->formula1 = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Formula 2
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormula2()
|
||||||
|
{
|
||||||
|
return $this->formula2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Formula 2
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setFormula2($value = '')
|
||||||
|
{
|
||||||
|
$this->formula2 = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getType()
|
||||||
|
{
|
||||||
|
return $this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Type
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setType($value = PHPExcel_Cell_DataValidation::TYPE_NONE)
|
||||||
|
{
|
||||||
|
$this->type = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Error style
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getErrorStyle()
|
||||||
|
{
|
||||||
|
return $this->errorStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Error style
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setErrorStyle($value = PHPExcel_Cell_DataValidation::STYLE_STOP)
|
||||||
|
{
|
||||||
|
$this->errorStyle = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Operator
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getOperator()
|
||||||
|
{
|
||||||
|
return $this->operator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Operator
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setOperator($value = '')
|
||||||
|
{
|
||||||
|
$this->operator = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Allow Blank
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getAllowBlank()
|
||||||
|
{
|
||||||
|
return $this->allowBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Allow Blank
|
||||||
|
*
|
||||||
|
* @param boolean $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setAllowBlank($value = false)
|
||||||
|
{
|
||||||
|
$this->allowBlank = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Show DropDown
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowDropDown()
|
||||||
|
{
|
||||||
|
return $this->showDropDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Show DropDown
|
||||||
|
*
|
||||||
|
* @param boolean $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setShowDropDown($value = false)
|
||||||
|
{
|
||||||
|
$this->showDropDown = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Show InputMessage
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowInputMessage()
|
||||||
|
{
|
||||||
|
return $this->showInputMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Show InputMessage
|
||||||
|
*
|
||||||
|
* @param boolean $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setShowInputMessage($value = false)
|
||||||
|
{
|
||||||
|
$this->showInputMessage = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Show ErrorMessage
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowErrorMessage()
|
||||||
|
{
|
||||||
|
return $this->showErrorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Show ErrorMessage
|
||||||
|
*
|
||||||
|
* @param boolean $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setShowErrorMessage($value = false)
|
||||||
|
{
|
||||||
|
$this->showErrorMessage = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Error title
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getErrorTitle()
|
||||||
|
{
|
||||||
|
return $this->errorTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Error title
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setErrorTitle($value = '')
|
||||||
|
{
|
||||||
|
$this->errorTitle = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Error
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getError()
|
||||||
|
{
|
||||||
|
return $this->error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Error
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setError($value = '')
|
||||||
|
{
|
||||||
|
$this->error = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Prompt title
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPromptTitle()
|
||||||
|
{
|
||||||
|
return $this->promptTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Prompt title
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setPromptTitle($value = '')
|
||||||
|
{
|
||||||
|
$this->promptTitle = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Prompt
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPrompt()
|
||||||
|
{
|
||||||
|
return $this->prompt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Prompt
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_DataValidation
|
||||||
|
*/
|
||||||
|
public function setPrompt($value = '')
|
||||||
|
{
|
||||||
|
$this->prompt = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get hash code
|
||||||
|
*
|
||||||
|
* @return string Hash code
|
||||||
|
*/
|
||||||
|
public function getHashCode()
|
||||||
|
{
|
||||||
|
return md5(
|
||||||
|
$this->formula1 .
|
||||||
|
$this->formula2 .
|
||||||
|
$this->type = PHPExcel_Cell_DataValidation::TYPE_NONE .
|
||||||
|
$this->errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP .
|
||||||
|
$this->operator .
|
||||||
|
($this->allowBlank ? 't' : 'f') .
|
||||||
|
($this->showDropDown ? 't' : 'f') .
|
||||||
|
($this->showInputMessage ? 't' : 'f') .
|
||||||
|
($this->showErrorMessage ? 't' : 'f') .
|
||||||
|
$this->errorTitle .
|
||||||
|
$this->error .
|
||||||
|
$this->promptTitle .
|
||||||
|
$this->prompt .
|
||||||
|
__CLASS__
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
||||||
|
*/
|
||||||
|
public function __clone()
|
||||||
|
{
|
||||||
|
$vars = get_object_vars($this);
|
||||||
|
foreach ($vars as $key => $value) {
|
||||||
|
if (is_object($value)) {
|
||||||
|
$this->$key = clone $value;
|
||||||
|
} else {
|
||||||
|
$this->$key = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/** PHPExcel root directory */
|
||||||
|
if (!defined('PHPEXCEL_ROOT')) {
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
|
||||||
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Cell_DefaultValueBinder
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Bind value to a cell
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Cell $cell Cell to bind value to
|
||||||
|
* @param mixed $value Value to bind in cell
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function bindValue(PHPExcel_Cell $cell, $value = null)
|
||||||
|
{
|
||||||
|
// sanitize UTF-8 strings
|
||||||
|
if (is_string($value)) {
|
||||||
|
$value = PHPExcel_Shared_String::SanitizeUTF8($value);
|
||||||
|
} elseif (is_object($value)) {
|
||||||
|
// Handle any objects that might be injected
|
||||||
|
if ($value instanceof DateTime) {
|
||||||
|
$value = $value->format('Y-m-d H:i:s');
|
||||||
|
} elseif (!($value instanceof PHPExcel_RichText)) {
|
||||||
|
$value = (string) $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set value explicit
|
||||||
|
$cell->setValueExplicit($value, self::dataTypeForValue($value));
|
||||||
|
|
||||||
|
// Done!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DataType for value
|
||||||
|
*
|
||||||
|
* @param mixed $pValue
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function dataTypeForValue($pValue = null)
|
||||||
|
{
|
||||||
|
// Match the value against a few data types
|
||||||
|
if ($pValue === null) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_NULL;
|
||||||
|
} elseif ($pValue === '') {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_STRING;
|
||||||
|
} elseif ($pValue instanceof PHPExcel_RichText) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_INLINE;
|
||||||
|
} elseif ($pValue{0} === '=' && strlen($pValue) > 1) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_FORMULA;
|
||||||
|
} elseif (is_bool($pValue)) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_BOOL;
|
||||||
|
} elseif (is_float($pValue) || is_int($pValue)) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_NUMERIC;
|
||||||
|
} elseif (preg_match('/^[\+\-]?([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $pValue)) {
|
||||||
|
$tValue = ltrim($pValue, '+-');
|
||||||
|
if (is_string($pValue) && $tValue{0} === '0' && strlen($tValue) > 1 && $tValue{1} !== '.') {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_STRING;
|
||||||
|
} elseif ((strpos($pValue, '.') === false) && ($pValue > PHP_INT_MAX)) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_STRING;
|
||||||
|
}
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_NUMERIC;
|
||||||
|
} elseif (is_string($pValue) && array_key_exists($pValue, PHPExcel_Cell_DataType::getErrorCodes())) {
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PHPExcel_Cell_DataType::TYPE_STRING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,124 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Cell_Hyperlink
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Cell_Hyperlink
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* URL to link the cell to
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tooltip to display on the hyperlink
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $tooltip;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Cell_Hyperlink
|
||||||
|
*
|
||||||
|
* @param string $pUrl Url to link the cell to
|
||||||
|
* @param string $pTooltip Tooltip to display on the hyperlink
|
||||||
|
*/
|
||||||
|
public function __construct($pUrl = '', $pTooltip = '')
|
||||||
|
{
|
||||||
|
// Initialise member variables
|
||||||
|
$this->url = $pUrl;
|
||||||
|
$this->tooltip = $pTooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get URL
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getUrl()
|
||||||
|
{
|
||||||
|
return $this->url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set URL
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_Hyperlink
|
||||||
|
*/
|
||||||
|
public function setUrl($value = '')
|
||||||
|
{
|
||||||
|
$this->url = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get tooltip
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTooltip()
|
||||||
|
{
|
||||||
|
return $this->tooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set tooltip
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Cell_Hyperlink
|
||||||
|
*/
|
||||||
|
public function setTooltip($value = '')
|
||||||
|
{
|
||||||
|
$this->tooltip = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this hyperlink internal? (to another worksheet)
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function isInternal()
|
||||||
|
{
|
||||||
|
return strpos($this->url, 'sheet://') !== false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get hash code
|
||||||
|
*
|
||||||
|
* @return string Hash code
|
||||||
|
*/
|
||||||
|
public function getHashCode()
|
||||||
|
{
|
||||||
|
return md5(
|
||||||
|
$this->url .
|
||||||
|
$this->tooltip .
|
||||||
|
__CLASS__
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Cell_IValueBinder
|
||||||
|
*
|
||||||
|
* @category PHPExcel
|
||||||
|
* @package PHPExcel_Cell
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
*/
|
||||||
|
interface PHPExcel_Cell_IValueBinder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Bind value to a cell
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Cell $cell Cell to bind value to
|
||||||
|
* @param mixed $value Value to bind in cell
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function bindValue(PHPExcel_Cell $cell, $value = null);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,680 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Chart Name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $name = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Worksheet
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Worksheet
|
||||||
|
*/
|
||||||
|
private $worksheet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Title
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
private $title;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Legend
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Legend
|
||||||
|
*/
|
||||||
|
private $legend;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* X-Axis Label
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
private $xAxisLabel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Y-Axis Label
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
private $yAxisLabel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Plot Area
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_PlotArea
|
||||||
|
*/
|
||||||
|
private $plotArea;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Visible Only
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $plotVisibleOnly = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display Blanks as
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $displayBlanksAs = '0';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Asix Y as
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private $yAxis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Asix X as
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private $xAxis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Major Gridlines as
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
private $majorGridlines;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chart Minor Gridlines as
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
private $minorGridlines;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Top-Left Cell Position
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $topLeftCellRef = 'A1';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Top-Left X-Offset
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $topLeftXOffset = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Top-Left Y-Offset
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $topLeftYOffset = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bottom-Right Cell Position
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $bottomRightCellRef = 'A1';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bottom-Right X-Offset
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $bottomRightXOffset = 10;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bottom-Right Y-Offset
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $bottomRightYOffset = 10;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function __construct($name, PHPExcel_Chart_Title $title = null, PHPExcel_Chart_Legend $legend = null, PHPExcel_Chart_PlotArea $plotArea = null, $plotVisibleOnly = true, $displayBlanksAs = '0', PHPExcel_Chart_Title $xAxisLabel = null, PHPExcel_Chart_Title $yAxisLabel = null, PHPExcel_Chart_Axis $xAxis = null, PHPExcel_Chart_Axis $yAxis = null, PHPExcel_Chart_GridLines $majorGridlines = null, PHPExcel_Chart_GridLines $minorGridlines = null)
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
|
$this->title = $title;
|
||||||
|
$this->legend = $legend;
|
||||||
|
$this->xAxisLabel = $xAxisLabel;
|
||||||
|
$this->yAxisLabel = $yAxisLabel;
|
||||||
|
$this->plotArea = $plotArea;
|
||||||
|
$this->plotVisibleOnly = $plotVisibleOnly;
|
||||||
|
$this->displayBlanksAs = $displayBlanksAs;
|
||||||
|
$this->xAxis = $xAxis;
|
||||||
|
$this->yAxis = $yAxis;
|
||||||
|
$this->majorGridlines = $majorGridlines;
|
||||||
|
$this->minorGridlines = $minorGridlines;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Worksheet
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Worksheet
|
||||||
|
*/
|
||||||
|
public function getWorksheet()
|
||||||
|
{
|
||||||
|
return $this->worksheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Worksheet
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Worksheet $pValue
|
||||||
|
* @throws PHPExcel_Chart_Exception
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setWorksheet(PHPExcel_Worksheet $pValue = null)
|
||||||
|
{
|
||||||
|
$this->worksheet = $pValue;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Title
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
public function getTitle()
|
||||||
|
{
|
||||||
|
return $this->title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Title
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Chart_Title $title
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setTitle(PHPExcel_Chart_Title $title)
|
||||||
|
{
|
||||||
|
$this->title = $title;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Legend
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Legend
|
||||||
|
*/
|
||||||
|
public function getLegend()
|
||||||
|
{
|
||||||
|
return $this->legend;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Legend
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Chart_Legend $legend
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setLegend(PHPExcel_Chart_Legend $legend)
|
||||||
|
{
|
||||||
|
$this->legend = $legend;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get X-Axis Label
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
public function getXAxisLabel()
|
||||||
|
{
|
||||||
|
return $this->xAxisLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set X-Axis Label
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Chart_Title $label
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setXAxisLabel(PHPExcel_Chart_Title $label)
|
||||||
|
{
|
||||||
|
$this->xAxisLabel = $label;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Y-Axis Label
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
public function getYAxisLabel()
|
||||||
|
{
|
||||||
|
return $this->yAxisLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Y-Axis Label
|
||||||
|
*
|
||||||
|
* @param PHPExcel_Chart_Title $label
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setYAxisLabel(PHPExcel_Chart_Title $label)
|
||||||
|
{
|
||||||
|
$this->yAxisLabel = $label;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Area
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_PlotArea
|
||||||
|
*/
|
||||||
|
public function getPlotArea()
|
||||||
|
{
|
||||||
|
return $this->plotArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Visible Only
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getPlotVisibleOnly()
|
||||||
|
{
|
||||||
|
return $this->plotVisibleOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Plot Visible Only
|
||||||
|
*
|
||||||
|
* @param boolean $plotVisibleOnly
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setPlotVisibleOnly($plotVisibleOnly = true)
|
||||||
|
{
|
||||||
|
$this->plotVisibleOnly = $plotVisibleOnly;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Display Blanks as
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDisplayBlanksAs()
|
||||||
|
{
|
||||||
|
return $this->displayBlanksAs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Display Blanks as
|
||||||
|
*
|
||||||
|
* @param string $displayBlanksAs
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setDisplayBlanksAs($displayBlanksAs = '0')
|
||||||
|
{
|
||||||
|
$this->displayBlanksAs = $displayBlanksAs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get yAxis
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
public function getChartAxisY()
|
||||||
|
{
|
||||||
|
if ($this->yAxis !== null) {
|
||||||
|
return $this->yAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PHPExcel_Chart_Axis();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get xAxis
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
public function getChartAxisX()
|
||||||
|
{
|
||||||
|
if ($this->xAxis !== null) {
|
||||||
|
return $this->xAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PHPExcel_Chart_Axis();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Major Gridlines
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
public function getMajorGridlines()
|
||||||
|
{
|
||||||
|
if ($this->majorGridlines !== null) {
|
||||||
|
return $this->majorGridlines;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PHPExcel_Chart_GridLines();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Minor Gridlines
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
public function getMinorGridlines()
|
||||||
|
{
|
||||||
|
if ($this->minorGridlines !== null) {
|
||||||
|
return $this->minorGridlines;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PHPExcel_Chart_GridLines();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Top Left position for the chart
|
||||||
|
*
|
||||||
|
* @param string $cell
|
||||||
|
* @param integer $xOffset
|
||||||
|
* @param integer $yOffset
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setTopLeftPosition($cell, $xOffset = null, $yOffset = null)
|
||||||
|
{
|
||||||
|
$this->topLeftCellRef = $cell;
|
||||||
|
if (!is_null($xOffset)) {
|
||||||
|
$this->setTopLeftXOffset($xOffset);
|
||||||
|
}
|
||||||
|
if (!is_null($yOffset)) {
|
||||||
|
$this->setTopLeftYOffset($yOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the top left position of the chart
|
||||||
|
*
|
||||||
|
* @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell
|
||||||
|
*/
|
||||||
|
public function getTopLeftPosition()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'cell' => $this->topLeftCellRef,
|
||||||
|
'xOffset' => $this->topLeftXOffset,
|
||||||
|
'yOffset' => $this->topLeftYOffset
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the cell address where the top left of the chart is fixed
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTopLeftCell()
|
||||||
|
{
|
||||||
|
return $this->topLeftCellRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Top Left cell position for the chart
|
||||||
|
*
|
||||||
|
* @param string $cell
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setTopLeftCell($cell)
|
||||||
|
{
|
||||||
|
$this->topLeftCellRef = $cell;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the offset position within the Top Left cell for the chart
|
||||||
|
*
|
||||||
|
* @param integer $xOffset
|
||||||
|
* @param integer $yOffset
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setTopLeftOffset($xOffset = null, $yOffset = null)
|
||||||
|
{
|
||||||
|
if (!is_null($xOffset)) {
|
||||||
|
$this->setTopLeftXOffset($xOffset);
|
||||||
|
}
|
||||||
|
if (!is_null($yOffset)) {
|
||||||
|
$this->setTopLeftYOffset($yOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the offset position within the Top Left cell for the chart
|
||||||
|
*
|
||||||
|
* @return integer[]
|
||||||
|
*/
|
||||||
|
public function getTopLeftOffset()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'X' => $this->topLeftXOffset,
|
||||||
|
'Y' => $this->topLeftYOffset
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTopLeftXOffset($xOffset)
|
||||||
|
{
|
||||||
|
$this->topLeftXOffset = $xOffset;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTopLeftXOffset()
|
||||||
|
{
|
||||||
|
return $this->topLeftXOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTopLeftYOffset($yOffset)
|
||||||
|
{
|
||||||
|
$this->topLeftYOffset = $yOffset;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTopLeftYOffset()
|
||||||
|
{
|
||||||
|
return $this->topLeftYOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Bottom Right position of the chart
|
||||||
|
*
|
||||||
|
* @param string $cell
|
||||||
|
* @param integer $xOffset
|
||||||
|
* @param integer $yOffset
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setBottomRightPosition($cell, $xOffset = null, $yOffset = null)
|
||||||
|
{
|
||||||
|
$this->bottomRightCellRef = $cell;
|
||||||
|
if (!is_null($xOffset)) {
|
||||||
|
$this->setBottomRightXOffset($xOffset);
|
||||||
|
}
|
||||||
|
if (!is_null($yOffset)) {
|
||||||
|
$this->setBottomRightYOffset($yOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the bottom right position of the chart
|
||||||
|
*
|
||||||
|
* @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell
|
||||||
|
*/
|
||||||
|
public function getBottomRightPosition()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'cell' => $this->bottomRightCellRef,
|
||||||
|
'xOffset' => $this->bottomRightXOffset,
|
||||||
|
'yOffset' => $this->bottomRightYOffset
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setBottomRightCell($cell)
|
||||||
|
{
|
||||||
|
$this->bottomRightCellRef = $cell;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the cell address where the bottom right of the chart is fixed
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBottomRightCell()
|
||||||
|
{
|
||||||
|
return $this->bottomRightCellRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the offset position within the Bottom Right cell for the chart
|
||||||
|
*
|
||||||
|
* @param integer $xOffset
|
||||||
|
* @param integer $yOffset
|
||||||
|
* @return PHPExcel_Chart
|
||||||
|
*/
|
||||||
|
public function setBottomRightOffset($xOffset = null, $yOffset = null)
|
||||||
|
{
|
||||||
|
if (!is_null($xOffset)) {
|
||||||
|
$this->setBottomRightXOffset($xOffset);
|
||||||
|
}
|
||||||
|
if (!is_null($yOffset)) {
|
||||||
|
$this->setBottomRightYOffset($yOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the offset position within the Bottom Right cell for the chart
|
||||||
|
*
|
||||||
|
* @return integer[]
|
||||||
|
*/
|
||||||
|
public function getBottomRightOffset()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'X' => $this->bottomRightXOffset,
|
||||||
|
'Y' => $this->bottomRightYOffset
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setBottomRightXOffset($xOffset)
|
||||||
|
{
|
||||||
|
$this->bottomRightXOffset = $xOffset;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBottomRightXOffset()
|
||||||
|
{
|
||||||
|
return $this->bottomRightXOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setBottomRightYOffset($yOffset)
|
||||||
|
{
|
||||||
|
$this->bottomRightYOffset = $yOffset;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBottomRightYOffset()
|
||||||
|
{
|
||||||
|
return $this->bottomRightYOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function refresh()
|
||||||
|
{
|
||||||
|
if ($this->worksheet !== null) {
|
||||||
|
$this->plotArea->refresh($this->worksheet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render($outputDestination = null)
|
||||||
|
{
|
||||||
|
$libraryName = PHPExcel_Settings::getChartRendererName();
|
||||||
|
if (is_null($libraryName)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Ensure that data series values are up-to-date before we render
|
||||||
|
$this->refresh();
|
||||||
|
|
||||||
|
$libraryPath = PHPExcel_Settings::getChartRendererPath();
|
||||||
|
$includePath = str_replace('\\', '/', get_include_path());
|
||||||
|
$rendererPath = str_replace('\\', '/', $libraryPath);
|
||||||
|
if (strpos($rendererPath, $includePath) === false) {
|
||||||
|
set_include_path(get_include_path() . PATH_SEPARATOR . $libraryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rendererName = 'PHPExcel_Chart_Renderer_'.$libraryName;
|
||||||
|
$renderer = new $rendererName($this);
|
||||||
|
|
||||||
|
if ($outputDestination == 'php://output') {
|
||||||
|
$outputDestination = null;
|
||||||
|
}
|
||||||
|
return $renderer->render($outputDestination);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,561 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: Wiktor Trzonkowski
|
||||||
|
* Date: 6/17/14
|
||||||
|
* Time: 12:11 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PHPExcel_Chart_Axis extends PHPExcel_Chart_Properties
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Axis Number
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $axisNumber = array(
|
||||||
|
'format' => self::FORMAT_CODE_GENERAL,
|
||||||
|
'source_linked' => 1
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Axis Options
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $axisOptions = array(
|
||||||
|
'minimum' => null,
|
||||||
|
'maximum' => null,
|
||||||
|
'major_unit' => null,
|
||||||
|
'minor_unit' => null,
|
||||||
|
'orientation' => self::ORIENTATION_NORMAL,
|
||||||
|
'minor_tick_mark' => self::TICK_MARK_NONE,
|
||||||
|
'major_tick_mark' => self::TICK_MARK_NONE,
|
||||||
|
'axis_labels' => self::AXIS_LABELS_NEXT_TO,
|
||||||
|
'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO,
|
||||||
|
'horizontal_crosses_value' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill Properties
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $fillProperties = array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_ARGB,
|
||||||
|
'value' => null,
|
||||||
|
'alpha' => 0
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Line Properties
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $lineProperties = array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_ARGB,
|
||||||
|
'value' => null,
|
||||||
|
'alpha' => 0
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Line Style Properties
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $lineStyleProperties = array(
|
||||||
|
'width' => '9525',
|
||||||
|
'compound' => self::LINE_STYLE_COMPOUND_SIMPLE,
|
||||||
|
'dash' => self::LINE_STYLE_DASH_SOLID,
|
||||||
|
'cap' => self::LINE_STYLE_CAP_FLAT,
|
||||||
|
'join' => self::LINE_STYLE_JOIN_BEVEL,
|
||||||
|
'arrow' => array(
|
||||||
|
'head' => array(
|
||||||
|
'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,
|
||||||
|
'size' => self::LINE_STYLE_ARROW_SIZE_5
|
||||||
|
),
|
||||||
|
'end' => array(
|
||||||
|
'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,
|
||||||
|
'size' => self::LINE_STYLE_ARROW_SIZE_8
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shadow Properties
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $shadowProperties = array(
|
||||||
|
'presets' => self::SHADOW_PRESETS_NOSHADOW,
|
||||||
|
'effect' => null,
|
||||||
|
'color' => array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_STANDARD,
|
||||||
|
'value' => 'black',
|
||||||
|
'alpha' => 40,
|
||||||
|
),
|
||||||
|
'size' => array(
|
||||||
|
'sx' => null,
|
||||||
|
'sy' => null,
|
||||||
|
'kx' => null
|
||||||
|
),
|
||||||
|
'blur' => null,
|
||||||
|
'direction' => null,
|
||||||
|
'distance' => null,
|
||||||
|
'algn' => null,
|
||||||
|
'rotWithShape' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Glow Properties
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $glowProperties = array(
|
||||||
|
'size' => null,
|
||||||
|
'color' => array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_STANDARD,
|
||||||
|
'value' => 'black',
|
||||||
|
'alpha' => 40
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Soft Edge Properties
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $softEdges = array(
|
||||||
|
'size' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Series Data Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function setAxisNumberProperties($format_code)
|
||||||
|
{
|
||||||
|
$this->axisNumber['format'] = (string) $format_code;
|
||||||
|
$this->axisNumber['source_linked'] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Axis Number Format Data Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAxisNumberFormat()
|
||||||
|
{
|
||||||
|
return $this->axisNumber['format'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Axis Number Source Linked
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAxisNumberSourceLinked()
|
||||||
|
{
|
||||||
|
return (string) $this->axisNumber['source_linked'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Axis Options Properties
|
||||||
|
*
|
||||||
|
* @param string $axis_labels
|
||||||
|
* @param string $horizontal_crosses_value
|
||||||
|
* @param string $horizontal_crosses
|
||||||
|
* @param string $axis_orientation
|
||||||
|
* @param string $major_tmt
|
||||||
|
* @param string $minor_tmt
|
||||||
|
* @param string $minimum
|
||||||
|
* @param string $maximum
|
||||||
|
* @param string $major_unit
|
||||||
|
* @param string $minor_unit
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setAxisOptionsProperties($axis_labels, $horizontal_crosses_value = null, $horizontal_crosses = null, $axis_orientation = null, $major_tmt = null, $minor_tmt = null, $minimum = null, $maximum = null, $major_unit = null, $minor_unit = null)
|
||||||
|
{
|
||||||
|
$this->axisOptions['axis_labels'] = (string) $axis_labels;
|
||||||
|
($horizontal_crosses_value !== null) ? $this->axisOptions['horizontal_crosses_value'] = (string) $horizontal_crosses_value : null;
|
||||||
|
($horizontal_crosses !== null) ? $this->axisOptions['horizontal_crosses'] = (string) $horizontal_crosses : null;
|
||||||
|
($axis_orientation !== null) ? $this->axisOptions['orientation'] = (string) $axis_orientation : null;
|
||||||
|
($major_tmt !== null) ? $this->axisOptions['major_tick_mark'] = (string) $major_tmt : null;
|
||||||
|
($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null;
|
||||||
|
($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null;
|
||||||
|
($minimum !== null) ? $this->axisOptions['minimum'] = (string) $minimum : null;
|
||||||
|
($maximum !== null) ? $this->axisOptions['maximum'] = (string) $maximum : null;
|
||||||
|
($major_unit !== null) ? $this->axisOptions['major_unit'] = (string) $major_unit : null;
|
||||||
|
($minor_unit !== null) ? $this->axisOptions['minor_unit'] = (string) $minor_unit : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Axis Options Property
|
||||||
|
*
|
||||||
|
* @param string $property
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAxisOptionsProperty($property)
|
||||||
|
{
|
||||||
|
return $this->axisOptions[$property];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Axis Orientation Property
|
||||||
|
*
|
||||||
|
* @param string $orientation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setAxisOrientation($orientation)
|
||||||
|
{
|
||||||
|
$this->orientation = (string) $orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Fill Property
|
||||||
|
*
|
||||||
|
* @param string $color
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setFillParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB)
|
||||||
|
{
|
||||||
|
$this->fillProperties = $this->setColorProperties($color, $alpha, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Line Property
|
||||||
|
*
|
||||||
|
* @param string $color
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setLineParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB)
|
||||||
|
{
|
||||||
|
$this->lineProperties = $this->setColorProperties($color, $alpha, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Fill Property
|
||||||
|
*
|
||||||
|
* @param string $property
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFillProperty($property)
|
||||||
|
{
|
||||||
|
return $this->fillProperties[$property];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Property
|
||||||
|
*
|
||||||
|
* @param string $property
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLineProperty($property)
|
||||||
|
{
|
||||||
|
return $this->lineProperties[$property];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Line Style Properties
|
||||||
|
*
|
||||||
|
* @param float $line_width
|
||||||
|
* @param string $compound_type
|
||||||
|
* @param string $dash_type
|
||||||
|
* @param string $cap_type
|
||||||
|
* @param string $join_type
|
||||||
|
* @param string $head_arrow_type
|
||||||
|
* @param string $head_arrow_size
|
||||||
|
* @param string $end_arrow_type
|
||||||
|
* @param string $end_arrow_size
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null)
|
||||||
|
{
|
||||||
|
(!is_null($line_width)) ? $this->lineStyleProperties['width'] = $this->getExcelPointsWidth((float) $line_width) : null;
|
||||||
|
(!is_null($compound_type)) ? $this->lineStyleProperties['compound'] = (string) $compound_type : null;
|
||||||
|
(!is_null($dash_type)) ? $this->lineStyleProperties['dash'] = (string) $dash_type : null;
|
||||||
|
(!is_null($cap_type)) ? $this->lineStyleProperties['cap'] = (string) $cap_type : null;
|
||||||
|
(!is_null($join_type)) ? $this->lineStyleProperties['join'] = (string) $join_type : null;
|
||||||
|
(!is_null($head_arrow_type)) ? $this->lineStyleProperties['arrow']['head']['type'] = (string) $head_arrow_type : null;
|
||||||
|
(!is_null($head_arrow_size)) ? $this->lineStyleProperties['arrow']['head']['size'] = (string) $head_arrow_size : null;
|
||||||
|
(!is_null($end_arrow_type)) ? $this->lineStyleProperties['arrow']['end']['type'] = (string) $end_arrow_type : null;
|
||||||
|
(!is_null($end_arrow_size)) ? $this->lineStyleProperties['arrow']['end']['size'] = (string) $end_arrow_size : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Style Property
|
||||||
|
*
|
||||||
|
* @param array|string $elements
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLineStyleProperty($elements)
|
||||||
|
{
|
||||||
|
return $this->getArrayElementsValue($this->lineStyleProperties, $elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Style Arrow Excel Width
|
||||||
|
*
|
||||||
|
* @param string $arrow
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLineStyleArrowWidth($arrow)
|
||||||
|
{
|
||||||
|
return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'w');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Style Arrow Excel Length
|
||||||
|
*
|
||||||
|
* @param string $arrow
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLineStyleArrowLength($arrow)
|
||||||
|
{
|
||||||
|
return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'len');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Properties
|
||||||
|
*
|
||||||
|
* @param int $shadow_presets
|
||||||
|
* @param string $sh_color_value
|
||||||
|
* @param string $sh_color_type
|
||||||
|
* @param string $sh_color_alpha
|
||||||
|
* @param float $sh_blur
|
||||||
|
* @param int $sh_angle
|
||||||
|
* @param float $sh_distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null)
|
||||||
|
{
|
||||||
|
$this->setShadowPresetsProperties((int) $sh_presets)
|
||||||
|
->setShadowColor(
|
||||||
|
is_null($sh_color_value) ? $this->shadowProperties['color']['value'] : $sh_color_value,
|
||||||
|
is_null($sh_color_alpha) ? (int) $this->shadowProperties['color']['alpha'] : $sh_color_alpha,
|
||||||
|
is_null($sh_color_type) ? $this->shadowProperties['color']['type'] : $sh_color_type
|
||||||
|
)
|
||||||
|
->setShadowBlur($sh_blur)
|
||||||
|
->setShadowAngle($sh_angle)
|
||||||
|
->setShadowDistance($sh_distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Color
|
||||||
|
*
|
||||||
|
* @param int $shadow_presets
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setShadowPresetsProperties($shadow_presets)
|
||||||
|
{
|
||||||
|
$this->shadowProperties['presets'] = $shadow_presets;
|
||||||
|
$this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets));
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Properties from Maped Values
|
||||||
|
*
|
||||||
|
* @param array $properties_map
|
||||||
|
* @param * $reference
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setShadowProperiesMapValues(array $properties_map, &$reference = null)
|
||||||
|
{
|
||||||
|
$base_reference = $reference;
|
||||||
|
foreach ($properties_map as $property_key => $property_val) {
|
||||||
|
if (is_array($property_val)) {
|
||||||
|
if ($reference === null) {
|
||||||
|
$reference = & $this->shadowProperties[$property_key];
|
||||||
|
} else {
|
||||||
|
$reference = & $reference[$property_key];
|
||||||
|
}
|
||||||
|
$this->setShadowProperiesMapValues($property_val, $reference);
|
||||||
|
} else {
|
||||||
|
if ($base_reference === null) {
|
||||||
|
$this->shadowProperties[$property_key] = $property_val;
|
||||||
|
} else {
|
||||||
|
$reference[$property_key] = $property_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Color
|
||||||
|
*
|
||||||
|
* @param string $color
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setShadowColor($color, $alpha, $type)
|
||||||
|
{
|
||||||
|
$this->shadowProperties['color'] = $this->setColorProperties($color, $alpha, $type);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Blur
|
||||||
|
*
|
||||||
|
* @param float $blur
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setShadowBlur($blur)
|
||||||
|
{
|
||||||
|
if ($blur !== null) {
|
||||||
|
$this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Angle
|
||||||
|
*
|
||||||
|
* @param int $angle
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setShadowAngle($angle)
|
||||||
|
{
|
||||||
|
if ($angle !== null) {
|
||||||
|
$this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Distance
|
||||||
|
*
|
||||||
|
* @param float $distance
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setShadowDistance($distance)
|
||||||
|
{
|
||||||
|
if ($distance !== null) {
|
||||||
|
$this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Glow Property
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
* @param string $color_value
|
||||||
|
* @param int $color_alpha
|
||||||
|
* @param string $color_type
|
||||||
|
*/
|
||||||
|
public function getShadowProperty($elements)
|
||||||
|
{
|
||||||
|
return $this->getArrayElementsValue($this->shadowProperties, $elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Glow Properties
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
* @param string $color_value
|
||||||
|
* @param int $color_alpha
|
||||||
|
* @param string $color_type
|
||||||
|
*/
|
||||||
|
public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null)
|
||||||
|
{
|
||||||
|
$this->setGlowSize($size)
|
||||||
|
->setGlowColor(
|
||||||
|
is_null($color_value) ? $this->glowProperties['color']['value'] : $color_value,
|
||||||
|
is_null($color_alpha) ? (int) $this->glowProperties['color']['alpha'] : $color_alpha,
|
||||||
|
is_null($color_type) ? $this->glowProperties['color']['type'] : $color_type
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Glow Property
|
||||||
|
*
|
||||||
|
* @param array|string $property
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getGlowProperty($property)
|
||||||
|
{
|
||||||
|
return $this->getArrayElementsValue($this->glowProperties, $property);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Glow Color
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setGlowSize($size)
|
||||||
|
{
|
||||||
|
if (!is_null($size)) {
|
||||||
|
$this->glowProperties['size'] = $this->getExcelPointsWidth($size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Glow Color
|
||||||
|
*
|
||||||
|
* @param string $color
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Axis
|
||||||
|
*/
|
||||||
|
private function setGlowColor($color, $alpha, $type)
|
||||||
|
{
|
||||||
|
$this->glowProperties['color'] = $this->setColorProperties($color, $alpha, $type);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Soft Edges Size
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
*/
|
||||||
|
public function setSoftEdges($size)
|
||||||
|
{
|
||||||
|
if (!is_null($size)) {
|
||||||
|
$softEdges['size'] = (string) $this->getExcelPointsWidth($size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Soft Edges Size
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSoftEdgesSize()
|
||||||
|
{
|
||||||
|
return $this->softEdges['size'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,390 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHPExcel
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_DataSeries
|
||||||
|
*
|
||||||
|
* @category PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_DataSeries
|
||||||
|
{
|
||||||
|
const TYPE_BARCHART = 'barChart';
|
||||||
|
const TYPE_BARCHART_3D = 'bar3DChart';
|
||||||
|
const TYPE_LINECHART = 'lineChart';
|
||||||
|
const TYPE_LINECHART_3D = 'line3DChart';
|
||||||
|
const TYPE_AREACHART = 'areaChart';
|
||||||
|
const TYPE_AREACHART_3D = 'area3DChart';
|
||||||
|
const TYPE_PIECHART = 'pieChart';
|
||||||
|
const TYPE_PIECHART_3D = 'pie3DChart';
|
||||||
|
const TYPE_DOUGHTNUTCHART = 'doughnutChart';
|
||||||
|
const TYPE_DONUTCHART = self::TYPE_DOUGHTNUTCHART; // Synonym
|
||||||
|
const TYPE_SCATTERCHART = 'scatterChart';
|
||||||
|
const TYPE_SURFACECHART = 'surfaceChart';
|
||||||
|
const TYPE_SURFACECHART_3D = 'surface3DChart';
|
||||||
|
const TYPE_RADARCHART = 'radarChart';
|
||||||
|
const TYPE_BUBBLECHART = 'bubbleChart';
|
||||||
|
const TYPE_STOCKCHART = 'stockChart';
|
||||||
|
const TYPE_CANDLECHART = self::TYPE_STOCKCHART; // Synonym
|
||||||
|
|
||||||
|
const GROUPING_CLUSTERED = 'clustered';
|
||||||
|
const GROUPING_STACKED = 'stacked';
|
||||||
|
const GROUPING_PERCENT_STACKED = 'percentStacked';
|
||||||
|
const GROUPING_STANDARD = 'standard';
|
||||||
|
|
||||||
|
const DIRECTION_BAR = 'bar';
|
||||||
|
const DIRECTION_HORIZONTAL = self::DIRECTION_BAR;
|
||||||
|
const DIRECTION_COL = 'col';
|
||||||
|
const DIRECTION_COLUMN = self::DIRECTION_COL;
|
||||||
|
const DIRECTION_VERTICAL = self::DIRECTION_COL;
|
||||||
|
|
||||||
|
const STYLE_LINEMARKER = 'lineMarker';
|
||||||
|
const STYLE_SMOOTHMARKER = 'smoothMarker';
|
||||||
|
const STYLE_MARKER = 'marker';
|
||||||
|
const STYLE_FILLED = 'filled';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Series Plot Type
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $plotType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Grouping Type
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $plotGrouping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Direction
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $plotDirection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Style
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $plotStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Order of plots in Series
|
||||||
|
*
|
||||||
|
* @var array of integer
|
||||||
|
*/
|
||||||
|
private $plotOrder = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Label
|
||||||
|
*
|
||||||
|
* @var array of PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
private $plotLabel = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Category
|
||||||
|
*
|
||||||
|
* @var array of PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
private $plotCategory = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smooth Line
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $smoothLine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Values
|
||||||
|
*
|
||||||
|
* @var array of PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
private $plotValues = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function __construct($plotType = null, $plotGrouping = null, $plotOrder = array(), $plotLabel = array(), $plotCategory = array(), $plotValues = array(), $plotDirection = null, $smoothLine = null, $plotStyle = null)
|
||||||
|
{
|
||||||
|
$this->plotType = $plotType;
|
||||||
|
$this->plotGrouping = $plotGrouping;
|
||||||
|
$this->plotOrder = $plotOrder;
|
||||||
|
$keys = array_keys($plotValues);
|
||||||
|
$this->plotValues = $plotValues;
|
||||||
|
if ((count($plotLabel) == 0) || (is_null($plotLabel[$keys[0]]))) {
|
||||||
|
$plotLabel[$keys[0]] = new PHPExcel_Chart_DataSeriesValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->plotLabel = $plotLabel;
|
||||||
|
if ((count($plotCategory) == 0) || (is_null($plotCategory[$keys[0]]))) {
|
||||||
|
$plotCategory[$keys[0]] = new PHPExcel_Chart_DataSeriesValues();
|
||||||
|
}
|
||||||
|
$this->plotCategory = $plotCategory;
|
||||||
|
$this->smoothLine = $smoothLine;
|
||||||
|
$this->plotStyle = $plotStyle;
|
||||||
|
|
||||||
|
if (is_null($plotDirection)) {
|
||||||
|
$plotDirection = self::DIRECTION_COL;
|
||||||
|
}
|
||||||
|
$this->plotDirection = $plotDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPlotType()
|
||||||
|
{
|
||||||
|
return $this->plotType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Plot Type
|
||||||
|
*
|
||||||
|
* @param string $plotType
|
||||||
|
* @return PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function setPlotType($plotType = '')
|
||||||
|
{
|
||||||
|
$this->plotType = $plotType;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Grouping Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPlotGrouping()
|
||||||
|
{
|
||||||
|
return $this->plotGrouping;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Plot Grouping Type
|
||||||
|
*
|
||||||
|
* @param string $groupingType
|
||||||
|
* @return PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function setPlotGrouping($groupingType = null)
|
||||||
|
{
|
||||||
|
$this->plotGrouping = $groupingType;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Direction
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPlotDirection()
|
||||||
|
{
|
||||||
|
return $this->plotDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Plot Direction
|
||||||
|
*
|
||||||
|
* @param string $plotDirection
|
||||||
|
* @return PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function setPlotDirection($plotDirection = null)
|
||||||
|
{
|
||||||
|
$this->plotDirection = $plotDirection;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Order
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPlotOrder()
|
||||||
|
{
|
||||||
|
return $this->plotOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Labels
|
||||||
|
*
|
||||||
|
* @return array of PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function getPlotLabels()
|
||||||
|
{
|
||||||
|
return $this->plotLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Label by Index
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function getPlotLabelByIndex($index)
|
||||||
|
{
|
||||||
|
$keys = array_keys($this->plotLabel);
|
||||||
|
if (in_array($index, $keys)) {
|
||||||
|
return $this->plotLabel[$index];
|
||||||
|
} elseif (isset($keys[$index])) {
|
||||||
|
return $this->plotLabel[$keys[$index]];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Categories
|
||||||
|
*
|
||||||
|
* @return array of PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function getPlotCategories()
|
||||||
|
{
|
||||||
|
return $this->plotCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Category by Index
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function getPlotCategoryByIndex($index)
|
||||||
|
{
|
||||||
|
$keys = array_keys($this->plotCategory);
|
||||||
|
if (in_array($index, $keys)) {
|
||||||
|
return $this->plotCategory[$index];
|
||||||
|
} elseif (isset($keys[$index])) {
|
||||||
|
return $this->plotCategory[$keys[$index]];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Style
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPlotStyle()
|
||||||
|
{
|
||||||
|
return $this->plotStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Plot Style
|
||||||
|
*
|
||||||
|
* @param string $plotStyle
|
||||||
|
* @return PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function setPlotStyle($plotStyle = null)
|
||||||
|
{
|
||||||
|
$this->plotStyle = $plotStyle;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Values
|
||||||
|
*
|
||||||
|
* @return array of PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function getPlotValues()
|
||||||
|
{
|
||||||
|
return $this->plotValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Values by Index
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function getPlotValuesByIndex($index)
|
||||||
|
{
|
||||||
|
$keys = array_keys($this->plotValues);
|
||||||
|
if (in_array($index, $keys)) {
|
||||||
|
return $this->plotValues[$index];
|
||||||
|
} elseif (isset($keys[$index])) {
|
||||||
|
return $this->plotValues[$keys[$index]];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Number of Plot Series
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getPlotSeriesCount()
|
||||||
|
{
|
||||||
|
return count($this->plotValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Smooth Line
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getSmoothLine()
|
||||||
|
{
|
||||||
|
return $this->smoothLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Smooth Line
|
||||||
|
*
|
||||||
|
* @param boolean $smoothLine
|
||||||
|
* @return PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function setSmoothLine($smoothLine = true)
|
||||||
|
{
|
||||||
|
$this->smoothLine = $smoothLine;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function refresh(PHPExcel_Worksheet $worksheet)
|
||||||
|
{
|
||||||
|
foreach ($this->plotValues as $plotValues) {
|
||||||
|
if ($plotValues !== null) {
|
||||||
|
$plotValues->refresh($worksheet, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($this->plotLabel as $plotValues) {
|
||||||
|
if ($plotValues !== null) {
|
||||||
|
$plotValues->refresh($worksheet, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($this->plotCategory as $plotValues) {
|
||||||
|
if ($plotValues !== null) {
|
||||||
|
$plotValues->refresh($worksheet, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,333 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_DataSeriesValues
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_DataSeriesValues
|
||||||
|
{
|
||||||
|
|
||||||
|
const DATASERIES_TYPE_STRING = 'String';
|
||||||
|
const DATASERIES_TYPE_NUMBER = 'Number';
|
||||||
|
|
||||||
|
private static $dataTypeValues = array(
|
||||||
|
self::DATASERIES_TYPE_STRING,
|
||||||
|
self::DATASERIES_TYPE_NUMBER,
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Series Data Type
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $dataType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Series Data Source
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $dataSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format Code
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $formatCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Series Point Marker
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $pointMarker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Point Count (The number of datapoints in the dataseries)
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
private $pointCount = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Values
|
||||||
|
*
|
||||||
|
* @var array of mixed
|
||||||
|
*/
|
||||||
|
private $dataValues = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_DataSeriesValues object
|
||||||
|
*/
|
||||||
|
public function __construct($dataType = self::DATASERIES_TYPE_NUMBER, $dataSource = null, $formatCode = null, $pointCount = 0, $dataValues = array(), $marker = null)
|
||||||
|
{
|
||||||
|
$this->setDataType($dataType);
|
||||||
|
$this->dataSource = $dataSource;
|
||||||
|
$this->formatCode = $formatCode;
|
||||||
|
$this->pointCount = $pointCount;
|
||||||
|
$this->dataValues = $dataValues;
|
||||||
|
$this->pointMarker = $marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Series Data Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDataType()
|
||||||
|
{
|
||||||
|
return $this->dataType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Series Data Type
|
||||||
|
*
|
||||||
|
* @param string $dataType Datatype of this data series
|
||||||
|
* Typical values are:
|
||||||
|
* PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_STRING
|
||||||
|
* Normally used for axis point values
|
||||||
|
* PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_NUMBER
|
||||||
|
* Normally used for chart data values
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function setDataType($dataType = self::DATASERIES_TYPE_NUMBER)
|
||||||
|
{
|
||||||
|
if (!in_array($dataType, self::$dataTypeValues)) {
|
||||||
|
throw new PHPExcel_Chart_Exception('Invalid datatype for chart data series values');
|
||||||
|
}
|
||||||
|
$this->dataType = $dataType;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Series Data Source (formula)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDataSource()
|
||||||
|
{
|
||||||
|
return $this->dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Series Data Source (formula)
|
||||||
|
*
|
||||||
|
* @param string $dataSource
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function setDataSource($dataSource = null, $refreshDataValues = true)
|
||||||
|
{
|
||||||
|
$this->dataSource = $dataSource;
|
||||||
|
|
||||||
|
if ($refreshDataValues) {
|
||||||
|
// TO DO
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Point Marker
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPointMarker()
|
||||||
|
{
|
||||||
|
return $this->pointMarker;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Point Marker
|
||||||
|
*
|
||||||
|
* @param string $marker
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function setPointMarker($marker = null)
|
||||||
|
{
|
||||||
|
$this->pointMarker = $marker;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Series Format Code
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormatCode()
|
||||||
|
{
|
||||||
|
return $this->formatCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Series Format Code
|
||||||
|
*
|
||||||
|
* @param string $formatCode
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function setFormatCode($formatCode = null)
|
||||||
|
{
|
||||||
|
$this->formatCode = $formatCode;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Series Point Count
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getPointCount()
|
||||||
|
{
|
||||||
|
return $this->pointCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identify if the Data Series is a multi-level or a simple series
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function isMultiLevelSeries()
|
||||||
|
{
|
||||||
|
if (count($this->dataValues) > 0) {
|
||||||
|
return is_array($this->dataValues[0]);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the level count of a multi-level Data Series
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function multiLevelCount()
|
||||||
|
{
|
||||||
|
$levelCount = 0;
|
||||||
|
foreach ($this->dataValues as $dataValueSet) {
|
||||||
|
$levelCount = max($levelCount, count($dataValueSet));
|
||||||
|
}
|
||||||
|
return $levelCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Series Data Values
|
||||||
|
*
|
||||||
|
* @return array of mixed
|
||||||
|
*/
|
||||||
|
public function getDataValues()
|
||||||
|
{
|
||||||
|
return $this->dataValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the first Series Data value
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getDataValue()
|
||||||
|
{
|
||||||
|
$count = count($this->dataValues);
|
||||||
|
if ($count == 0) {
|
||||||
|
return null;
|
||||||
|
} elseif ($count == 1) {
|
||||||
|
return $this->dataValues[0];
|
||||||
|
}
|
||||||
|
return $this->dataValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Series Data Values
|
||||||
|
*
|
||||||
|
* @param array $dataValues
|
||||||
|
* @param boolean $refreshDataSource
|
||||||
|
* TRUE - refresh the value of dataSource based on the values of $dataValues
|
||||||
|
* FALSE - don't change the value of dataSource
|
||||||
|
* @return PHPExcel_Chart_DataSeriesValues
|
||||||
|
*/
|
||||||
|
public function setDataValues($dataValues = array(), $refreshDataSource = true)
|
||||||
|
{
|
||||||
|
$this->dataValues = PHPExcel_Calculation_Functions::flattenArray($dataValues);
|
||||||
|
$this->pointCount = count($dataValues);
|
||||||
|
|
||||||
|
if ($refreshDataSource) {
|
||||||
|
// TO DO
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function stripNulls($var)
|
||||||
|
{
|
||||||
|
return $var !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function refresh(PHPExcel_Worksheet $worksheet, $flatten = true)
|
||||||
|
{
|
||||||
|
if ($this->dataSource !== null) {
|
||||||
|
$calcEngine = PHPExcel_Calculation::getInstance($worksheet->getParent());
|
||||||
|
$newDataValues = PHPExcel_Calculation::unwrapResult(
|
||||||
|
$calcEngine->_calculateFormulaValue(
|
||||||
|
'='.$this->dataSource,
|
||||||
|
null,
|
||||||
|
$worksheet->getCell('A1')
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if ($flatten) {
|
||||||
|
$this->dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues);
|
||||||
|
foreach ($this->dataValues as &$dataValue) {
|
||||||
|
if ((!empty($dataValue)) && ($dataValue[0] == '#')) {
|
||||||
|
$dataValue = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset($dataValue);
|
||||||
|
} else {
|
||||||
|
$cellRange = explode('!', $this->dataSource);
|
||||||
|
if (count($cellRange) > 1) {
|
||||||
|
list(, $cellRange) = $cellRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dimensions = PHPExcel_Cell::rangeDimension(str_replace('$', '', $cellRange));
|
||||||
|
if (($dimensions[0] == 1) || ($dimensions[1] == 1)) {
|
||||||
|
$this->dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues);
|
||||||
|
} else {
|
||||||
|
$newArray = array_values(array_shift($newDataValues));
|
||||||
|
foreach ($newArray as $i => $newDataSet) {
|
||||||
|
$newArray[$i] = array($newDataSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($newDataValues as $newDataSet) {
|
||||||
|
$i = 0;
|
||||||
|
foreach ($newDataSet as $newDataVal) {
|
||||||
|
array_unshift($newArray[$i++], $newDataVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->dataValues = $newArray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->pointCount = count($this->dataValues);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_Exception
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_Exception extends PHPExcel_Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Error handler callback
|
||||||
|
*
|
||||||
|
* @param mixed $code
|
||||||
|
* @param mixed $string
|
||||||
|
* @param mixed $file
|
||||||
|
* @param mixed $line
|
||||||
|
* @param mixed $context
|
||||||
|
*/
|
||||||
|
public static function errorHandlerCallback($code, $string, $file, $line, $context)
|
||||||
|
{
|
||||||
|
$e = new self($string, $code);
|
||||||
|
$e->line = $line;
|
||||||
|
$e->file = $file;
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,472 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: Wiktor Trzonkowski
|
||||||
|
* Date: 7/2/14
|
||||||
|
* Time: 2:36 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PHPExcel_Chart_GridLines extends PHPExcel_Chart_Properties
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Properties of Class:
|
||||||
|
* Object State (State for Minor Tick Mark) @var bool
|
||||||
|
* Line Properties @var array of mixed
|
||||||
|
* Shadow Properties @var array of mixed
|
||||||
|
* Glow Properties @var array of mixed
|
||||||
|
* Soft Properties @var array of mixed
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
private $objectState = false;
|
||||||
|
|
||||||
|
private $lineProperties = array(
|
||||||
|
'color' => array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_STANDARD,
|
||||||
|
'value' => null,
|
||||||
|
'alpha' => 0
|
||||||
|
),
|
||||||
|
'style' => array(
|
||||||
|
'width' => '9525',
|
||||||
|
'compound' => self::LINE_STYLE_COMPOUND_SIMPLE,
|
||||||
|
'dash' => self::LINE_STYLE_DASH_SOLID,
|
||||||
|
'cap' => self::LINE_STYLE_CAP_FLAT,
|
||||||
|
'join' => self::LINE_STYLE_JOIN_BEVEL,
|
||||||
|
'arrow' => array(
|
||||||
|
'head' => array(
|
||||||
|
'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,
|
||||||
|
'size' => self::LINE_STYLE_ARROW_SIZE_5
|
||||||
|
),
|
||||||
|
'end' => array(
|
||||||
|
'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,
|
||||||
|
'size' => self::LINE_STYLE_ARROW_SIZE_8
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
private $shadowProperties = array(
|
||||||
|
'presets' => self::SHADOW_PRESETS_NOSHADOW,
|
||||||
|
'effect' => null,
|
||||||
|
'color' => array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_STANDARD,
|
||||||
|
'value' => 'black',
|
||||||
|
'alpha' => 85,
|
||||||
|
),
|
||||||
|
'size' => array(
|
||||||
|
'sx' => null,
|
||||||
|
'sy' => null,
|
||||||
|
'kx' => null
|
||||||
|
),
|
||||||
|
'blur' => null,
|
||||||
|
'direction' => null,
|
||||||
|
'distance' => null,
|
||||||
|
'algn' => null,
|
||||||
|
'rotWithShape' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
private $glowProperties = array(
|
||||||
|
'size' => null,
|
||||||
|
'color' => array(
|
||||||
|
'type' => self::EXCEL_COLOR_TYPE_STANDARD,
|
||||||
|
'value' => 'black',
|
||||||
|
'alpha' => 40
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
private $softEdges = array(
|
||||||
|
'size' => null
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Object State
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getObjectState()
|
||||||
|
{
|
||||||
|
return $this->objectState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change Object State to True
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function activateObject()
|
||||||
|
{
|
||||||
|
$this->objectState = true;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Line Color Properties
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function setLineColorProperties($value, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_STANDARD)
|
||||||
|
{
|
||||||
|
$this->activateObject()
|
||||||
|
->lineProperties['color'] = $this->setColorProperties(
|
||||||
|
$value,
|
||||||
|
$alpha,
|
||||||
|
$type
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Line Color Properties
|
||||||
|
*
|
||||||
|
* @param float $line_width
|
||||||
|
* @param string $compound_type
|
||||||
|
* @param string $dash_type
|
||||||
|
* @param string $cap_type
|
||||||
|
* @param string $join_type
|
||||||
|
* @param string $head_arrow_type
|
||||||
|
* @param string $head_arrow_size
|
||||||
|
* @param string $end_arrow_type
|
||||||
|
* @param string $end_arrow_size
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null)
|
||||||
|
{
|
||||||
|
$this->activateObject();
|
||||||
|
(!is_null($line_width))
|
||||||
|
? $this->lineProperties['style']['width'] = $this->getExcelPointsWidth((float) $line_width)
|
||||||
|
: null;
|
||||||
|
(!is_null($compound_type))
|
||||||
|
? $this->lineProperties['style']['compound'] = (string) $compound_type
|
||||||
|
: null;
|
||||||
|
(!is_null($dash_type))
|
||||||
|
? $this->lineProperties['style']['dash'] = (string) $dash_type
|
||||||
|
: null;
|
||||||
|
(!is_null($cap_type))
|
||||||
|
? $this->lineProperties['style']['cap'] = (string) $cap_type
|
||||||
|
: null;
|
||||||
|
(!is_null($join_type))
|
||||||
|
? $this->lineProperties['style']['join'] = (string) $join_type
|
||||||
|
: null;
|
||||||
|
(!is_null($head_arrow_type))
|
||||||
|
? $this->lineProperties['style']['arrow']['head']['type'] = (string) $head_arrow_type
|
||||||
|
: null;
|
||||||
|
(!is_null($head_arrow_size))
|
||||||
|
? $this->lineProperties['style']['arrow']['head']['size'] = (string) $head_arrow_size
|
||||||
|
: null;
|
||||||
|
(!is_null($end_arrow_type))
|
||||||
|
? $this->lineProperties['style']['arrow']['end']['type'] = (string) $end_arrow_type
|
||||||
|
: null;
|
||||||
|
(!is_null($end_arrow_size))
|
||||||
|
? $this->lineProperties['style']['arrow']['end']['size'] = (string) $end_arrow_size
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Color Property
|
||||||
|
*
|
||||||
|
* @param string $parameter
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getLineColorProperty($parameter)
|
||||||
|
{
|
||||||
|
return $this->lineProperties['color'][$parameter];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Style Property
|
||||||
|
*
|
||||||
|
* @param array|string $elements
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getLineStyleProperty($elements)
|
||||||
|
{
|
||||||
|
return $this->getArrayElementsValue($this->lineProperties['style'], $elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Glow Properties
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
* @param string $color_value
|
||||||
|
* @param int $color_alpha
|
||||||
|
* @param string $color_type
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null)
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->activateObject()
|
||||||
|
->setGlowSize($size)
|
||||||
|
->setGlowColor($color_value, $color_alpha, $color_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Glow Color Property
|
||||||
|
*
|
||||||
|
* @param string $property
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getGlowColor($property)
|
||||||
|
{
|
||||||
|
return $this->glowProperties['color'][$property];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Glow Size
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getGlowSize()
|
||||||
|
{
|
||||||
|
return $this->glowProperties['size'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Glow Size
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function setGlowSize($size)
|
||||||
|
{
|
||||||
|
$this->glowProperties['size'] = $this->getExcelPointsWidth((float) $size);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Glow Color
|
||||||
|
*
|
||||||
|
* @param string $color
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function setGlowColor($color, $alpha, $type)
|
||||||
|
{
|
||||||
|
if (!is_null($color)) {
|
||||||
|
$this->glowProperties['color']['value'] = (string) $color;
|
||||||
|
}
|
||||||
|
if (!is_null($alpha)) {
|
||||||
|
$this->glowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha);
|
||||||
|
}
|
||||||
|
if (!is_null($type)) {
|
||||||
|
$this->glowProperties['color']['type'] = (string) $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Line Style Arrow Parameters
|
||||||
|
*
|
||||||
|
* @param string $arrow_selector
|
||||||
|
* @param string $property_selector
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getLineStyleArrowParameters($arrow_selector, $property_selector)
|
||||||
|
{
|
||||||
|
return $this->getLineStyleArrowSize($this->lineProperties['style']['arrow'][$arrow_selector]['size'], $property_selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Properties
|
||||||
|
*
|
||||||
|
* @param int $sh_presets
|
||||||
|
* @param string $sh_color_value
|
||||||
|
* @param string $sh_color_type
|
||||||
|
* @param int $sh_color_alpha
|
||||||
|
* @param string $sh_blur
|
||||||
|
* @param int $sh_angle
|
||||||
|
* @param float $sh_distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null)
|
||||||
|
{
|
||||||
|
$this->activateObject()
|
||||||
|
->setShadowPresetsProperties((int) $sh_presets)
|
||||||
|
->setShadowColor(
|
||||||
|
is_null($sh_color_value) ? $this->shadowProperties['color']['value'] : $sh_color_value,
|
||||||
|
is_null($sh_color_alpha) ? (int) $this->shadowProperties['color']['alpha'] : $this->getTrueAlpha($sh_color_alpha),
|
||||||
|
is_null($sh_color_type) ? $this->shadowProperties['color']['type'] : $sh_color_type
|
||||||
|
)
|
||||||
|
->setShadowBlur($sh_blur)
|
||||||
|
->setShadowAngle($sh_angle)
|
||||||
|
->setShadowDistance($sh_distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Presets Properties
|
||||||
|
*
|
||||||
|
* @param int $shadow_presets
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function setShadowPresetsProperties($shadow_presets)
|
||||||
|
{
|
||||||
|
$this->shadowProperties['presets'] = $shadow_presets;
|
||||||
|
$this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets));
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Properties Values
|
||||||
|
*
|
||||||
|
* @param array $properties_map
|
||||||
|
* @param * $reference
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function setShadowProperiesMapValues(array $properties_map, &$reference = null)
|
||||||
|
{
|
||||||
|
$base_reference = $reference;
|
||||||
|
foreach ($properties_map as $property_key => $property_val) {
|
||||||
|
if (is_array($property_val)) {
|
||||||
|
if ($reference === null) {
|
||||||
|
$reference = & $this->shadowProperties[$property_key];
|
||||||
|
} else {
|
||||||
|
$reference = & $reference[$property_key];
|
||||||
|
}
|
||||||
|
$this->setShadowProperiesMapValues($property_val, $reference);
|
||||||
|
} else {
|
||||||
|
if ($base_reference === null) {
|
||||||
|
$this->shadowProperties[$property_key] = $property_val;
|
||||||
|
} else {
|
||||||
|
$reference[$property_key] = $property_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Color
|
||||||
|
*
|
||||||
|
* @param string $color
|
||||||
|
* @param int $alpha
|
||||||
|
* @param string $type
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
private function setShadowColor($color, $alpha, $type)
|
||||||
|
{
|
||||||
|
if (!is_null($color)) {
|
||||||
|
$this->shadowProperties['color']['value'] = (string) $color;
|
||||||
|
}
|
||||||
|
if (!is_null($alpha)) {
|
||||||
|
$this->shadowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha);
|
||||||
|
}
|
||||||
|
if (!is_null($type)) {
|
||||||
|
$this->shadowProperties['color']['type'] = (string) $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Blur
|
||||||
|
*
|
||||||
|
* @param float $blur
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
private function setShadowBlur($blur)
|
||||||
|
{
|
||||||
|
if ($blur !== null) {
|
||||||
|
$this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Angle
|
||||||
|
*
|
||||||
|
* @param int $angle
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function setShadowAngle($angle)
|
||||||
|
{
|
||||||
|
if ($angle !== null) {
|
||||||
|
$this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Shadow Distance
|
||||||
|
*
|
||||||
|
* @param float $distance
|
||||||
|
* @return PHPExcel_Chart_GridLines
|
||||||
|
*/
|
||||||
|
private function setShadowDistance($distance)
|
||||||
|
{
|
||||||
|
if ($distance !== null) {
|
||||||
|
$this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Shadow Property
|
||||||
|
*
|
||||||
|
* @param string $elements
|
||||||
|
* @param array $elements
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getShadowProperty($elements)
|
||||||
|
{
|
||||||
|
return $this->getArrayElementsValue($this->shadowProperties, $elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Soft Edges Size
|
||||||
|
*
|
||||||
|
* @param float $size
|
||||||
|
*/
|
||||||
|
public function setSoftEdgesSize($size)
|
||||||
|
{
|
||||||
|
if (!is_null($size)) {
|
||||||
|
$this->activateObject();
|
||||||
|
$softEdges['size'] = (string) $this->getExcelPointsWidth($size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Soft Edges Size
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSoftEdgesSize()
|
||||||
|
{
|
||||||
|
return $this->softEdges['size'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,486 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHPExcel
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_Layout
|
||||||
|
*
|
||||||
|
* @category PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_Layout
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* layoutTarget
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $layoutTarget;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* X Mode
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $xMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Y Mode
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $yMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* X-Position
|
||||||
|
*
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $xPos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Y-Position
|
||||||
|
*
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $yPos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* width
|
||||||
|
*
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $width;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* height
|
||||||
|
*
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show legend key
|
||||||
|
* Specifies that legend keys should be shown in data labels
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showLegendKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show value
|
||||||
|
* Specifies that the value should be shown in a data label.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showVal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show category name
|
||||||
|
* Specifies that the category name should be shown in the data label.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showCatName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show data series name
|
||||||
|
* Specifies that the series name should be shown in the data label.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showSerName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show percentage
|
||||||
|
* Specifies that the percentage should be shown in the data label.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showPercent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show bubble size
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showBubbleSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show leader lines
|
||||||
|
* Specifies that leader lines should be shown for the data label.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $showLeaderLines;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function __construct($layout = array())
|
||||||
|
{
|
||||||
|
if (isset($layout['layoutTarget'])) {
|
||||||
|
$this->layoutTarget = $layout['layoutTarget'];
|
||||||
|
}
|
||||||
|
if (isset($layout['xMode'])) {
|
||||||
|
$this->xMode = $layout['xMode'];
|
||||||
|
}
|
||||||
|
if (isset($layout['yMode'])) {
|
||||||
|
$this->yMode = $layout['yMode'];
|
||||||
|
}
|
||||||
|
if (isset($layout['x'])) {
|
||||||
|
$this->xPos = (float) $layout['x'];
|
||||||
|
}
|
||||||
|
if (isset($layout['y'])) {
|
||||||
|
$this->yPos = (float) $layout['y'];
|
||||||
|
}
|
||||||
|
if (isset($layout['w'])) {
|
||||||
|
$this->width = (float) $layout['w'];
|
||||||
|
}
|
||||||
|
if (isset($layout['h'])) {
|
||||||
|
$this->height = (float) $layout['h'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Layout Target
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLayoutTarget()
|
||||||
|
{
|
||||||
|
return $this->layoutTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Layout Target
|
||||||
|
*
|
||||||
|
* @param Layout Target $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setLayoutTarget($value)
|
||||||
|
{
|
||||||
|
$this->layoutTarget = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get X-Mode
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getXMode()
|
||||||
|
{
|
||||||
|
return $this->xMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set X-Mode
|
||||||
|
*
|
||||||
|
* @param X-Mode $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setXMode($value)
|
||||||
|
{
|
||||||
|
$this->xMode = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Y-Mode
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getYMode()
|
||||||
|
{
|
||||||
|
return $this->yMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Y-Mode
|
||||||
|
*
|
||||||
|
* @param Y-Mode $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setYMode($value)
|
||||||
|
{
|
||||||
|
$this->yMode = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get X-Position
|
||||||
|
*
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
public function getXPosition()
|
||||||
|
{
|
||||||
|
return $this->xPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set X-Position
|
||||||
|
*
|
||||||
|
* @param X-Position $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setXPosition($value)
|
||||||
|
{
|
||||||
|
$this->xPos = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Y-Position
|
||||||
|
*
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
public function getYPosition()
|
||||||
|
{
|
||||||
|
return $this->yPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Y-Position
|
||||||
|
*
|
||||||
|
* @param Y-Position $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setYPosition($value)
|
||||||
|
{
|
||||||
|
$this->yPos = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Width
|
||||||
|
*
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
public function getWidth()
|
||||||
|
{
|
||||||
|
return $this->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Width
|
||||||
|
*
|
||||||
|
* @param Width $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setWidth($value)
|
||||||
|
{
|
||||||
|
$this->width = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Height
|
||||||
|
*
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
public function getHeight()
|
||||||
|
{
|
||||||
|
return $this->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Height
|
||||||
|
*
|
||||||
|
* @param Height $value
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setHeight($value)
|
||||||
|
{
|
||||||
|
$this->height = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show legend key
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowLegendKey()
|
||||||
|
{
|
||||||
|
return $this->showLegendKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show legend key
|
||||||
|
* Specifies that legend keys should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show legend key
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowLegendKey($value)
|
||||||
|
{
|
||||||
|
$this->showLegendKey = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show value
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowVal()
|
||||||
|
{
|
||||||
|
return $this->showVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show val
|
||||||
|
* Specifies that the value should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show val
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowVal($value)
|
||||||
|
{
|
||||||
|
$this->showVal = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show category name
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowCatName()
|
||||||
|
{
|
||||||
|
return $this->showCatName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show cat name
|
||||||
|
* Specifies that the category name should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show cat name
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowCatName($value)
|
||||||
|
{
|
||||||
|
$this->showCatName = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show data series name
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowSerName()
|
||||||
|
{
|
||||||
|
return $this->showSerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show ser name
|
||||||
|
* Specifies that the series name should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show series name
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowSerName($value)
|
||||||
|
{
|
||||||
|
$this->showSerName = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show percentage
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowPercent()
|
||||||
|
{
|
||||||
|
return $this->showPercent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show percentage
|
||||||
|
* Specifies that the percentage should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show percentage
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowPercent($value)
|
||||||
|
{
|
||||||
|
$this->showPercent = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show bubble size
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowBubbleSize()
|
||||||
|
{
|
||||||
|
return $this->showBubbleSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show bubble size
|
||||||
|
* Specifies that the bubble size should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show bubble size
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowBubbleSize($value)
|
||||||
|
{
|
||||||
|
$this->showBubbleSize = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get show leader lines
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getShowLeaderLines()
|
||||||
|
{
|
||||||
|
return $this->showLeaderLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set show leader lines
|
||||||
|
* Specifies that leader lines should be shown in data labels.
|
||||||
|
*
|
||||||
|
* @param boolean $value Show leader lines
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function setShowLeaderLines($value)
|
||||||
|
{
|
||||||
|
$this->showLeaderLines = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,170 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_Legend
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_Legend
|
||||||
|
{
|
||||||
|
/** Legend positions */
|
||||||
|
const xlLegendPositionBottom = -4107; // Below the chart.
|
||||||
|
const xlLegendPositionCorner = 2; // In the upper right-hand corner of the chart border.
|
||||||
|
const xlLegendPositionCustom = -4161; // A custom position.
|
||||||
|
const xlLegendPositionLeft = -4131; // Left of the chart.
|
||||||
|
const xlLegendPositionRight = -4152; // Right of the chart.
|
||||||
|
const xlLegendPositionTop = -4160; // Above the chart.
|
||||||
|
|
||||||
|
const POSITION_RIGHT = 'r';
|
||||||
|
const POSITION_LEFT = 'l';
|
||||||
|
const POSITION_BOTTOM = 'b';
|
||||||
|
const POSITION_TOP = 't';
|
||||||
|
const POSITION_TOPRIGHT = 'tr';
|
||||||
|
|
||||||
|
private static $positionXLref = array(
|
||||||
|
self::xlLegendPositionBottom => self::POSITION_BOTTOM,
|
||||||
|
self::xlLegendPositionCorner => self::POSITION_TOPRIGHT,
|
||||||
|
self::xlLegendPositionCustom => '??',
|
||||||
|
self::xlLegendPositionLeft => self::POSITION_LEFT,
|
||||||
|
self::xlLegendPositionRight => self::POSITION_RIGHT,
|
||||||
|
self::xlLegendPositionTop => self::POSITION_TOP
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Legend position
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $position = self::POSITION_RIGHT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow overlay of other elements?
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $overlay = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Legend Layout
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
private $layout = null;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_Legend
|
||||||
|
*/
|
||||||
|
public function __construct($position = self::POSITION_RIGHT, PHPExcel_Chart_Layout $layout = null, $overlay = false)
|
||||||
|
{
|
||||||
|
$this->setPosition($position);
|
||||||
|
$this->layout = $layout;
|
||||||
|
$this->setOverlay($overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get legend position as an excel string value
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPosition()
|
||||||
|
{
|
||||||
|
return $this->position;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get legend position using an excel string value
|
||||||
|
*
|
||||||
|
* @param string $position
|
||||||
|
*/
|
||||||
|
public function setPosition($position = self::POSITION_RIGHT)
|
||||||
|
{
|
||||||
|
if (!in_array($position, self::$positionXLref)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->position = $position;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get legend position as an Excel internal numeric value
|
||||||
|
*
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
public function getPositionXL()
|
||||||
|
{
|
||||||
|
return array_search($this->position, self::$positionXLref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set legend position using an Excel internal numeric value
|
||||||
|
*
|
||||||
|
* @param number $positionXL
|
||||||
|
*/
|
||||||
|
public function setPositionXL($positionXL = self::xlLegendPositionRight)
|
||||||
|
{
|
||||||
|
if (!array_key_exists($positionXL, self::$positionXLref)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->position = self::$positionXLref[$positionXL];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get allow overlay of other elements?
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getOverlay()
|
||||||
|
{
|
||||||
|
return $this->overlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set allow overlay of other elements?
|
||||||
|
*
|
||||||
|
* @param boolean $overlay
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function setOverlay($overlay = false)
|
||||||
|
{
|
||||||
|
if (!is_bool($overlay)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->overlay = $overlay;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Layout
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function getLayout()
|
||||||
|
{
|
||||||
|
return $this->layout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,126 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_PlotArea
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_PlotArea
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* PlotArea Layout
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
private $layout = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plot Series
|
||||||
|
*
|
||||||
|
* @var array of PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
private $plotSeries = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_PlotArea
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_Chart_Layout $layout = null, $plotSeries = array())
|
||||||
|
{
|
||||||
|
$this->layout = $layout;
|
||||||
|
$this->plotSeries = $plotSeries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Layout
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function getLayout()
|
||||||
|
{
|
||||||
|
return $this->layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Number of Plot Groups
|
||||||
|
*
|
||||||
|
* @return array of PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function getPlotGroupCount()
|
||||||
|
{
|
||||||
|
return count($this->plotSeries);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Number of Plot Series
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getPlotSeriesCount()
|
||||||
|
{
|
||||||
|
$seriesCount = 0;
|
||||||
|
foreach ($this->plotSeries as $plot) {
|
||||||
|
$seriesCount += $plot->getPlotSeriesCount();
|
||||||
|
}
|
||||||
|
return $seriesCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Series
|
||||||
|
*
|
||||||
|
* @return array of PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function getPlotGroup()
|
||||||
|
{
|
||||||
|
return $this->plotSeries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Plot Series by Index
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_DataSeries
|
||||||
|
*/
|
||||||
|
public function getPlotGroupByIndex($index)
|
||||||
|
{
|
||||||
|
return $this->plotSeries[$index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Plot Series
|
||||||
|
*
|
||||||
|
* @param [PHPExcel_Chart_DataSeries]
|
||||||
|
* @return PHPExcel_Chart_PlotArea
|
||||||
|
*/
|
||||||
|
public function setPlotSeries($plotSeries = array())
|
||||||
|
{
|
||||||
|
$this->plotSeries = $plotSeries;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function refresh(PHPExcel_Worksheet $worksheet)
|
||||||
|
{
|
||||||
|
foreach ($this->plotSeries as $plotSeries) {
|
||||||
|
$plotSeries->refresh($worksheet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,363 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: nhw2h8s
|
||||||
|
* Date: 7/2/14
|
||||||
|
* Time: 5:45 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract class PHPExcel_Chart_Properties
|
||||||
|
{
|
||||||
|
const
|
||||||
|
EXCEL_COLOR_TYPE_STANDARD = 'prstClr',
|
||||||
|
EXCEL_COLOR_TYPE_SCHEME = 'schemeClr',
|
||||||
|
EXCEL_COLOR_TYPE_ARGB = 'srgbClr';
|
||||||
|
|
||||||
|
const
|
||||||
|
AXIS_LABELS_LOW = 'low',
|
||||||
|
AXIS_LABELS_HIGH = 'high',
|
||||||
|
AXIS_LABELS_NEXT_TO = 'nextTo',
|
||||||
|
AXIS_LABELS_NONE = 'none';
|
||||||
|
|
||||||
|
const
|
||||||
|
TICK_MARK_NONE = 'none',
|
||||||
|
TICK_MARK_INSIDE = 'in',
|
||||||
|
TICK_MARK_OUTSIDE = 'out',
|
||||||
|
TICK_MARK_CROSS = 'cross';
|
||||||
|
|
||||||
|
const
|
||||||
|
HORIZONTAL_CROSSES_AUTOZERO = 'autoZero',
|
||||||
|
HORIZONTAL_CROSSES_MAXIMUM = 'max';
|
||||||
|
|
||||||
|
const
|
||||||
|
FORMAT_CODE_GENERAL = 'General',
|
||||||
|
FORMAT_CODE_NUMBER = '#,##0.00',
|
||||||
|
FORMAT_CODE_CURRENCY = '$#,##0.00',
|
||||||
|
FORMAT_CODE_ACCOUNTING = '_($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)',
|
||||||
|
FORMAT_CODE_DATE = 'm/d/yyyy',
|
||||||
|
FORMAT_CODE_TIME = '[$-F400]h:mm:ss AM/PM',
|
||||||
|
FORMAT_CODE_PERCENTAGE = '0.00%',
|
||||||
|
FORMAT_CODE_FRACTION = '# ?/?',
|
||||||
|
FORMAT_CODE_SCIENTIFIC = '0.00E+00',
|
||||||
|
FORMAT_CODE_TEXT = '@',
|
||||||
|
FORMAT_CODE_SPECIAL = '00000';
|
||||||
|
|
||||||
|
const
|
||||||
|
ORIENTATION_NORMAL = 'minMax',
|
||||||
|
ORIENTATION_REVERSED = 'maxMin';
|
||||||
|
|
||||||
|
const
|
||||||
|
LINE_STYLE_COMPOUND_SIMPLE = 'sng',
|
||||||
|
LINE_STYLE_COMPOUND_DOUBLE = 'dbl',
|
||||||
|
LINE_STYLE_COMPOUND_THICKTHIN = 'thickThin',
|
||||||
|
LINE_STYLE_COMPOUND_THINTHICK = 'thinThick',
|
||||||
|
LINE_STYLE_COMPOUND_TRIPLE = 'tri',
|
||||||
|
|
||||||
|
LINE_STYLE_DASH_SOLID = 'solid',
|
||||||
|
LINE_STYLE_DASH_ROUND_DOT = 'sysDot',
|
||||||
|
LINE_STYLE_DASH_SQUERE_DOT = 'sysDash',
|
||||||
|
LINE_STYPE_DASH_DASH = 'dash',
|
||||||
|
LINE_STYLE_DASH_DASH_DOT = 'dashDot',
|
||||||
|
LINE_STYLE_DASH_LONG_DASH = 'lgDash',
|
||||||
|
LINE_STYLE_DASH_LONG_DASH_DOT = 'lgDashDot',
|
||||||
|
LINE_STYLE_DASH_LONG_DASH_DOT_DOT = 'lgDashDotDot',
|
||||||
|
|
||||||
|
LINE_STYLE_CAP_SQUARE = 'sq',
|
||||||
|
LINE_STYLE_CAP_ROUND = 'rnd',
|
||||||
|
LINE_STYLE_CAP_FLAT = 'flat',
|
||||||
|
|
||||||
|
LINE_STYLE_JOIN_ROUND = 'bevel',
|
||||||
|
LINE_STYLE_JOIN_MITER = 'miter',
|
||||||
|
LINE_STYLE_JOIN_BEVEL = 'bevel',
|
||||||
|
|
||||||
|
LINE_STYLE_ARROW_TYPE_NOARROW = null,
|
||||||
|
LINE_STYLE_ARROW_TYPE_ARROW = 'triangle',
|
||||||
|
LINE_STYLE_ARROW_TYPE_OPEN = 'arrow',
|
||||||
|
LINE_STYLE_ARROW_TYPE_STEALTH = 'stealth',
|
||||||
|
LINE_STYLE_ARROW_TYPE_DIAMOND = 'diamond',
|
||||||
|
LINE_STYLE_ARROW_TYPE_OVAL = 'oval',
|
||||||
|
|
||||||
|
LINE_STYLE_ARROW_SIZE_1 = 1,
|
||||||
|
LINE_STYLE_ARROW_SIZE_2 = 2,
|
||||||
|
LINE_STYLE_ARROW_SIZE_3 = 3,
|
||||||
|
LINE_STYLE_ARROW_SIZE_4 = 4,
|
||||||
|
LINE_STYLE_ARROW_SIZE_5 = 5,
|
||||||
|
LINE_STYLE_ARROW_SIZE_6 = 6,
|
||||||
|
LINE_STYLE_ARROW_SIZE_7 = 7,
|
||||||
|
LINE_STYLE_ARROW_SIZE_8 = 8,
|
||||||
|
LINE_STYLE_ARROW_SIZE_9 = 9;
|
||||||
|
|
||||||
|
const
|
||||||
|
SHADOW_PRESETS_NOSHADOW = null,
|
||||||
|
SHADOW_PRESETS_OUTER_BOTTTOM_RIGHT = 1,
|
||||||
|
SHADOW_PRESETS_OUTER_BOTTOM = 2,
|
||||||
|
SHADOW_PRESETS_OUTER_BOTTOM_LEFT = 3,
|
||||||
|
SHADOW_PRESETS_OUTER_RIGHT = 4,
|
||||||
|
SHADOW_PRESETS_OUTER_CENTER = 5,
|
||||||
|
SHADOW_PRESETS_OUTER_LEFT = 6,
|
||||||
|
SHADOW_PRESETS_OUTER_TOP_RIGHT = 7,
|
||||||
|
SHADOW_PRESETS_OUTER_TOP = 8,
|
||||||
|
SHADOW_PRESETS_OUTER_TOP_LEFT = 9,
|
||||||
|
SHADOW_PRESETS_INNER_BOTTTOM_RIGHT = 10,
|
||||||
|
SHADOW_PRESETS_INNER_BOTTOM = 11,
|
||||||
|
SHADOW_PRESETS_INNER_BOTTOM_LEFT = 12,
|
||||||
|
SHADOW_PRESETS_INNER_RIGHT = 13,
|
||||||
|
SHADOW_PRESETS_INNER_CENTER = 14,
|
||||||
|
SHADOW_PRESETS_INNER_LEFT = 15,
|
||||||
|
SHADOW_PRESETS_INNER_TOP_RIGHT = 16,
|
||||||
|
SHADOW_PRESETS_INNER_TOP = 17,
|
||||||
|
SHADOW_PRESETS_INNER_TOP_LEFT = 18,
|
||||||
|
SHADOW_PRESETS_PERSPECTIVE_BELOW = 19,
|
||||||
|
SHADOW_PRESETS_PERSPECTIVE_UPPER_RIGHT = 20,
|
||||||
|
SHADOW_PRESETS_PERSPECTIVE_UPPER_LEFT = 21,
|
||||||
|
SHADOW_PRESETS_PERSPECTIVE_LOWER_RIGHT = 22,
|
||||||
|
SHADOW_PRESETS_PERSPECTIVE_LOWER_LEFT = 23;
|
||||||
|
|
||||||
|
protected function getExcelPointsWidth($width)
|
||||||
|
{
|
||||||
|
return $width * 12700;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getExcelPointsAngle($angle)
|
||||||
|
{
|
||||||
|
return $angle * 60000;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getTrueAlpha($alpha)
|
||||||
|
{
|
||||||
|
return (string) 100 - $alpha . '000';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setColorProperties($color, $alpha, $type)
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'type' => (string) $type,
|
||||||
|
'value' => (string) $color,
|
||||||
|
'alpha' => (string) $this->getTrueAlpha($alpha)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getLineStyleArrowSize($array_selector, $array_kay_selector)
|
||||||
|
{
|
||||||
|
$sizes = array(
|
||||||
|
1 => array('w' => 'sm', 'len' => 'sm'),
|
||||||
|
2 => array('w' => 'sm', 'len' => 'med'),
|
||||||
|
3 => array('w' => 'sm', 'len' => 'lg'),
|
||||||
|
4 => array('w' => 'med', 'len' => 'sm'),
|
||||||
|
5 => array('w' => 'med', 'len' => 'med'),
|
||||||
|
6 => array('w' => 'med', 'len' => 'lg'),
|
||||||
|
7 => array('w' => 'lg', 'len' => 'sm'),
|
||||||
|
8 => array('w' => 'lg', 'len' => 'med'),
|
||||||
|
9 => array('w' => 'lg', 'len' => 'lg')
|
||||||
|
);
|
||||||
|
|
||||||
|
return $sizes[$array_selector][$array_kay_selector];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getShadowPresetsMap($shadow_presets_option)
|
||||||
|
{
|
||||||
|
$presets_options = array(
|
||||||
|
//OUTER
|
||||||
|
1 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '2700000',
|
||||||
|
'algn' => 'tl',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
2 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '5400000',
|
||||||
|
'algn' => 't',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
3 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '8100000',
|
||||||
|
'algn' => 'tr',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
4 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'algn' => 'l',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
5 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'size' => array(
|
||||||
|
'sx' => '102000',
|
||||||
|
'sy' => '102000'
|
||||||
|
)
|
||||||
|
,
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '38100',
|
||||||
|
'algn' => 'ctr',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
6 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '10800000',
|
||||||
|
'algn' => 'r',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
7 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '18900000',
|
||||||
|
'algn' => 'bl',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
8 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '16200000',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
9 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '50800',
|
||||||
|
'distance' => '38100',
|
||||||
|
'direction' => '13500000',
|
||||||
|
'algn' => 'br',
|
||||||
|
'rotWithShape' => '0'
|
||||||
|
),
|
||||||
|
//INNER
|
||||||
|
10 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '2700000',
|
||||||
|
),
|
||||||
|
11 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '5400000',
|
||||||
|
),
|
||||||
|
12 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '8100000',
|
||||||
|
),
|
||||||
|
13 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
),
|
||||||
|
14 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '114300',
|
||||||
|
),
|
||||||
|
15 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '10800000',
|
||||||
|
),
|
||||||
|
16 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '18900000',
|
||||||
|
),
|
||||||
|
17 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '16200000',
|
||||||
|
),
|
||||||
|
18 => array(
|
||||||
|
'effect' => 'innerShdw',
|
||||||
|
'blur' => '63500',
|
||||||
|
'distance' => '50800',
|
||||||
|
'direction' => '13500000',
|
||||||
|
),
|
||||||
|
//perspective
|
||||||
|
19 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '152400',
|
||||||
|
'distance' => '317500',
|
||||||
|
'size' => array(
|
||||||
|
'sx' => '90000',
|
||||||
|
'sy' => '-19000',
|
||||||
|
),
|
||||||
|
'direction' => '5400000',
|
||||||
|
'rotWithShape' => '0',
|
||||||
|
),
|
||||||
|
20 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '76200',
|
||||||
|
'direction' => '18900000',
|
||||||
|
'size' => array(
|
||||||
|
'sy' => '23000',
|
||||||
|
'kx' => '-1200000',
|
||||||
|
),
|
||||||
|
'algn' => 'bl',
|
||||||
|
'rotWithShape' => '0',
|
||||||
|
),
|
||||||
|
21 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '76200',
|
||||||
|
'direction' => '13500000',
|
||||||
|
'size' => array(
|
||||||
|
'sy' => '23000',
|
||||||
|
'kx' => '1200000',
|
||||||
|
),
|
||||||
|
'algn' => 'br',
|
||||||
|
'rotWithShape' => '0',
|
||||||
|
),
|
||||||
|
22 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '76200',
|
||||||
|
'distance' => '12700',
|
||||||
|
'direction' => '2700000',
|
||||||
|
'size' => array(
|
||||||
|
'sy' => '-23000',
|
||||||
|
'kx' => '-800400',
|
||||||
|
),
|
||||||
|
'algn' => 'bl',
|
||||||
|
'rotWithShape' => '0',
|
||||||
|
),
|
||||||
|
23 => array(
|
||||||
|
'effect' => 'outerShdw',
|
||||||
|
'blur' => '76200',
|
||||||
|
'distance' => '12700',
|
||||||
|
'direction' => '8100000',
|
||||||
|
'size' => array(
|
||||||
|
'sy' => '-23000',
|
||||||
|
'kx' => '800400',
|
||||||
|
),
|
||||||
|
'algn' => 'br',
|
||||||
|
'rotWithShape' => '0',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $presets_options[$shadow_presets_option];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getArrayElementsValue($properties, $elements)
|
||||||
|
{
|
||||||
|
$reference = & $properties;
|
||||||
|
if (!is_array($elements)) {
|
||||||
|
return $reference[$elements];
|
||||||
|
} else {
|
||||||
|
foreach ($elements as $keys) {
|
||||||
|
$reference = & $reference[$keys];
|
||||||
|
}
|
||||||
|
return $reference;
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
ChartDirector
|
||||||
|
http://www.advsofteng.com/cdphp.html
|
||||||
|
|
||||||
|
GraPHPite
|
||||||
|
http://graphpite.sourceforge.net/
|
||||||
|
|
||||||
|
JpGraph
|
||||||
|
http://www.aditus.nu/jpgraph/
|
||||||
|
|
||||||
|
LibChart
|
||||||
|
http://naku.dohcrew.com/libchart/pages/introduction/
|
||||||
|
|
||||||
|
pChart
|
||||||
|
http://pchart.sourceforge.net/
|
||||||
|
|
||||||
|
TeeChart
|
||||||
|
http://www.steema.com/products/teechart/overview.html
|
||||||
|
|
@ -0,0 +1,883 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'/jpgraph.php');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_Renderer_jpgraph
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart_Renderer
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_Renderer_jpgraph
|
||||||
|
{
|
||||||
|
private static $width = 640;
|
||||||
|
|
||||||
|
private static $height = 480;
|
||||||
|
|
||||||
|
private static $colourSet = array(
|
||||||
|
'mediumpurple1', 'palegreen3', 'gold1', 'cadetblue1',
|
||||||
|
'darkmagenta', 'coral', 'dodgerblue3', 'eggplant',
|
||||||
|
'mediumblue', 'magenta', 'sandybrown', 'cyan',
|
||||||
|
'firebrick1', 'forestgreen', 'deeppink4', 'darkolivegreen',
|
||||||
|
'goldenrod2'
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $markSet = array(
|
||||||
|
'diamond' => MARK_DIAMOND,
|
||||||
|
'square' => MARK_SQUARE,
|
||||||
|
'triangle' => MARK_UTRIANGLE,
|
||||||
|
'x' => MARK_X,
|
||||||
|
'star' => MARK_STAR,
|
||||||
|
'dot' => MARK_FILLEDCIRCLE,
|
||||||
|
'dash' => MARK_DTRIANGLE,
|
||||||
|
'circle' => MARK_CIRCLE,
|
||||||
|
'plus' => MARK_CROSS
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
private $chart;
|
||||||
|
|
||||||
|
private $graph;
|
||||||
|
|
||||||
|
private static $plotColour = 0;
|
||||||
|
|
||||||
|
private static $plotMark = 0;
|
||||||
|
|
||||||
|
|
||||||
|
private function formatPointMarker($seriesPlot, $markerID)
|
||||||
|
{
|
||||||
|
$plotMarkKeys = array_keys(self::$markSet);
|
||||||
|
if (is_null($markerID)) {
|
||||||
|
// Use default plot marker (next marker in the series)
|
||||||
|
self::$plotMark %= count(self::$markSet);
|
||||||
|
$seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);
|
||||||
|
} elseif ($markerID !== 'none') {
|
||||||
|
// Use specified plot marker (if it exists)
|
||||||
|
if (isset(self::$markSet[$markerID])) {
|
||||||
|
$seriesPlot->mark->SetType(self::$markSet[$markerID]);
|
||||||
|
} else {
|
||||||
|
// If the specified plot marker doesn't exist, use default plot marker (next marker in the series)
|
||||||
|
self::$plotMark %= count(self::$markSet);
|
||||||
|
$seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Hide plot marker
|
||||||
|
$seriesPlot->mark->Hide();
|
||||||
|
}
|
||||||
|
$seriesPlot->mark->SetColor(self::$colourSet[self::$plotColour]);
|
||||||
|
$seriesPlot->mark->SetFillColor(self::$colourSet[self::$plotColour]);
|
||||||
|
$seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
|
||||||
|
|
||||||
|
return $seriesPlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '')
|
||||||
|
{
|
||||||
|
$datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode();
|
||||||
|
if (!is_null($datasetLabelFormatCode)) {
|
||||||
|
// Retrieve any label formatting code
|
||||||
|
$datasetLabelFormatCode = stripslashes($datasetLabelFormatCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
$testCurrentIndex = 0;
|
||||||
|
foreach ($datasetLabels as $i => $datasetLabel) {
|
||||||
|
if (is_array($datasetLabel)) {
|
||||||
|
if ($rotation == 'bar') {
|
||||||
|
$datasetLabels[$i] = implode(" ", $datasetLabel);
|
||||||
|
} else {
|
||||||
|
$datasetLabel = array_reverse($datasetLabel);
|
||||||
|
$datasetLabels[$i] = implode("\n", $datasetLabel);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Format labels according to any formatting code
|
||||||
|
if (!is_null($datasetLabelFormatCode)) {
|
||||||
|
$datasetLabels[$i] = PHPExcel_Style_NumberFormat::toFormattedString($datasetLabel, $datasetLabelFormatCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $datasetLabels;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function percentageSumCalculation($groupID, $seriesCount)
|
||||||
|
{
|
||||||
|
// Adjust our values to a percentage value across all series in the group
|
||||||
|
for ($i = 0; $i < $seriesCount; ++$i) {
|
||||||
|
if ($i == 0) {
|
||||||
|
$sumValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
|
||||||
|
} else {
|
||||||
|
$nextValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
|
||||||
|
foreach ($nextValues as $k => $value) {
|
||||||
|
if (isset($sumValues[$k])) {
|
||||||
|
$sumValues[$k] += $value;
|
||||||
|
} else {
|
||||||
|
$sumValues[$k] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sumValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function percentageAdjustValues($dataValues, $sumValues)
|
||||||
|
{
|
||||||
|
foreach ($dataValues as $k => $dataValue) {
|
||||||
|
$dataValues[$k] = $dataValue / $sumValues[$k] * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dataValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function getCaption($captionElement)
|
||||||
|
{
|
||||||
|
// Read any caption
|
||||||
|
$caption = (!is_null($captionElement)) ? $captionElement->getCaption() : null;
|
||||||
|
// Test if we have a title caption to display
|
||||||
|
if (!is_null($caption)) {
|
||||||
|
// If we do, it could be a plain string or an array
|
||||||
|
if (is_array($caption)) {
|
||||||
|
// Implode an array to a plain string
|
||||||
|
$caption = implode('', $caption);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $caption;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderTitle()
|
||||||
|
{
|
||||||
|
$title = $this->getCaption($this->chart->getTitle());
|
||||||
|
if (!is_null($title)) {
|
||||||
|
$this->graph->title->Set($title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderLegend()
|
||||||
|
{
|
||||||
|
$legend = $this->chart->getLegend();
|
||||||
|
if (!is_null($legend)) {
|
||||||
|
$legendPosition = $legend->getPosition();
|
||||||
|
$legendOverlay = $legend->getOverlay();
|
||||||
|
switch ($legendPosition) {
|
||||||
|
case 'r':
|
||||||
|
$this->graph->legend->SetPos(0.01, 0.5, 'right', 'center'); // right
|
||||||
|
$this->graph->legend->SetColumns(1);
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
$this->graph->legend->SetPos(0.01, 0.5, 'left', 'center'); // left
|
||||||
|
$this->graph->legend->SetColumns(1);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
$this->graph->legend->SetPos(0.5, 0.01, 'center', 'top'); // top
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
$this->graph->legend->SetPos(0.5, 0.99, 'center', 'bottom'); // bottom
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->graph->legend->SetPos(0.01, 0.01, 'right', 'top'); // top-right
|
||||||
|
$this->graph->legend->SetColumns(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->graph->legend->Hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderCartesianPlotArea($type = 'textlin')
|
||||||
|
{
|
||||||
|
$this->graph = new Graph(self::$width, self::$height);
|
||||||
|
$this->graph->SetScale($type);
|
||||||
|
|
||||||
|
$this->renderTitle();
|
||||||
|
|
||||||
|
// Rotate for bar rather than column chart
|
||||||
|
$rotation = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection();
|
||||||
|
$reverse = ($rotation == 'bar') ? true : false;
|
||||||
|
|
||||||
|
$xAxisLabel = $this->chart->getXAxisLabel();
|
||||||
|
if (!is_null($xAxisLabel)) {
|
||||||
|
$title = $this->getCaption($xAxisLabel);
|
||||||
|
if (!is_null($title)) {
|
||||||
|
$this->graph->xaxis->SetTitle($title, 'center');
|
||||||
|
$this->graph->xaxis->title->SetMargin(35);
|
||||||
|
if ($reverse) {
|
||||||
|
$this->graph->xaxis->title->SetAngle(90);
|
||||||
|
$this->graph->xaxis->title->SetMargin(90);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$yAxisLabel = $this->chart->getYAxisLabel();
|
||||||
|
if (!is_null($yAxisLabel)) {
|
||||||
|
$title = $this->getCaption($yAxisLabel);
|
||||||
|
if (!is_null($title)) {
|
||||||
|
$this->graph->yaxis->SetTitle($title, 'center');
|
||||||
|
if ($reverse) {
|
||||||
|
$this->graph->yaxis->title->SetAngle(0);
|
||||||
|
$this->graph->yaxis->title->SetMargin(-55);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPiePlotArea($doughnut = false)
|
||||||
|
{
|
||||||
|
$this->graph = new PieGraph(self::$width, self::$height);
|
||||||
|
|
||||||
|
$this->renderTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderRadarPlotArea()
|
||||||
|
{
|
||||||
|
$this->graph = new RadarGraph(self::$width, self::$height);
|
||||||
|
$this->graph->SetScale('lin');
|
||||||
|
|
||||||
|
$this->renderTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d')
|
||||||
|
{
|
||||||
|
$grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
|
||||||
|
|
||||||
|
$labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
|
||||||
|
if ($labelCount > 0) {
|
||||||
|
$datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
|
||||||
|
$datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);
|
||||||
|
$this->graph->xaxis->SetTickLabels($datasetLabels);
|
||||||
|
}
|
||||||
|
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$seriesPlots = array();
|
||||||
|
if ($grouping == 'percentStacked') {
|
||||||
|
$sumValues = $this->percentageSumCalculation($groupID, $seriesCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through each data series in turn
|
||||||
|
for ($i = 0; $i < $seriesCount; ++$i) {
|
||||||
|
$dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
|
||||||
|
$marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
|
||||||
|
|
||||||
|
if ($grouping == 'percentStacked') {
|
||||||
|
$dataValues = $this->percentageAdjustValues($dataValues, $sumValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill in any missing values in the $dataValues array
|
||||||
|
$testCurrentIndex = 0;
|
||||||
|
foreach ($dataValues as $k => $dataValue) {
|
||||||
|
while ($k != $testCurrentIndex) {
|
||||||
|
$dataValues[$testCurrentIndex] = null;
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
$seriesPlot = new LinePlot($dataValues);
|
||||||
|
if ($combination) {
|
||||||
|
$seriesPlot->SetBarCenter();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filled) {
|
||||||
|
$seriesPlot->SetFilled(true);
|
||||||
|
$seriesPlot->SetColor('black');
|
||||||
|
$seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);
|
||||||
|
} else {
|
||||||
|
// Set the appropriate plot marker
|
||||||
|
$this->formatPointMarker($seriesPlot, $marker);
|
||||||
|
}
|
||||||
|
$dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
|
||||||
|
$seriesPlot->SetLegend($dataLabel);
|
||||||
|
|
||||||
|
$seriesPlots[] = $seriesPlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($grouping == 'standard') {
|
||||||
|
$groupPlot = $seriesPlots;
|
||||||
|
} else {
|
||||||
|
$groupPlot = new AccLinePlot($seriesPlots);
|
||||||
|
}
|
||||||
|
$this->graph->Add($groupPlot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPlotBar($groupID, $dimensions = '2d')
|
||||||
|
{
|
||||||
|
$rotation = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection();
|
||||||
|
// Rotate for bar rather than column chart
|
||||||
|
if (($groupID == 0) && ($rotation == 'bar')) {
|
||||||
|
$this->graph->Set90AndMargin();
|
||||||
|
}
|
||||||
|
$grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
|
||||||
|
|
||||||
|
$labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
|
||||||
|
if ($labelCount > 0) {
|
||||||
|
$datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
|
||||||
|
$datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation);
|
||||||
|
// Rotate for bar rather than column chart
|
||||||
|
if ($rotation == 'bar') {
|
||||||
|
$datasetLabels = array_reverse($datasetLabels);
|
||||||
|
$this->graph->yaxis->SetPos('max');
|
||||||
|
$this->graph->yaxis->SetLabelAlign('center', 'top');
|
||||||
|
$this->graph->yaxis->SetLabelSide(SIDE_RIGHT);
|
||||||
|
}
|
||||||
|
$this->graph->xaxis->SetTickLabels($datasetLabels);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$seriesPlots = array();
|
||||||
|
if ($grouping == 'percentStacked') {
|
||||||
|
$sumValues = $this->percentageSumCalculation($groupID, $seriesCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through each data series in turn
|
||||||
|
for ($j = 0; $j < $seriesCount; ++$j) {
|
||||||
|
$dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
|
||||||
|
if ($grouping == 'percentStacked') {
|
||||||
|
$dataValues = $this->percentageAdjustValues($dataValues, $sumValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill in any missing values in the $dataValues array
|
||||||
|
$testCurrentIndex = 0;
|
||||||
|
foreach ($dataValues as $k => $dataValue) {
|
||||||
|
while ($k != $testCurrentIndex) {
|
||||||
|
$dataValues[$testCurrentIndex] = null;
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reverse the $dataValues order for bar rather than column chart
|
||||||
|
if ($rotation == 'bar') {
|
||||||
|
$dataValues = array_reverse($dataValues);
|
||||||
|
}
|
||||||
|
$seriesPlot = new BarPlot($dataValues);
|
||||||
|
$seriesPlot->SetColor('black');
|
||||||
|
$seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);
|
||||||
|
if ($dimensions == '3d') {
|
||||||
|
$seriesPlot->SetShadow();
|
||||||
|
}
|
||||||
|
if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) {
|
||||||
|
$dataLabel = '';
|
||||||
|
} else {
|
||||||
|
$dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue();
|
||||||
|
}
|
||||||
|
$seriesPlot->SetLegend($dataLabel);
|
||||||
|
|
||||||
|
$seriesPlots[] = $seriesPlot;
|
||||||
|
}
|
||||||
|
// Reverse the plot order for bar rather than column chart
|
||||||
|
if (($rotation == 'bar') && (!($grouping == 'percentStacked'))) {
|
||||||
|
$seriesPlots = array_reverse($seriesPlots);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($grouping == 'clustered') {
|
||||||
|
$groupPlot = new GroupBarPlot($seriesPlots);
|
||||||
|
} elseif ($grouping == 'standard') {
|
||||||
|
$groupPlot = new GroupBarPlot($seriesPlots);
|
||||||
|
} else {
|
||||||
|
$groupPlot = new AccBarPlot($seriesPlots);
|
||||||
|
if ($dimensions == '3d') {
|
||||||
|
$groupPlot->SetShadow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->graph->Add($groupPlot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPlotScatter($groupID, $bubble)
|
||||||
|
{
|
||||||
|
$grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
|
||||||
|
$scatterStyle = $bubbleSize = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
|
||||||
|
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$seriesPlots = array();
|
||||||
|
|
||||||
|
// Loop through each data series in turn
|
||||||
|
for ($i = 0; $i < $seriesCount; ++$i) {
|
||||||
|
$dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
|
||||||
|
$dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
|
||||||
|
|
||||||
|
foreach ($dataValuesY as $k => $dataValueY) {
|
||||||
|
$dataValuesY[$k] = $k;
|
||||||
|
}
|
||||||
|
|
||||||
|
$seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY);
|
||||||
|
if ($scatterStyle == 'lineMarker') {
|
||||||
|
$seriesPlot->SetLinkPoints();
|
||||||
|
$seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]);
|
||||||
|
} elseif ($scatterStyle == 'smoothMarker') {
|
||||||
|
$spline = new Spline($dataValuesY, $dataValuesX);
|
||||||
|
list($splineDataY, $splineDataX) = $spline->Get(count($dataValuesX) * self::$width / 20);
|
||||||
|
$lplot = new LinePlot($splineDataX, $splineDataY);
|
||||||
|
$lplot->SetColor(self::$colourSet[self::$plotColour]);
|
||||||
|
|
||||||
|
$this->graph->Add($lplot);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bubble) {
|
||||||
|
$this->formatPointMarker($seriesPlot, 'dot');
|
||||||
|
$seriesPlot->mark->SetColor('black');
|
||||||
|
$seriesPlot->mark->SetSize($bubbleSize);
|
||||||
|
} else {
|
||||||
|
$marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
|
||||||
|
$this->formatPointMarker($seriesPlot, $marker);
|
||||||
|
}
|
||||||
|
$dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
|
||||||
|
$seriesPlot->SetLegend($dataLabel);
|
||||||
|
|
||||||
|
$this->graph->Add($seriesPlot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPlotRadar($groupID)
|
||||||
|
{
|
||||||
|
$radarStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
|
||||||
|
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$seriesPlots = array();
|
||||||
|
|
||||||
|
// Loop through each data series in turn
|
||||||
|
for ($i = 0; $i < $seriesCount; ++$i) {
|
||||||
|
$dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
|
||||||
|
$dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
|
||||||
|
$marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
|
||||||
|
|
||||||
|
$dataValues = array();
|
||||||
|
foreach ($dataValuesY as $k => $dataValueY) {
|
||||||
|
$dataValues[$k] = implode(' ', array_reverse($dataValueY));
|
||||||
|
}
|
||||||
|
$tmp = array_shift($dataValues);
|
||||||
|
$dataValues[] = $tmp;
|
||||||
|
$tmp = array_shift($dataValuesX);
|
||||||
|
$dataValuesX[] = $tmp;
|
||||||
|
|
||||||
|
$this->graph->SetTitles(array_reverse($dataValues));
|
||||||
|
|
||||||
|
$seriesPlot = new RadarPlot(array_reverse($dataValuesX));
|
||||||
|
|
||||||
|
$dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
|
||||||
|
$seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
|
||||||
|
if ($radarStyle == 'filled') {
|
||||||
|
$seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]);
|
||||||
|
}
|
||||||
|
$this->formatPointMarker($seriesPlot, $marker);
|
||||||
|
$seriesPlot->SetLegend($dataLabel);
|
||||||
|
|
||||||
|
$this->graph->Add($seriesPlot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPlotContour($groupID)
|
||||||
|
{
|
||||||
|
$contourStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
|
||||||
|
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$seriesPlots = array();
|
||||||
|
|
||||||
|
$dataValues = array();
|
||||||
|
// Loop through each data series in turn
|
||||||
|
for ($i = 0; $i < $seriesCount; ++$i) {
|
||||||
|
$dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
|
||||||
|
$dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
|
||||||
|
|
||||||
|
$dataValues[$i] = $dataValuesX;
|
||||||
|
}
|
||||||
|
$seriesPlot = new ContourPlot($dataValues);
|
||||||
|
|
||||||
|
$this->graph->Add($seriesPlot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPlotStock($groupID)
|
||||||
|
{
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$plotOrder = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder();
|
||||||
|
|
||||||
|
$dataValues = array();
|
||||||
|
// Loop through each data series in turn and build the plot arrays
|
||||||
|
foreach ($plotOrder as $i => $v) {
|
||||||
|
$dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues();
|
||||||
|
foreach ($dataValuesX as $j => $dataValueX) {
|
||||||
|
$dataValues[$plotOrder[$i]][$j] = $dataValueX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (empty($dataValues)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dataValuesPlot = array();
|
||||||
|
// Flatten the plot arrays to a single dimensional array to work with jpgraph
|
||||||
|
for ($j = 0; $j < count($dataValues[0]); ++$j) {
|
||||||
|
for ($i = 0; $i < $seriesCount; ++$i) {
|
||||||
|
$dataValuesPlot[] = $dataValues[$i][$j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the x-axis labels
|
||||||
|
$labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
|
||||||
|
if ($labelCount > 0) {
|
||||||
|
$datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
|
||||||
|
$datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);
|
||||||
|
$this->graph->xaxis->SetTickLabels($datasetLabels);
|
||||||
|
}
|
||||||
|
|
||||||
|
$seriesPlot = new StockPlot($dataValuesPlot);
|
||||||
|
$seriesPlot->SetWidth(20);
|
||||||
|
|
||||||
|
$this->graph->Add($seriesPlot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderAreaChart($groupCount, $dimensions = '2d')
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea();
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$this->renderPlotLine($i, true, false, $dimensions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderLineChart($groupCount, $dimensions = '2d')
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea();
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$this->renderPlotLine($i, false, false, $dimensions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderBarChart($groupCount, $dimensions = '2d')
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea();
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$this->renderPlotBar($i, $dimensions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderScatterChart($groupCount)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php');
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea('linlin');
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$this->renderPlotScatter($i, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderBubbleChart($groupCount)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea('linlin');
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$this->renderPlotScatter($i, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderPieChart($groupCount, $dimensions = '2d', $doughnut = false, $multiplePlots = false)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie.php');
|
||||||
|
if ($dimensions == '3d') {
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie3d.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->renderPiePlotArea($doughnut);
|
||||||
|
|
||||||
|
$iLimit = ($multiplePlots) ? $groupCount : 1;
|
||||||
|
for ($groupID = 0; $groupID < $iLimit; ++$groupID) {
|
||||||
|
$grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
|
||||||
|
$exploded = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
|
||||||
|
if ($groupID == 0) {
|
||||||
|
$labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
|
||||||
|
if ($labelCount > 0) {
|
||||||
|
$datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
|
||||||
|
$datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
|
||||||
|
$seriesPlots = array();
|
||||||
|
// For pie charts, we only display the first series: doughnut charts generally display all series
|
||||||
|
$jLimit = ($multiplePlots) ? $seriesCount : 1;
|
||||||
|
// Loop through each data series in turn
|
||||||
|
for ($j = 0; $j < $jLimit; ++$j) {
|
||||||
|
$dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
|
||||||
|
|
||||||
|
// Fill in any missing values in the $dataValues array
|
||||||
|
$testCurrentIndex = 0;
|
||||||
|
foreach ($dataValues as $k => $dataValue) {
|
||||||
|
while ($k != $testCurrentIndex) {
|
||||||
|
$dataValues[$testCurrentIndex] = null;
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
++$testCurrentIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($dimensions == '3d') {
|
||||||
|
$seriesPlot = new PiePlot3D($dataValues);
|
||||||
|
} else {
|
||||||
|
if ($doughnut) {
|
||||||
|
$seriesPlot = new PiePlotC($dataValues);
|
||||||
|
} else {
|
||||||
|
$seriesPlot = new PiePlot($dataValues);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($multiplePlots) {
|
||||||
|
$seriesPlot->SetSize(($jLimit-$j) / ($jLimit * 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($doughnut) {
|
||||||
|
$seriesPlot->SetMidColor('white');
|
||||||
|
}
|
||||||
|
|
||||||
|
$seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
|
||||||
|
if (count($datasetLabels) > 0) {
|
||||||
|
$seriesPlot->SetLabels(array_fill(0, count($datasetLabels), ''));
|
||||||
|
}
|
||||||
|
if ($dimensions != '3d') {
|
||||||
|
$seriesPlot->SetGuideLines(false);
|
||||||
|
}
|
||||||
|
if ($j == 0) {
|
||||||
|
if ($exploded) {
|
||||||
|
$seriesPlot->ExplodeAll();
|
||||||
|
}
|
||||||
|
$seriesPlot->SetLegends($datasetLabels);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->graph->Add($seriesPlot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderRadarChart($groupCount)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_radar.php');
|
||||||
|
|
||||||
|
$this->renderRadarPlotArea();
|
||||||
|
|
||||||
|
for ($groupID = 0; $groupID < $groupCount; ++$groupID) {
|
||||||
|
$this->renderPlotRadar($groupID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderStockChart($groupCount)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_stock.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea('intint');
|
||||||
|
|
||||||
|
for ($groupID = 0; $groupID < $groupCount; ++$groupID) {
|
||||||
|
$this->renderPlotStock($groupID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderContourChart($groupCount, $dimensions)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_contour.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea('intint');
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$this->renderPlotContour($i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function renderCombinationChart($groupCount, $dimensions, $outputDestination)
|
||||||
|
{
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php');
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php');
|
||||||
|
require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
|
||||||
|
|
||||||
|
$this->renderCartesianPlotArea();
|
||||||
|
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$dimensions = null;
|
||||||
|
$chartType = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
|
||||||
|
switch ($chartType) {
|
||||||
|
case 'area3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'areaChart':
|
||||||
|
$this->renderPlotLine($i, true, true, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'bar3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'barChart':
|
||||||
|
$this->renderPlotBar($i, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'line3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'lineChart':
|
||||||
|
$this->renderPlotLine($i, false, true, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'scatterChart':
|
||||||
|
$this->renderPlotScatter($i, false);
|
||||||
|
break;
|
||||||
|
case 'bubbleChart':
|
||||||
|
$this->renderPlotScatter($i, true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->graph = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->renderLegend();
|
||||||
|
|
||||||
|
$this->graph->Stroke($outputDestination);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function render($outputDestination)
|
||||||
|
{
|
||||||
|
self::$plotColour = 0;
|
||||||
|
|
||||||
|
$groupCount = $this->chart->getPlotArea()->getPlotGroupCount();
|
||||||
|
|
||||||
|
$dimensions = null;
|
||||||
|
if ($groupCount == 1) {
|
||||||
|
$chartType = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType();
|
||||||
|
} else {
|
||||||
|
$chartTypes = array();
|
||||||
|
for ($i = 0; $i < $groupCount; ++$i) {
|
||||||
|
$chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
|
||||||
|
}
|
||||||
|
$chartTypes = array_unique($chartTypes);
|
||||||
|
if (count($chartTypes) == 1) {
|
||||||
|
$chartType = array_pop($chartTypes);
|
||||||
|
} elseif (count($chartTypes) == 0) {
|
||||||
|
echo 'Chart is not yet implemented<br />';
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return $this->renderCombinationChart($groupCount, $dimensions, $outputDestination);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($chartType) {
|
||||||
|
case 'area3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'areaChart':
|
||||||
|
$this->renderAreaChart($groupCount, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'bar3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'barChart':
|
||||||
|
$this->renderBarChart($groupCount, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'line3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'lineChart':
|
||||||
|
$this->renderLineChart($groupCount, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'pie3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'pieChart':
|
||||||
|
$this->renderPieChart($groupCount, $dimensions, false, false);
|
||||||
|
break;
|
||||||
|
case 'doughnut3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'doughnutChart':
|
||||||
|
$this->renderPieChart($groupCount, $dimensions, true, true);
|
||||||
|
break;
|
||||||
|
case 'scatterChart':
|
||||||
|
$this->renderScatterChart($groupCount);
|
||||||
|
break;
|
||||||
|
case 'bubbleChart':
|
||||||
|
$this->renderBubbleChart($groupCount);
|
||||||
|
break;
|
||||||
|
case 'radarChart':
|
||||||
|
$this->renderRadarChart($groupCount);
|
||||||
|
break;
|
||||||
|
case 'surface3DChart':
|
||||||
|
$dimensions = '3d';
|
||||||
|
// no break
|
||||||
|
case 'surfaceChart':
|
||||||
|
$this->renderContourChart($groupCount, $dimensions);
|
||||||
|
break;
|
||||||
|
case 'stockChart':
|
||||||
|
$this->renderStockChart($groupCount, $dimensions);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
echo $chartType.' is not yet implemented<br />';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->renderLegend();
|
||||||
|
|
||||||
|
$this->graph->Stroke($outputDestination);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_Renderer_jpgraph
|
||||||
|
*/
|
||||||
|
public function __construct(PHPExcel_Chart $chart)
|
||||||
|
{
|
||||||
|
$this->graph = null;
|
||||||
|
$this->chart = $chart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Chart_Title
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel_Chart
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Chart_Title
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Title Caption
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $caption = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Title Layout
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
private $layout = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
public function __construct($caption = null, PHPExcel_Chart_Layout $layout = null)
|
||||||
|
{
|
||||||
|
$this->caption = $caption;
|
||||||
|
$this->layout = $layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get caption
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCaption()
|
||||||
|
{
|
||||||
|
return $this->caption;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set caption
|
||||||
|
*
|
||||||
|
* @param string $caption
|
||||||
|
* @return PHPExcel_Chart_Title
|
||||||
|
*/
|
||||||
|
public function setCaption($caption = null)
|
||||||
|
{
|
||||||
|
$this->caption = $caption;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Layout
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Chart_Layout
|
||||||
|
*/
|
||||||
|
public function getLayout()
|
||||||
|
{
|
||||||
|
return $this->layout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,338 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Comment
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_Comment implements PHPExcel_IComparable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Author
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $author;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rich text comment
|
||||||
|
*
|
||||||
|
* @var PHPExcel_RichText
|
||||||
|
*/
|
||||||
|
private $text;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comment width (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $width = '96pt';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Left margin (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $marginLeft = '59.25pt';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Top margin (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $marginTop = '1.5pt';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visible
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $visible = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comment height (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $height = '55.5pt';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comment fill color
|
||||||
|
*
|
||||||
|
* @var PHPExcel_Style_Color
|
||||||
|
*/
|
||||||
|
private $fillColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alignment
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $alignment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_Comment
|
||||||
|
*
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// Initialise variables
|
||||||
|
$this->author = 'Author';
|
||||||
|
$this->text = new PHPExcel_RichText();
|
||||||
|
$this->fillColor = new PHPExcel_Style_Color('FFFFFFE1');
|
||||||
|
$this->alignment = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Author
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAuthor()
|
||||||
|
{
|
||||||
|
return $this->author;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Author
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setAuthor($pValue = '')
|
||||||
|
{
|
||||||
|
$this->author = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Rich text comment
|
||||||
|
*
|
||||||
|
* @return PHPExcel_RichText
|
||||||
|
*/
|
||||||
|
public function getText()
|
||||||
|
{
|
||||||
|
return $this->text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Rich text comment
|
||||||
|
*
|
||||||
|
* @param PHPExcel_RichText $pValue
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setText(PHPExcel_RichText $pValue)
|
||||||
|
{
|
||||||
|
$this->text = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get comment width (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getWidth()
|
||||||
|
{
|
||||||
|
return $this->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set comment width (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setWidth($value = '96pt')
|
||||||
|
{
|
||||||
|
$this->width = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get comment height (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getHeight()
|
||||||
|
{
|
||||||
|
return $this->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set comment height (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setHeight($value = '55.5pt')
|
||||||
|
{
|
||||||
|
$this->height = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get left margin (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getMarginLeft()
|
||||||
|
{
|
||||||
|
return $this->marginLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set left margin (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setMarginLeft($value = '59.25pt')
|
||||||
|
{
|
||||||
|
$this->marginLeft = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get top margin (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getMarginTop()
|
||||||
|
{
|
||||||
|
return $this->marginTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set top margin (CSS style, i.e. XXpx or YYpt)
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setMarginTop($value = '1.5pt')
|
||||||
|
{
|
||||||
|
$this->marginTop = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the comment visible by default?
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getVisible()
|
||||||
|
{
|
||||||
|
return $this->visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set comment default visibility
|
||||||
|
*
|
||||||
|
* @param boolean $value
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setVisible($value = false)
|
||||||
|
{
|
||||||
|
$this->visible = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get fill color
|
||||||
|
*
|
||||||
|
* @return PHPExcel_Style_Color
|
||||||
|
*/
|
||||||
|
public function getFillColor()
|
||||||
|
{
|
||||||
|
return $this->fillColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Alignment
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_Comment
|
||||||
|
*/
|
||||||
|
public function setAlignment($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL)
|
||||||
|
{
|
||||||
|
$this->alignment = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Alignment
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAlignment()
|
||||||
|
{
|
||||||
|
return $this->alignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get hash code
|
||||||
|
*
|
||||||
|
* @return string Hash code
|
||||||
|
*/
|
||||||
|
public function getHashCode()
|
||||||
|
{
|
||||||
|
return md5(
|
||||||
|
$this->author .
|
||||||
|
$this->text->getHashCode() .
|
||||||
|
$this->width .
|
||||||
|
$this->height .
|
||||||
|
$this->marginLeft .
|
||||||
|
$this->marginTop .
|
||||||
|
($this->visible ? 1 : 0) .
|
||||||
|
$this->fillColor->getHashCode() .
|
||||||
|
$this->alignment .
|
||||||
|
__CLASS__
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
||||||
|
*/
|
||||||
|
public function __clone()
|
||||||
|
{
|
||||||
|
$vars = get_object_vars($this);
|
||||||
|
foreach ($vars as $key => $value) {
|
||||||
|
if (is_object($value)) {
|
||||||
|
$this->$key = clone $value;
|
||||||
|
} else {
|
||||||
|
$this->$key = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert to string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return $this->text->getPlainText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,611 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_DocumentProperties
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_DocumentProperties
|
||||||
|
{
|
||||||
|
/** constants */
|
||||||
|
const PROPERTY_TYPE_BOOLEAN = 'b';
|
||||||
|
const PROPERTY_TYPE_INTEGER = 'i';
|
||||||
|
const PROPERTY_TYPE_FLOAT = 'f';
|
||||||
|
const PROPERTY_TYPE_DATE = 'd';
|
||||||
|
const PROPERTY_TYPE_STRING = 's';
|
||||||
|
const PROPERTY_TYPE_UNKNOWN = 'u';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creator
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $creator = 'Unknown Creator';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LastModifiedBy
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $lastModifiedBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created
|
||||||
|
*
|
||||||
|
* @var datetime
|
||||||
|
*/
|
||||||
|
private $created;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modified
|
||||||
|
*
|
||||||
|
* @var datetime
|
||||||
|
*/
|
||||||
|
private $modified;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Title
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $title = 'Untitled Spreadsheet';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $description = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subject
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $subject = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keywords
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $keywords = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Category
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $category = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manager
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $manager = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Company
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $company = 'Microsoft Corporation';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom Properties
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $customProperties = array();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// Initialise values
|
||||||
|
$this->lastModifiedBy = $this->creator;
|
||||||
|
$this->created = time();
|
||||||
|
$this->modified = time();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Creator
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCreator()
|
||||||
|
{
|
||||||
|
return $this->creator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Creator
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setCreator($pValue = '')
|
||||||
|
{
|
||||||
|
$this->creator = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Last Modified By
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLastModifiedBy()
|
||||||
|
{
|
||||||
|
return $this->lastModifiedBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Last Modified By
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setLastModifiedBy($pValue = '')
|
||||||
|
{
|
||||||
|
$this->lastModifiedBy = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Created
|
||||||
|
*
|
||||||
|
* @return datetime
|
||||||
|
*/
|
||||||
|
public function getCreated()
|
||||||
|
{
|
||||||
|
return $this->created;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Created
|
||||||
|
*
|
||||||
|
* @param datetime $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setCreated($pValue = null)
|
||||||
|
{
|
||||||
|
if ($pValue === null) {
|
||||||
|
$pValue = time();
|
||||||
|
} elseif (is_string($pValue)) {
|
||||||
|
if (is_numeric($pValue)) {
|
||||||
|
$pValue = intval($pValue);
|
||||||
|
} else {
|
||||||
|
$pValue = strtotime($pValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->created = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Modified
|
||||||
|
*
|
||||||
|
* @return datetime
|
||||||
|
*/
|
||||||
|
public function getModified()
|
||||||
|
{
|
||||||
|
return $this->modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Modified
|
||||||
|
*
|
||||||
|
* @param datetime $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setModified($pValue = null)
|
||||||
|
{
|
||||||
|
if ($pValue === null) {
|
||||||
|
$pValue = time();
|
||||||
|
} elseif (is_string($pValue)) {
|
||||||
|
if (is_numeric($pValue)) {
|
||||||
|
$pValue = intval($pValue);
|
||||||
|
} else {
|
||||||
|
$pValue = strtotime($pValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->modified = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Title
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTitle()
|
||||||
|
{
|
||||||
|
return $this->title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Title
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setTitle($pValue = '')
|
||||||
|
{
|
||||||
|
$this->title = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Description
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDescription()
|
||||||
|
{
|
||||||
|
return $this->description;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Description
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setDescription($pValue = '')
|
||||||
|
{
|
||||||
|
$this->description = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Subject
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSubject()
|
||||||
|
{
|
||||||
|
return $this->subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Subject
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setSubject($pValue = '')
|
||||||
|
{
|
||||||
|
$this->subject = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Keywords
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getKeywords()
|
||||||
|
{
|
||||||
|
return $this->keywords;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Keywords
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setKeywords($pValue = '')
|
||||||
|
{
|
||||||
|
$this->keywords = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Category
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCategory()
|
||||||
|
{
|
||||||
|
return $this->category;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Category
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setCategory($pValue = '')
|
||||||
|
{
|
||||||
|
$this->category = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Company
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCompany()
|
||||||
|
{
|
||||||
|
return $this->company;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Company
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setCompany($pValue = '')
|
||||||
|
{
|
||||||
|
$this->company = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Manager
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getManager()
|
||||||
|
{
|
||||||
|
return $this->manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Manager
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setManager($pValue = '')
|
||||||
|
{
|
||||||
|
$this->manager = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a List of Custom Property Names
|
||||||
|
*
|
||||||
|
* @return array of string
|
||||||
|
*/
|
||||||
|
public function getCustomProperties()
|
||||||
|
{
|
||||||
|
return array_keys($this->customProperties);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a Custom Property is defined
|
||||||
|
*
|
||||||
|
* @param string $propertyName
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function isCustomPropertySet($propertyName)
|
||||||
|
{
|
||||||
|
return isset($this->customProperties[$propertyName]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a Custom Property Value
|
||||||
|
*
|
||||||
|
* @param string $propertyName
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCustomPropertyValue($propertyName)
|
||||||
|
{
|
||||||
|
if (isset($this->customProperties[$propertyName])) {
|
||||||
|
return $this->customProperties[$propertyName]['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a Custom Property Type
|
||||||
|
*
|
||||||
|
* @param string $propertyName
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCustomPropertyType($propertyName)
|
||||||
|
{
|
||||||
|
if (isset($this->customProperties[$propertyName])) {
|
||||||
|
return $this->customProperties[$propertyName]['type'];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a Custom Property
|
||||||
|
*
|
||||||
|
* @param string $propertyName
|
||||||
|
* @param mixed $propertyValue
|
||||||
|
* @param string $propertyType
|
||||||
|
* 'i' : Integer
|
||||||
|
* 'f' : Floating Point
|
||||||
|
* 's' : String
|
||||||
|
* 'd' : Date/Time
|
||||||
|
* 'b' : Boolean
|
||||||
|
* @return PHPExcel_DocumentProperties
|
||||||
|
*/
|
||||||
|
public function setCustomProperty($propertyName, $propertyValue = '', $propertyType = null)
|
||||||
|
{
|
||||||
|
if (($propertyType === null) || (!in_array($propertyType, array(self::PROPERTY_TYPE_INTEGER,
|
||||||
|
self::PROPERTY_TYPE_FLOAT,
|
||||||
|
self::PROPERTY_TYPE_STRING,
|
||||||
|
self::PROPERTY_TYPE_DATE,
|
||||||
|
self::PROPERTY_TYPE_BOOLEAN)))) {
|
||||||
|
if ($propertyValue === null) {
|
||||||
|
$propertyType = self::PROPERTY_TYPE_STRING;
|
||||||
|
} elseif (is_float($propertyValue)) {
|
||||||
|
$propertyType = self::PROPERTY_TYPE_FLOAT;
|
||||||
|
} elseif (is_int($propertyValue)) {
|
||||||
|
$propertyType = self::PROPERTY_TYPE_INTEGER;
|
||||||
|
} elseif (is_bool($propertyValue)) {
|
||||||
|
$propertyType = self::PROPERTY_TYPE_BOOLEAN;
|
||||||
|
} else {
|
||||||
|
$propertyType = self::PROPERTY_TYPE_STRING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->customProperties[$propertyName] = array(
|
||||||
|
'value' => $propertyValue,
|
||||||
|
'type' => $propertyType
|
||||||
|
);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
||||||
|
*/
|
||||||
|
public function __clone()
|
||||||
|
{
|
||||||
|
$vars = get_object_vars($this);
|
||||||
|
foreach ($vars as $key => $value) {
|
||||||
|
if (is_object($value)) {
|
||||||
|
$this->$key = clone $value;
|
||||||
|
} else {
|
||||||
|
$this->$key = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function convertProperty($propertyValue, $propertyType)
|
||||||
|
{
|
||||||
|
switch ($propertyType) {
|
||||||
|
case 'empty': // Empty
|
||||||
|
return '';
|
||||||
|
break;
|
||||||
|
case 'null': // Null
|
||||||
|
return null;
|
||||||
|
break;
|
||||||
|
case 'i1': // 1-Byte Signed Integer
|
||||||
|
case 'i2': // 2-Byte Signed Integer
|
||||||
|
case 'i4': // 4-Byte Signed Integer
|
||||||
|
case 'i8': // 8-Byte Signed Integer
|
||||||
|
case 'int': // Integer
|
||||||
|
return (int) $propertyValue;
|
||||||
|
break;
|
||||||
|
case 'ui1': // 1-Byte Unsigned Integer
|
||||||
|
case 'ui2': // 2-Byte Unsigned Integer
|
||||||
|
case 'ui4': // 4-Byte Unsigned Integer
|
||||||
|
case 'ui8': // 8-Byte Unsigned Integer
|
||||||
|
case 'uint': // Unsigned Integer
|
||||||
|
return abs((int) $propertyValue);
|
||||||
|
break;
|
||||||
|
case 'r4': // 4-Byte Real Number
|
||||||
|
case 'r8': // 8-Byte Real Number
|
||||||
|
case 'decimal': // Decimal
|
||||||
|
return (float) $propertyValue;
|
||||||
|
break;
|
||||||
|
case 'lpstr': // LPSTR
|
||||||
|
case 'lpwstr': // LPWSTR
|
||||||
|
case 'bstr': // Basic String
|
||||||
|
return $propertyValue;
|
||||||
|
break;
|
||||||
|
case 'date': // Date and Time
|
||||||
|
case 'filetime': // File Time
|
||||||
|
return strtotime($propertyValue);
|
||||||
|
break;
|
||||||
|
case 'bool': // Boolean
|
||||||
|
return ($propertyValue == 'true') ? true : false;
|
||||||
|
break;
|
||||||
|
case 'cy': // Currency
|
||||||
|
case 'error': // Error Status Code
|
||||||
|
case 'vector': // Vector
|
||||||
|
case 'array': // Array
|
||||||
|
case 'blob': // Binary Blob
|
||||||
|
case 'oblob': // Binary Blob Object
|
||||||
|
case 'stream': // Binary Stream
|
||||||
|
case 'ostream': // Binary Stream Object
|
||||||
|
case 'storage': // Binary Storage
|
||||||
|
case 'ostorage': // Binary Storage Object
|
||||||
|
case 'vstream': // Binary Versioned Stream
|
||||||
|
case 'clsid': // Class ID
|
||||||
|
case 'cf': // Clipboard Data
|
||||||
|
return $propertyValue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $propertyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function convertPropertyType($propertyType)
|
||||||
|
{
|
||||||
|
switch ($propertyType) {
|
||||||
|
case 'i1': // 1-Byte Signed Integer
|
||||||
|
case 'i2': // 2-Byte Signed Integer
|
||||||
|
case 'i4': // 4-Byte Signed Integer
|
||||||
|
case 'i8': // 8-Byte Signed Integer
|
||||||
|
case 'int': // Integer
|
||||||
|
case 'ui1': // 1-Byte Unsigned Integer
|
||||||
|
case 'ui2': // 2-Byte Unsigned Integer
|
||||||
|
case 'ui4': // 4-Byte Unsigned Integer
|
||||||
|
case 'ui8': // 8-Byte Unsigned Integer
|
||||||
|
case 'uint': // Unsigned Integer
|
||||||
|
return self::PROPERTY_TYPE_INTEGER;
|
||||||
|
break;
|
||||||
|
case 'r4': // 4-Byte Real Number
|
||||||
|
case 'r8': // 8-Byte Real Number
|
||||||
|
case 'decimal': // Decimal
|
||||||
|
return self::PROPERTY_TYPE_FLOAT;
|
||||||
|
break;
|
||||||
|
case 'empty': // Empty
|
||||||
|
case 'null': // Null
|
||||||
|
case 'lpstr': // LPSTR
|
||||||
|
case 'lpwstr': // LPWSTR
|
||||||
|
case 'bstr': // Basic String
|
||||||
|
return self::PROPERTY_TYPE_STRING;
|
||||||
|
break;
|
||||||
|
case 'date': // Date and Time
|
||||||
|
case 'filetime': // File Time
|
||||||
|
return self::PROPERTY_TYPE_DATE;
|
||||||
|
break;
|
||||||
|
case 'bool': // Boolean
|
||||||
|
return self::PROPERTY_TYPE_BOOLEAN;
|
||||||
|
break;
|
||||||
|
case 'cy': // Currency
|
||||||
|
case 'error': // Error Status Code
|
||||||
|
case 'vector': // Vector
|
||||||
|
case 'array': // Array
|
||||||
|
case 'blob': // Binary Blob
|
||||||
|
case 'oblob': // Binary Blob Object
|
||||||
|
case 'stream': // Binary Stream
|
||||||
|
case 'ostream': // Binary Stream Object
|
||||||
|
case 'storage': // Binary Storage
|
||||||
|
case 'ostorage': // Binary Storage Object
|
||||||
|
case 'vstream': // Binary Versioned Stream
|
||||||
|
case 'clsid': // Class ID
|
||||||
|
case 'cf': // Clipboard Data
|
||||||
|
return self::PROPERTY_TYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return self::PROPERTY_TYPE_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,222 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_DocumentSecurity
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_DocumentSecurity
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* LockRevision
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $lockRevision;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LockStructure
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $lockStructure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LockWindows
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $lockWindows;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RevisionsPassword
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $revisionsPassword;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WorkbookPassword
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $workbookPassword;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_DocumentSecurity
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// Initialise values
|
||||||
|
$this->lockRevision = false;
|
||||||
|
$this->lockStructure = false;
|
||||||
|
$this->lockWindows = false;
|
||||||
|
$this->revisionsPassword = '';
|
||||||
|
$this->workbookPassword = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is some sort of document security enabled?
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function isSecurityEnabled()
|
||||||
|
{
|
||||||
|
return $this->lockRevision ||
|
||||||
|
$this->lockStructure ||
|
||||||
|
$this->lockWindows;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get LockRevision
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getLockRevision()
|
||||||
|
{
|
||||||
|
return $this->lockRevision;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set LockRevision
|
||||||
|
*
|
||||||
|
* @param boolean $pValue
|
||||||
|
* @return PHPExcel_DocumentSecurity
|
||||||
|
*/
|
||||||
|
public function setLockRevision($pValue = false)
|
||||||
|
{
|
||||||
|
$this->lockRevision = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get LockStructure
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getLockStructure()
|
||||||
|
{
|
||||||
|
return $this->lockStructure;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set LockStructure
|
||||||
|
*
|
||||||
|
* @param boolean $pValue
|
||||||
|
* @return PHPExcel_DocumentSecurity
|
||||||
|
*/
|
||||||
|
public function setLockStructure($pValue = false)
|
||||||
|
{
|
||||||
|
$this->lockStructure = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get LockWindows
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function getLockWindows()
|
||||||
|
{
|
||||||
|
return $this->lockWindows;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set LockWindows
|
||||||
|
*
|
||||||
|
* @param boolean $pValue
|
||||||
|
* @return PHPExcel_DocumentSecurity
|
||||||
|
*/
|
||||||
|
public function setLockWindows($pValue = false)
|
||||||
|
{
|
||||||
|
$this->lockWindows = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get RevisionsPassword (hashed)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getRevisionsPassword()
|
||||||
|
{
|
||||||
|
return $this->revisionsPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set RevisionsPassword
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @param boolean $pAlreadyHashed If the password has already been hashed, set this to true
|
||||||
|
* @return PHPExcel_DocumentSecurity
|
||||||
|
*/
|
||||||
|
public function setRevisionsPassword($pValue = '', $pAlreadyHashed = false)
|
||||||
|
{
|
||||||
|
if (!$pAlreadyHashed) {
|
||||||
|
$pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue);
|
||||||
|
}
|
||||||
|
$this->revisionsPassword = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get WorkbookPassword (hashed)
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getWorkbookPassword()
|
||||||
|
{
|
||||||
|
return $this->workbookPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set WorkbookPassword
|
||||||
|
*
|
||||||
|
* @param string $pValue
|
||||||
|
* @param boolean $pAlreadyHashed If the password has already been hashed, set this to true
|
||||||
|
* @return PHPExcel_DocumentSecurity
|
||||||
|
*/
|
||||||
|
public function setWorkbookPassword($pValue = '', $pAlreadyHashed = false)
|
||||||
|
{
|
||||||
|
if (!$pAlreadyHashed) {
|
||||||
|
$pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue);
|
||||||
|
}
|
||||||
|
$this->workbookPassword = $pValue;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
||||||
|
*/
|
||||||
|
public function __clone()
|
||||||
|
{
|
||||||
|
$vars = get_object_vars($this);
|
||||||
|
foreach ($vars as $key => $value) {
|
||||||
|
if (is_object($value)) {
|
||||||
|
$this->$key = clone $value;
|
||||||
|
} else {
|
||||||
|
$this->$key = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHPExcel
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_Exception
|
||||||
|
*
|
||||||
|
* @category PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
*/
|
||||||
|
class PHPExcel_Exception extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Error handler callback
|
||||||
|
*
|
||||||
|
* @param mixed $code
|
||||||
|
* @param mixed $string
|
||||||
|
* @param mixed $file
|
||||||
|
* @param mixed $line
|
||||||
|
* @param mixed $context
|
||||||
|
*/
|
||||||
|
public static function errorHandlerCallback($code, $string, $file, $line, $context)
|
||||||
|
{
|
||||||
|
$e = new self($string, $code);
|
||||||
|
$e->line = $line;
|
||||||
|
$e->file = $file;
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,204 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHPExcel_HashTable
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 - 2015 PHPExcel
|
||||||
|
*
|
||||||
|
* 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 PHPExcel
|
||||||
|
* @package PHPExcel
|
||||||
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
|
||||||
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
||||||
|
* @version ##VERSION##, ##DATE##
|
||||||
|
*/
|
||||||
|
class PHPExcel_HashTable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* HashTable elements
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $items = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HashTable key map
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $keyMap = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHPExcel_HashTable
|
||||||
|
*
|
||||||
|
* @param PHPExcel_IComparable[] $pSource Optional source array to create HashTable from
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function __construct($pSource = null)
|
||||||
|
{
|
||||||
|
if ($pSource !== null) {
|
||||||
|
// Create HashTable
|
||||||
|
$this->addFromSource($pSource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add HashTable items from source
|
||||||
|
*
|
||||||
|
* @param PHPExcel_IComparable[] $pSource Source array to create HashTable from
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function addFromSource($pSource = null)
|
||||||
|
{
|
||||||
|
// Check if an array was passed
|
||||||
|
if ($pSource == null) {
|
||||||
|
return;
|
||||||
|
} elseif (!is_array($pSource)) {
|
||||||
|
throw new PHPExcel_Exception('Invalid array parameter passed.');
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($pSource as $item) {
|
||||||
|
$this->add($item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add HashTable item
|
||||||
|
*
|
||||||
|
* @param PHPExcel_IComparable $pSource Item to add
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function add(PHPExcel_IComparable $pSource = null)
|
||||||
|
{
|
||||||
|
$hash = $pSource->getHashCode();
|
||||||
|
if (!isset($this->items[$hash])) {
|
||||||
|
$this->items[$hash] = $pSource;
|
||||||
|
$this->keyMap[count($this->items) - 1] = $hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove HashTable item
|
||||||
|
*
|
||||||
|
* @param PHPExcel_IComparable $pSource Item to remove
|
||||||
|
* @throws PHPExcel_Exception
|
||||||
|
*/
|
||||||
|
public function remove(PHPExcel_IComparable $pSource = null)
|
||||||
|
{
|
||||||
|
$hash = $pSource->getHashCode();
|
||||||
|
if (isset($this->items[$hash])) {
|
||||||
|
unset($this->items[$hash]);
|
||||||
|
|
||||||
|
$deleteKey = -1;
|
||||||
|
foreach ($this->keyMap as $key => $value) {
|
||||||
|
if ($deleteKey >= 0) {
|
||||||
|
$this->keyMap[$key - 1] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($value == $hash) {
|
||||||
|
$deleteKey = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset($this->keyMap[count($this->keyMap) - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear HashTable
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function clear()
|
||||||
|
{
|
||||||
|
$this->items = array();
|
||||||
|
$this->keyMap = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function count()
|
||||||
|
{
|
||||||
|
return count($this->items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get index for hash code
|
||||||
|
*
|
||||||
|
* @param string $pHashCode
|
||||||
|
* @return int Index
|
||||||
|
*/
|
||||||
|
public function getIndexForHashCode($pHashCode = '')
|
||||||
|
{
|
||||||
|
return array_search($pHashCode, $this->keyMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get by index
|
||||||
|
*
|
||||||
|
* @param int $pIndex
|
||||||
|
* @return PHPExcel_IComparable
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getByIndex($pIndex = 0)
|
||||||
|
{
|
||||||
|
if (isset($this->keyMap[$pIndex])) {
|
||||||
|
return $this->getByHashCode($this->keyMap[$pIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get by hashcode
|
||||||
|
*
|
||||||
|
* @param string $pHashCode
|
||||||
|
* @return PHPExcel_IComparable
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getByHashCode($pHashCode = '')
|
||||||
|
{
|
||||||
|
if (isset($this->items[$pHashCode])) {
|
||||||
|
return $this->items[$pHashCode];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HashTable to array
|
||||||
|
*
|
||||||
|
* @return PHPExcel_IComparable[]
|
||||||
|
*/
|
||||||
|
public function toArray()
|
||||||
|
{
|
||||||
|
return $this->items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
||||||
|
*/
|
||||||
|
public function __clone()
|
||||||
|
{
|
||||||
|
$vars = get_object_vars($this);
|
||||||
|
foreach ($vars as $key => $value) {
|
||||||
|
if (is_object($value)) {
|
||||||
|
$this->$key = clone $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue