王虎 7 سال پیش
کامیت
ddd562eb89
100فایلهای تغییر یافته به همراه14404 افزوده شده و 0 حذف شده
  1. 5 0
      composer.json
  2. 154 0
      composer.lock
  3. 299 0
      dump.php
  4. 423 0
      dump_bak.php
  5. BIN
      item.xlsx
  6. 19 0
      projects/colorrun/output/choujiang.config.php
  7. 43 0
      projects/colorrun/output/huoyue.config.php
  8. 31 0
      projects/colorrun/output/huoyuereward.config.php
  9. 33 0
      projects/colorrun/output/item.config.php
  10. 10 0
      projects/colorrun/output/meiriyaoqing.config.php
  11. 3391 0
      projects/colorrun/output/road.config.php
  12. 87 0
      projects/colorrun/output/roadcolor.config.php
  13. 45 0
      projects/colorrun/output/signin.config.php
  14. 111 0
      projects/colorrun/output/weiji.config.php
  15. 48 0
      projects/colorrun/output/yaoqing.config.php
  16. 48 0
      projects/colorrun/output/zhuti.config.php
  17. 19 0
      projects/colorrun/script/choujiang.php
  18. 19 0
      projects/colorrun/script/huoyue.php
  19. 18 0
      projects/colorrun/script/huoyuereward.php
  20. 17 0
      projects/colorrun/script/item.php
  21. 18 0
      projects/colorrun/script/meiriyaoqing.php
  22. 25 0
      projects/colorrun/script/road.php
  23. 18 0
      projects/colorrun/script/roadcolor.php
  24. 17 0
      projects/colorrun/script/signin.php
  25. 20 0
      projects/colorrun/script/weiji.php
  26. 20 0
      projects/colorrun/script/yaoqing.php
  27. 20 0
      projects/colorrun/script/zhuti.php
  28. BIN
      projects/colorrun/source/choujiang.xlsx
  29. BIN
      projects/colorrun/source/huoyue.xlsx
  30. BIN
      projects/colorrun/source/huoyuereward.xlsx
  31. BIN
      projects/colorrun/source/item.xlsx
  32. BIN
      projects/colorrun/source/meiriyaoqing.xlsx
  33. BIN
      projects/colorrun/source/road.xlsx
  34. BIN
      projects/colorrun/source/roadcolor.xlsx
  35. BIN
      projects/colorrun/source/signin.xlsx
  36. BIN
      projects/colorrun/source/weiji.xlsx
  37. BIN
      projects/colorrun/source/yaoqing.xlsx
  38. BIN
      projects/colorrun/source/zhuti.xlsx
  39. 1643 0
      projects/rank/output/rank.config.php
  40. 21 0
      projects/rank/script/rank.php
  41. BIN
      projects/rank/source/rank.xlsx
  42. 45 0
      projects/runball/output/road.config.php
  43. 59 0
      projects/runball/output/sign.config.php
  44. 45 0
      projects/runball/output/theme.config.php
  45. 18 0
      projects/runball/script/road.php
  46. 18 0
      projects/runball/script/sign.php
  47. 18 0
      projects/runball/script/theme.php
  48. BIN
      projects/runball/source/road.xlsx
  49. BIN
      projects/runball/source/sign.xlsx
  50. BIN
      projects/runball/source/theme.xlsx
  51. 343 0
      projects/shot/output/doll.config.php
  52. 156 0
      projects/shot/output/item.config.php
  53. 111 0
      projects/shot/output/mission.config.php
  54. 101 0
      projects/shot/output/product.config.php
  55. 41 0
      projects/shot/script/doll.php
  56. 30 0
      projects/shot/script/item.php
  57. 25 0
      projects/shot/script/mission.php
  58. 30 0
      projects/shot/script/product.php
  59. BIN
      projects/shot/source/doll.xlsx
  60. BIN
      projects/shot/source/item.xlsx
  61. BIN
      projects/shot/source/mission.xlsx
  62. BIN
      projects/shot/source/product.xlsx
  63. 66 0
      projects/tww/output/mission.config.php
  64. 120 0
      projects/tww/output/product.config.php
  65. 25 0
      projects/tww/script/mission.php
  66. 29 0
      projects/tww/script/product.php
  67. BIN
      projects/tww/source/mission.xlsx
  68. BIN
      projects/tww/source/product.xlsx
  69. 10 0
      test.php
  70. 7 0
      vendor/autoload.php
  71. 445 0
      vendor/composer/ClassLoader.php
  72. 21 0
      vendor/composer/LICENSE
  73. 9 0
      vendor/composer/autoload_classmap.php
  74. 9 0
      vendor/composer/autoload_namespaces.php
  75. 11 0
      vendor/composer/autoload_psr4.php
  76. 52 0
      vendor/composer/autoload_real.php
  77. 36 0
      vendor/composer/autoload_static.php
  78. 142 0
      vendor/composer/installed.json
  79. 2 0
      vendor/phpoffice/phpspreadsheet/.gitattributes
  80. 31 0
      vendor/phpoffice/phpspreadsheet/.github/ISSUE_TEMPLATE.md
  81. 16 0
      vendor/phpoffice/phpspreadsheet/.github/PULL_REQUEST_TEMPLATE.md
  82. 22 0
      vendor/phpoffice/phpspreadsheet/.github/stale.yml
  83. 15 0
      vendor/phpoffice/phpspreadsheet/.github/support.yml
  84. 11 0
      vendor/phpoffice/phpspreadsheet/.gitignore
  85. 181 0
      vendor/phpoffice/phpspreadsheet/.php_cs.dist
  86. 27 0
      vendor/phpoffice/phpspreadsheet/.scrutinizer.yml
  87. 40 0
      vendor/phpoffice/phpspreadsheet/.travis.yml
  88. 1593 0
      vendor/phpoffice/phpspreadsheet/CHANGELOG.PHPExcel.md
  89. 124 0
      vendor/phpoffice/phpspreadsheet/CHANGELOG.md
  90. 11 0
      vendor/phpoffice/phpspreadsheet/CONTRIBUTING.md
  91. 345 0
      vendor/phpoffice/phpspreadsheet/LICENSE
  92. 8 0
      vendor/phpoffice/phpspreadsheet/bin/migrate-from-phpexcel
  93. 33 0
      vendor/phpoffice/phpspreadsheet/bin/pre-commit
  94. 78 0
      vendor/phpoffice/phpspreadsheet/composer.json
  95. 3103 0
      vendor/phpoffice/phpspreadsheet/composer.lock
  96. 51 0
      vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/Architecture.cd
  97. BIN
      vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/Architecture.png
  98. 64 0
      vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/ClassDiagrams.csproj
  99. 5 0
      vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/ClassDiagrams.csproj.user
  100. 0 0
      vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/ClassDiagrams.sln

+ 5 - 0
composer.json

@@ -0,0 +1,5 @@
+{
+    "require": {
+        "phpoffice/phpspreadsheet": "^1.1"
+    }
+}

+ 154 - 0
composer.lock

@@ -0,0 +1,154 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "722ab4e7432f9d435c34f722defe0b80",
+    "packages": [
+        {
+            "name": "phpoffice/phpspreadsheet",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+                "reference": "a2771e562e3a17c0d512d2009e38fd628beece90"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a2771e562e3a17c0d512d2009e38fd628beece90",
+                "reference": "a2771e562e3a17c0d512d2009e38fd628beece90",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-dom": "*",
+                "ext-gd": "*",
+                "ext-iconv": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "ext-xml": "*",
+                "ext-xmlreader": "*",
+                "ext-xmlwriter": "*",
+                "ext-zip": "*",
+                "ext-zlib": "*",
+                "php": "^5.6|^7.0",
+                "psr/simple-cache": "^1.0"
+            },
+            "require-dev": {
+                "dompdf/dompdf": "^0.8.0",
+                "friendsofphp/php-cs-fixer": "@stable",
+                "jpgraph/jpgraph": "^4.0",
+                "mpdf/mpdf": "^7.0.0",
+                "phpunit/phpunit": "^5.7",
+                "squizlabs/php_codesniffer": "^2.7",
+                "tecnickcom/tcpdf": "^6.2"
+            },
+            "suggest": {
+                "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+                "ext-dom": "Option to read and write HTML files",
+                "ext-gd": "Required for exact column width autocalculation",
+                "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+                "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "http://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Erik Tilt"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "http://rootslabs.net"
+                },
+                {
+                    "name": "Mark Baker",
+                    "homepage": "http://markbakeruk.net"
+                }
+            ],
+            "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "gnumeric",
+                "ods",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "time": "2018-01-28T12:37:15+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
+                "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "time": "2017-01-02T13:31:39+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}

+ 299 - 0
dump.php

@@ -0,0 +1,299 @@
+<?php
+include "vendor/autoload.php";
+
+// 调试输出
+function vd($msg)
+{
+    print_r($msg);
+    echo PHP_EOL;
+}
+
+function vde($msg)
+{
+    vd($msg);
+    exit;
+}
+
+// 解析参数
+function explainArgv($argv)
+{
+    $args = [];
+    foreach ($argv as $value) {
+        list($k, $v) = explode('=', $value);
+        $k        = ltrim(ltrim(trim($k), '--'), '-');
+        $v        = trim($v);
+        $args[$k] = $v;
+    }
+    return $args;
+}
+
+function usage()
+{
+    echo '使用示例:' . PHP_EOL;
+    echo 'php ./dump.php -app=shot -split=false' . PHP_EOL;
+}
+
+class Dump
+{
+    // 文件夹路径符
+    private static $DS = '/';
+
+    /**
+     * @var string
+     */
+    private $appName;
+
+    /**
+     * 是否需要分子目录
+     *
+     * @var boolean
+     */
+    private $split = false;
+
+    /**
+     * 源文件目录
+     */
+    private $sourceDir;
+
+    /**
+     * 脚本目录
+     */
+    private $scriptDir;
+
+    /**
+     * 导出文件目录
+     */
+    private $outputDir;
+
+    /**
+     * Dump constructor.
+     *
+     * @param array $args
+     */
+    public function __construct($args)
+    {
+//        vd(sprintf("$args: %s", var_export($args, true)));
+        if (!isset($args['app'])) {
+            vd('参数错误');
+            usage();
+            exit;
+        }
+        // 初始化导出参数
+        $this->appName = $args['app'];
+        if (isset($args['split'])) {
+            $this->split = $args['split'];
+        }
+        $this->sourceDir = __DIR__ . self::$DS . 'projects' . self::$DS . $this->appName . self::$DS . 'source';
+        $this->scriptDir = __DIR__ . self::$DS . 'projects' . self::$DS . $this->appName . self::$DS . 'script';
+        $this->outputDir = __DIR__ . self::$DS . 'projects' . self::$DS . $this->appName . self::$DS . 'output';
+
+        // 检查目录文件是否缺失
+        if (!is_dir($this->sourceDir)) {
+            vde('源文件目录缺失:' . $this->sourceDir);
+        }
+        if (!is_dir($this->scriptDir)) {
+            vde('脚本目录缺失:' . $this->scriptDir);
+        }
+        if (!is_dir($this->outputDir)) {
+            vde('输出目录缺失:' . $this->outputDir);
+        }
+    }
+
+    /**
+     * 执行主函数
+     */
+    public function run()
+    {
+        // 遍历源目录, 找出所有可执行的文件
+        $files     = [];
+        $sourceDir = dir($this->sourceDir);
+        while ($file = $sourceDir->read()) {
+            if ($file == '.' || $file == '..') {
+                continue;
+            }
+            $pathInfo = pathinfo($file);
+            // 现在仅支持xlsx文件
+            if ($pathInfo['extension'] != 'xlsx') {
+                continue;
+            }
+            $files[] = $pathInfo;
+        }
+        $sourceDir->close();
+        if (empty($files)) {
+            vde('源目录为空, 未找到.xlsx文件, 源目录:' . $this->sourceDir);
+        }
+
+        // 执行导出
+        $success = 0;
+        foreach ($files as $fileInfo) {
+            if ($this->dump($fileInfo)) {
+                ++$success;
+            }
+        }
+
+        vd(sprintf("导出完成,共[%d]个文件, 成功[%d]个文件.", count($files), $success));
+
+
+        /*
+        // 组装导出目录
+        $dumpBase = '..' . self::$DS . '..' . self::$DS . 'output' . self::$DS . $this->appName;
+        self::vd($dumpBase);
+
+        // 找到最后一次导出目录
+        $lastDumpDir = $this->getLastDumpDir($dumpBase);
+        self::vd("Last Dump Dir: " . $lastDumpDir);
+
+        // 获取json文件路径
+        $jsonPath = $lastDumpDir . self::$DS . 'PHP' . self::$DS . $this->dumpName . '.json';
+
+        // 读取json文件,并解析成数组
+        $json = $this->getJsonData($jsonPath);
+
+        // 写配置文件
+        $this->writeData($json, $lastDumpDir, $this->dumpName);
+
+        // 判断此配置文件是否有特殊逻辑
+        $methodName = $this->dumpName . '_handler';
+        if (method_exists($this, $methodName)) {
+            $this->$methodName($json, $lastDumpDir, $this->dumpName);
+            self::vd("{$methodName} Done...");
+        }
+
+        // 删除json文件
+        unlink($jsonPath);
+
+        // 退出
+        self::vd("Dump Done ...", true);
+        */
+    }
+
+
+    /**
+     * 导出表
+     *
+     * @param array $fileInfo
+     * @return bool
+     */
+    private function dump($fileInfo)
+    {
+        // 找到文件对应的执行脚本
+        $script = $this->scriptDir . self::$DS . $fileInfo['filename'] . '.php';
+        if (!file_exists($script)) {
+            vd(sprintf('[%s]对应的脚本文件不存在, 脚本文件:%s', $fileInfo['basename'], $script));
+            return false;
+        }
+
+        // 引入脚本
+        include $script;
+
+        // 读取excel文件内容
+        $sourceData = $this->getDataFromSource($this->sourceDir . self::$DS . $fileInfo['basename']);
+//        vde($sourceData);
+        if (count($sourceData) < $dataLine) {
+            vd(sprintf('[%s]文件没有数据', $fileInfo['basename']));
+            return false;
+        }
+
+        // 处理导出列对应的索引
+        $indexes = [];
+//        vd($sourceData[$columnLine - 1]);
+        foreach ($sourceData[$columnLine - 1] as $index => $column) {
+            if (isset($columns[$column])) {
+                $indexes[$column] = $index;
+            }
+        }
+//        vd($indexes);
+
+        // 普通处理逻辑
+        $data = [];
+        foreach ($sourceData as $k => $v) {
+            // 非数据列不处理
+            if ($k < $dataLine - 1) {
+                continue;
+            }
+
+            $row = [];
+            foreach ($columns as $column => $columnType) {
+                $columnValue = trim($v[$indexes[$column]]);
+                switch ($columnType) {
+                    case 'float':
+                        $columnValue = floatval($columnValue);
+                        break;
+                    case 'number':
+                        $columnValue = intval($columnValue);
+                        break;
+                    case 'json':
+                        $columnValue = json_decode($columnValue, true);
+                        break;
+                    default:
+                        $columnValue = strval($columnValue);
+                        break;
+                }
+                $row[$column] = $columnValue;
+            }
+            // 跳过空行
+            if (!$row[$keyColumn]) {
+                continue;
+            }
+
+            $data[$row[$keyColumn]] = $row;
+        }
+
+        // 额外处理逻辑
+        $handle = $fileInfo['filename'] . '_handle';
+        if (function_exists($handle)) {
+            $data = $handle($data);
+        }
+
+        // 写入文件
+        $outputFile = $this->outputDir . self::$DS . $fileInfo['filename'] . '.config.php';
+        $this->writeFile($outputFile, $data);
+
+        return true;
+    }
+
+    /**
+     * @param string $file 源文件地址
+     * @return array
+     */
+    private function getDataFromSource($file)
+    {
+        $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
+        $reader->setReadDataOnly(['Sheet 1']);
+        $spreadsheet = $reader->load($file);
+        $data        = $spreadsheet->getActiveSheet()->toArray();
+        return $data;
+    }
+
+    /**
+     * 写入php文件
+     *
+     * @param string $file 写入文件路径
+     * @param string $data 写入文件内容
+     * @return void
+     */
+    private function writeFile($file, $data)
+    {
+        // 写入配置文件
+        $configs = var_export($data, true);
+        // 整理输出格式
+        $config = <<<TXT
+<?php
+return {$configs};
+TXT;
+
+        // 写入导出文件
+        file_put_contents($file, $config);
+    }
+}
+
+/*
+ * 使用说明
+ * php ./dump.php -app=shot -split=false
+ */
+// 读取 & 解析命令行参数
+array_shift($argv);
+$args = explainArgv($argv);
+// 执行导出
+$dump = new Dump($args);
+$dump->run();

+ 423 - 0
dump_bak.php

@@ -0,0 +1,423 @@
+<?php
+
+class DumpBak
+{
+    // 文件夹路径符
+    private static $DS = '/';
+    // 是否分子文件夹存储
+    private static $CREATE_PHP_CONFIG_IN_CHILD_DIR = 3;
+    // 是否分子文件存储
+    private static $CREATE_CHILD_PHP_CONFIG = 4;
+
+    /**
+     * @var string
+     */
+    private $appName;
+
+    /**
+     * @var string
+     */
+    private $dumpName;
+
+    /**
+     * 是否需要分子目录
+     *
+     * @var boolean
+     */
+    private $needChildDir = false;
+
+    /**
+     * 是否切割配置文件
+     *
+     * @var boolean
+     */
+    private $needSplitConfig = false;
+
+    /**
+     * Dump constructor.
+     *
+     * @param array $argv
+     */
+    public function __construct($argv)
+    {
+        self::vd(sprintf("argv: %s", var_export($argv, true)));
+        $this->appName  = $argv[1];
+        $this->dumpName = $argv[2];
+        if (isset($argv[3])) {
+            $this->outputOption = $argv['3'];
+        }
+
+        // 初始化是否需要分子目录
+        self::vd(sprintf("outputOption: %s", $this->outputOption));
+        if (!is_null($this->outputOption)) {
+            $this->needChildDir = $this->outputOption & self::$CREATE_PHP_CONFIG_IN_CHILD_DIR;
+        }
+        self::vd(sprintf("needChildDir: %s", var_export($this->needChildDir, true)));
+
+
+        // 初始化是否需要切割配置文件
+        if (!is_null($this->outputOption)) {
+            $this->needSplitConfig = $this->outputOption & self::$CREATE_CHILD_PHP_CONFIG;
+        }
+        self::vd(sprintf("needSplitConfig: %s", var_export($this->needSplitConfig, true)));
+    }
+
+    /**
+     * 执行主函数
+     */
+    public function run()
+    {
+        // 判断参数是否正确
+        self::vd("App Name: {$this->appName}, Dump Name: {$this->dumpName}, Option: {$this->outputOption}");
+        if (!$this->appName || !$this->dumpName) {
+            self::vd("App Name or Dump Name not provided, quit ...", true);
+        }
+
+        // 组装导出目录
+        $dumpBase = '..' . self::$DS . '..' . self::$DS . 'output' . self::$DS . $this->appName;
+        self::vd($dumpBase);
+
+        // 找到最后一次导出目录
+        $lastDumpDir = $this->getLastDumpDir($dumpBase);
+        self::vd("Last Dump Dir: " . $lastDumpDir);
+
+        // 获取json文件路径
+        $jsonPath = $lastDumpDir . self::$DS . 'PHP' . self::$DS . $this->dumpName . '.json';
+
+        // 读取json文件,并解析成数组
+        $json = $this->getJsonData($jsonPath);
+
+        // 写配置文件
+        $this->writeData($json, $lastDumpDir, $this->dumpName);
+
+        // 判断此配置文件是否有特殊逻辑
+        $methodName = $this->dumpName . '_handler';
+        if (method_exists($this, $methodName)) {
+            $this->$methodName($json, $lastDumpDir, $this->dumpName);
+            self::vd("{$methodName} Done...");
+        }
+
+        // 删除json文件
+        unlink($jsonPath);
+
+        // 退出
+        self::vd("Dump Done ...", true);
+    }
+
+    /**
+     * 写入配置文件
+     *
+     * @param string $json
+     * @param string $dumpDir             文件输出目录
+     * @param string $dumpName            输出文件名
+     * @param boolean $handlerNoNeedSplit default false, 强制不切割通过handler生成的文件
+     */
+    private function writeData($json, $dumpDir, $dumpName, $handlerNoNeedSplit = false)
+    {
+        $dumpPath = $dumpDir . self::$DS . 'PHP';
+
+        // 如果需要分子目录存储,则需要再生成一层子目录
+        if ($this->needChildDir) {
+            $dumpNameArray = explode('_', $dumpName);
+            if (count($dumpNameArray) >= 2) {
+                $dumpPath .= self::$DS . $dumpNameArray[0] . '_' . $dumpNameArray[1];
+
+                // 创建目录
+                if (!file_exists($dumpPath)) {
+                    var_dump(mkdir($dumpPath));
+
+                    self::vd("make dir: " . $dumpPath);
+                }
+            }
+        }
+
+        $phpFile = $dumpPath . self::$DS . $dumpName . '.config.php';
+        $this->writeFile($phpFile, $json);
+
+        // 切割配置文件
+        if ($this->needSplitConfig && !$handlerNoNeedSplit) {
+            // 切割文件都统一放到以原文件名命名的文件夹内
+            $dumpPath .= self::$DS . $dumpName;
+            if (!file_exists($dumpPath)) {
+                mkdir($dumpPath);
+                self::vd("make dir: " . $dumpPath);
+            }
+
+            // 按行切割文件
+            foreach ($json as $configId => $config) {
+                $phpFile = $dumpPath . self::$DS . $configId . '.config.php';
+                $this->writeFile($phpFile, $config);
+            }
+        }
+    }
+
+    /**
+     * 写入php文件
+     *
+     * @param string $file 写入文件路径
+     * @param string $data 写入文件内容
+     * @return void
+     */
+    private function writeFile($file, $data)
+    {
+        // 写入配置文件
+        $configs = var_export($data, true);
+        // 整理输出格式
+        $config = <<<TXT
+<?php
+return {$configs};
+TXT;
+
+        // 写入导出文件
+        file_put_contents($file, $config);
+    }
+
+    /**
+     * 读取json数据
+     *
+     * @param string $jsonPath
+     * @return array
+     */
+    private function getJsonData($jsonPath)
+    {
+        if (!file_exists($jsonPath)) {
+            self::vd("Target json file not found, quit: {$jsonPath}", true);
+        }
+
+        $jsonStr = file_get_contents($jsonPath);
+        $json    = json_decode($jsonStr, true);
+
+        // 轮询数组的value,将子json结构成数组结构
+        foreach ($json as $key => $valueArr) {
+            foreach ($valueArr as $valueKey => $value) {
+                $decodedValue = @json_decode($value, true); // 如果$value是数组输入的话,会报warning,压制掉
+                if (is_array($decodedValue)) {
+                    $json[$key][$valueKey] = $decodedValue;
+                }
+            }
+        }
+
+        ksort($json);
+
+        return $json;
+    }
+
+    /**
+     * 找到最后一次导出目录
+     *
+     * @param string $dumpBase
+     * @return string
+     */
+    private function getLastDumpDir($dumpBase)
+    {
+        $lastDumpDir = null;
+        $dumpBaseDir = new DirectoryIterator($dumpBase);
+
+        /* @var DirectoryIterator $info */
+        foreach ($dumpBaseDir as $info) {
+            if ($info->isDir()) {
+                $lastDumpDir = $info->getFilename();
+            }
+        }
+
+        return $dumpBase . self::$DS . $lastDumpDir;
+    }
+
+    /**
+     * 输出调试信息
+     *
+     * @param string $msg
+     * @param boolean $exit default false, 是否退出程序执行
+     * @return void
+     */
+    private static function vd($msg, $exit = false)
+    {
+        echo $msg . "\r\n";
+        if ($exit) {
+            exit;
+        }
+    }
+
+    /**
+     * 处理成就, 找出entityId => configId对应关系
+     *
+     * @param array $originData
+     * @param string $dumpDir
+     * @param string $originName
+     * @return void
+     */
+    private function module_achievement_handler($originData, $dumpDir, $originName)
+    {
+        // 生成新数据
+        $data = [];
+        foreach ($originData as $config) {
+            if (!$config['require']) {
+                continue;
+            }
+
+            foreach ($config['require'] as $entityId => $value) {
+                if (!isset($data[$entityId])) {
+                    $effects = [];
+                } else {
+                    $effects = $data[$entityId]['effects'];
+                }
+                $effects[]       = $config['configId'];
+                $data[$entityId] = [
+                    'entityId' => $entityId,
+                    'effects'  => $effects,
+                ];
+            }
+        }
+
+        // 生成配置文件
+        $dumpName = 'module_achievement_effects';
+        $this->writeData($data, $dumpDir, $dumpName);
+    }
+
+    /**
+     * 处理任务, 生成等级任务表
+     *
+     * @param array $originData
+     * @param string $dumpDir
+     * @param string $originName
+     * @return void
+     */
+    private function module_mission_handler($originData, $dumpDir, $originName)
+    {
+        $data = [];
+        foreach ($originData as $config) {
+            $typeKey = null;
+            switch ($config['type']) {
+                case 2:
+                    $typeKey = 'dailyMission';
+                    break;
+                case 3:
+                    $typeKey = 'dailyTimeMission';
+                    break;
+                case 4:
+                    $typeKey = 'dailyVipMission';
+                    break;
+                default:
+                    break;
+            }
+
+            if (is_null($typeKey)) {
+                continue;
+            }
+
+            $maxLv = $config['level'] + 10;
+            for ($lv = $config['level']; $lv < $maxLv; ++$lv) {
+                if (!isset($data[$lv])) {
+                    $data[$lv] = [
+                        'configId'         => $lv,
+                        'level'            => $lv,
+                        'dailyMission'     => [],
+                        'dailyVipMission'  => [],
+                        'dailyTimeMission' => [],
+                    ];
+                }
+
+                $data[$lv][$typeKey][] = $config['configId'];
+            }
+        }
+
+        // 生成配置文件
+        $dumpName = 'module_mission_daily';
+        $this->writeData($data, $dumpDir, $dumpName);
+    }
+
+    /**
+     * 处理dol_social_help, 生成一张以helpId为主键的表
+     *
+     * @param array $originData
+     * @param string $dumpDir
+     * @param string $originName
+     * @return void
+     */
+    private function dol_social_help_handler($originData, $dumpDir, $originName)
+    {
+        // 整理数据
+        $data = [];
+        foreach ($originData as $config) {
+            $helpId        = strval($config['helpId']);
+            $data[$helpId] = $config;
+        }
+
+        // 生成配置文件
+        $dumpName = 'dol_social_help_auto_create';
+        $this->writeData($data, $dumpDir, $dumpName);
+    }
+
+    /**
+     * 处理dol_social_request, 生成一张以requestDefId为主键的表
+     *
+     * @param array $originData
+     * @param string $dumpDir
+     * @param string $originName
+     * @return void
+     */
+    private function dol_social_request_handler($originData, $dumpDir, $originName)
+    {
+        // 整理数据
+        $data = [];
+        foreach ($originData as $config) {
+            $helpId        = strval($config['requestDefId']);
+            $data[$helpId] = $config;
+        }
+
+        // 生成配置文件
+        $dumpName = 'dol_social_request_auto_create';
+        $this->writeData($data, $dumpDir, $dumpName);
+    }
+
+    /**
+     * 处理dol_social_feed, 生成一张以feedDefId为主键的表
+     *
+     * @param array $originData
+     * @param string $dumpDir
+     * @param string $originName
+     * @return void
+     */
+    private function dol_social_feed_handler($originData, $dumpDir, $originName)
+    {
+        // 整理数据
+        $data = [];
+        foreach ($originData as $config) {
+            $helpId        = strval($config['feedDefId']);
+            $data[$helpId] = $config;
+        }
+
+        // 生成配置文件
+        $dumpName = 'dol_social_feed_auto_create';
+        $this->writeData($data, $dumpDir, $dumpName);
+    }
+
+    /**
+     * 处理dol_drop, 切割掉落配置文件, 将配置文件按组切成一个个的配置文件
+     *
+     * @param array $originData
+     * @param string $dumpDir
+     * @param string $originName
+     * @return void
+     */
+    private function dol_drop_handler($originData, $dumpDir, $originName)
+    {
+        $groupData = [];
+
+        // 按组划分数组
+        foreach ($originData as $configId => $config) {
+            $groupData[$config['groupId']][$configId] = $config;
+        }
+
+        // 分组写入文件
+        $namePrefix = 'dol_drop_group_';
+        foreach ($groupData as $groupId => $data) {
+            $dumpName = $namePrefix . $groupId;
+            $this->writeData($data, $dumpDir, $dumpName, true);
+        }
+    }
+
+}
+
+$dump = new Dump($argv);
+$dump->run();

BIN
item.xlsx


+ 19 - 0
projects/colorrun/output/choujiang.config.php

@@ -0,0 +1,19 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'rewarditem' => '1;2;3;4',
+    'rewardnum' => '100;10;1;1',
+    'rewardweight' => '50;10;10;10',
+    'requiretime' => '1;5;10',
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'rewarditem' => '1;2;3;4',
+    'rewardnum' => '100;10;1;1',
+    'rewardweight' => '100;0;0;0',
+    'requiretime' => '10',
+  ),
+);

+ 43 - 0
projects/colorrun/output/huoyue.config.php

@@ -0,0 +1,43 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'type' => 1,
+    'num' => 5,
+    'des' => '完成5次游戏',
+    'huoyue' => 20,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'type' => 2,
+    'num' => 1000,
+    'des' => '单次游戏获得1000分',
+    'huoyue' => 20,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'type' => 2,
+    'num' => 5000,
+    'des' => '单次游戏获得5000分',
+    'huoyue' => 20,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'type' => 3,
+    'num' => 2,
+    'des' => '完成2次抽奖',
+    'huoyue' => 20,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'type' => 4,
+    'num' => 3,
+    'des' => '发送3次分享',
+    'huoyue' => 20,
+  ),
+);

+ 31 - 0
projects/colorrun/output/huoyuereward.config.php

@@ -0,0 +1,31 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'huoyue' => 25,
+    'rewarditem' => 4,
+    'rewardnum' => 1,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'huoyue' => 50,
+    'rewarditem' => 3,
+    'rewardnum' => 1,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'huoyue' => 75,
+    'rewarditem' => 1,
+    'rewardnum' => 100,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'huoyue' => 100,
+    'rewarditem' => 2,
+    'rewardnum' => 10,
+  ),
+);

+ 33 - 0
projects/colorrun/output/item.config.php

@@ -0,0 +1,33 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'name' => '金币',
+    'duration' => 0,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'name' => '钻石',
+    'duration' => 0,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'name' => '复活卡',
+    'duration' => 0,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'name' => '无敌卡',
+    'duration' => 2,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'name' => '吸金卡',
+    'duration' => 4,
+  ),
+);

+ 10 - 0
projects/colorrun/output/meiriyaoqing.config.php

@@ -0,0 +1,10 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'num' => 5,
+    'rewarditem' => '2;3',
+    'rewardnum' => '50;5',
+  ),
+);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 3391 - 0
projects/colorrun/output/road.config.php


+ 87 - 0
projects/colorrun/output/roadcolor.config.php

@@ -0,0 +1,87 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'name' => '道路1',
+    'des' => '道路1',
+    'mission' => 0,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'name' => '道路2',
+    'des' => '道路2',
+    'mission' => 3000,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'name' => '道路3',
+    'des' => '道路3',
+    'mission' => 5000,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'name' => '道路4',
+    'des' => '道路4',
+    'mission' => 8000,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'name' => '道路5',
+    'des' => '道路5',
+    'mission' => 10000,
+  ),
+  6 => 
+  array (
+    'id' => 6,
+    'name' => '道路6',
+    'des' => '道路6',
+    'mission' => 12000,
+  ),
+  7 => 
+  array (
+    'id' => 7,
+    'name' => '道路7',
+    'des' => '道路7',
+    'mission' => 15000,
+  ),
+  8 => 
+  array (
+    'id' => 8,
+    'name' => '道路8',
+    'des' => '道路8',
+    'mission' => 18000,
+  ),
+  9 => 
+  array (
+    'id' => 9,
+    'name' => '道路9',
+    'des' => '道路9',
+    'mission' => 21000,
+  ),
+  10 => 
+  array (
+    'id' => 10,
+    'name' => '道路10',
+    'des' => '道路10',
+    'mission' => 24000,
+  ),
+  11 => 
+  array (
+    'id' => 11,
+    'name' => '道路11',
+    'des' => '道路11',
+    'mission' => 27000,
+  ),
+  12 => 
+  array (
+    'id' => 12,
+    'name' => '道路12',
+    'des' => '道路12',
+    'mission' => 30000,
+  ),
+);

+ 45 - 0
projects/colorrun/output/signin.config.php

@@ -0,0 +1,45 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'rewarditem' => 4,
+    'rewardnum' => 1,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'rewarditem' => 5,
+    'rewardnum' => 2,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'rewarditem' => 1,
+    'rewardnum' => 1000,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'rewarditem' => 3,
+    'rewardnum' => 1,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'rewarditem' => 2,
+    'rewardnum' => 20,
+  ),
+  6 => 
+  array (
+    'id' => 6,
+    'rewarditem' => 5,
+    'rewardnum' => 3,
+  ),
+  7 => 
+  array (
+    'id' => 7,
+    'rewarditem' => 1,
+    'rewardnum' => 2000,
+  ),
+);

+ 111 - 0
projects/colorrun/output/weiji.config.php

@@ -0,0 +1,111 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'name' => '莹白光迹',
+    'des' => '无敌时间+1',
+    'powertime' => 1,
+    'autotime' => 0,
+    'costzs' => 10,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'name' => '湛蓝天空',
+    'des' => '吸金时间+2',
+    'powertime' => 0,
+    'autotime' => 2,
+    'costzs' => 20,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'name' => '紫色神秘',
+    'des' => '无敌时间+2',
+    'powertime' => 2,
+    'autotime' => 0,
+    'costzs' => 200,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'name' => '翠绿荧光',
+    'des' => '吸金时间+4',
+    'powertime' => 0,
+    'autotime' => 4,
+    'costzs' => 500,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'name' => '紫色神秘',
+    'des' => '无敌时间+3',
+    'powertime' => 3,
+    'autotime' => 0,
+    'costzs' => 200,
+  ),
+  6 => 
+  array (
+    'id' => 6,
+    'name' => '翠绿荧光',
+    'des' => '吸金时间+6',
+    'powertime' => 0,
+    'autotime' => 6,
+    'costzs' => 500,
+  ),
+  7 => 
+  array (
+    'id' => 7,
+    'name' => '紫色神秘',
+    'des' => '无敌时间+2,吸金时间+4',
+    'powertime' => 2,
+    'autotime' => 4,
+    'costzs' => 200,
+  ),
+  8 => 
+  array (
+    'id' => 8,
+    'name' => '翠绿荧光',
+    'des' => '无敌时间+3,吸金时间+5',
+    'powertime' => 3,
+    'autotime' => 5,
+    'costzs' => 500,
+  ),
+  9 => 
+  array (
+    'id' => 9,
+    'name' => '土豪金',
+    'des' => '无敌时间+4,吸金时间+6',
+    'powertime' => 4,
+    'autotime' => 6,
+    'costzs' => 1000,
+  ),
+  10 => 
+  array (
+    'id' => 10,
+    'name' => '紫色神秘',
+    'des' => '无敌时间+5,吸金时间+7',
+    'powertime' => 5,
+    'autotime' => 7,
+    'costzs' => 200,
+  ),
+  11 => 
+  array (
+    'id' => 11,
+    'name' => '翠绿荧光',
+    'des' => '无敌时间+6,吸金时间+8',
+    'powertime' => 6,
+    'autotime' => 8,
+    'costzs' => 500,
+  ),
+  12 => 
+  array (
+    'id' => 12,
+    'name' => '土豪金',
+    'des' => '无敌时间+8,吸金时间+10',
+    'powertime' => 8,
+    'autotime' => 10,
+    'costzs' => 1000,
+  ),
+);

+ 48 - 0
projects/colorrun/output/yaoqing.config.php

@@ -0,0 +1,48 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'type' => 1,
+    'num' => 1,
+    'des' => '邀请1个好友',
+    'rewarditem' => 4,
+    'rewardnum' => 1,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'type' => 1,
+    'num' => 3,
+    'des' => '邀请3个好友',
+    'rewarditem' => 4,
+    'rewardnum' => 1,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'type' => 2,
+    'num' => 3,
+    'des' => '邀请的3个好友活跃达到50',
+    'rewarditem' => 1,
+    'rewardnum' => 200,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'type' => 3,
+    'num' => 3,
+    'des' => '邀请的好友进行3次抽奖',
+    'rewarditem' => 2,
+    'rewardnum' => 10,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'type' => 3,
+    'num' => 5,
+    'des' => '邀请的好友进行5次抽奖',
+    'rewarditem' => 2,
+    'rewardnum' => 10,
+  ),
+);

+ 48 - 0
projects/colorrun/output/zhuti.config.php

@@ -0,0 +1,48 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'name' => '成长之路',
+    'lv' => 10,
+    'moregold' => 2.8,
+    'des' => '在游戏中得分增加180%',
+    'costgold' => 5600,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'name' => '欢庆旅途',
+    'lv' => 10,
+    'moregold' => 4.8,
+    'des' => '在游戏中得分增加380%',
+    'costgold' => 23400,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'name' => '幻想秘境',
+    'lv' => 10,
+    'moregold' => 6.8,
+    'des' => '在游戏中得分增加580%',
+    'costgold' => 41400,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'name' => '遗迹探索',
+    'lv' => 10,
+    'moregold' => 8.8,
+    'des' => '在游戏中得分增加780%',
+    'costgold' => 59400,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'name' => '虹彩路途',
+    'lv' => 10,
+    'moregold' => 10.8,
+    'des' => '在游戏中得分增加980%',
+    'costgold' => 77400,
+  ),
+);

+ 19 - 0
projects/colorrun/script/choujiang.php

@@ -0,0 +1,19 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'           => 'number',
+    'rewarditem'   => 'string',
+    'rewardnum'    => 'string',
+    'rewardweight' => 'string',
+    'requiretime'  => 'string',
+];

+ 19 - 0
projects/colorrun/script/huoyue.php

@@ -0,0 +1,19 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'     => 'number',
+    'type'   => 'number',
+    'num'    => 'number',
+    'des'    => 'string',
+    'huoyue' => 'number',
+];

+ 18 - 0
projects/colorrun/script/huoyuereward.php

@@ -0,0 +1,18 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'         => 'number',
+    'huoyue'     => 'number',
+    'rewarditem' => 'number',
+    'rewardnum'  => 'number',
+];

+ 17 - 0
projects/colorrun/script/item.php

@@ -0,0 +1,17 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'       => 'number',
+    'name'     => 'string',
+    'duration' => 'number',
+];

+ 18 - 0
projects/colorrun/script/meiriyaoqing.php

@@ -0,0 +1,18 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'         => 'number',
+    'num'        => 'number',
+    'rewarditem' => 'string',
+    'rewardnum'  => 'string',
+];

+ 25 - 0
projects/colorrun/script/road.php

@@ -0,0 +1,25 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number float json 格式
+// 未设置的字段不被导出
+$columns = [
+    'id'           => 'number',
+    'nandu'        => 'number',
+    'luduan'       => 'number',
+    'quanzhong'    => 'number',
+    'wujian'       => 'number',
+    'juli'         => 'float',
+    'type'         => 'string',
+    'color'        => 'string',
+    'sudu'         => 'number',
+    'jiasu'        => 'number',
+    'jiasushijain' => 'number',
+];

+ 18 - 0
projects/colorrun/script/roadcolor.php

@@ -0,0 +1,18 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number float json 格式
+// 未设置的字段不被导出
+$columns = [
+    'id'      => 'number',
+    'name'    => 'string',
+    'des'    => 'string',
+    'mission' => 'number',
+];

+ 17 - 0
projects/colorrun/script/signin.php

@@ -0,0 +1,17 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'      => 'number',
+    'rewarditem'    => 'number',
+    'rewardnum'    => 'number',
+];

+ 20 - 0
projects/colorrun/script/weiji.php

@@ -0,0 +1,20 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'        => 'number',
+    'name'      => 'string',
+    'des'       => 'string',
+    'powertime' => 'number',
+    'autotime'  => 'number',
+    'costzs'    => 'number',
+];

+ 20 - 0
projects/colorrun/script/yaoqing.php

@@ -0,0 +1,20 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'         => 'number',
+    'type'       => 'number',
+    'num'        => 'number',
+    'des'        => 'string',
+    'rewarditem' => 'number',
+    'rewardnum'  => 'number',
+];

+ 20 - 0
projects/colorrun/script/zhuti.php

@@ -0,0 +1,20 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'       => 'number',
+    'name'     => 'string',
+    'lv'       => 'number',
+    'moregold' => 'float',
+    'des'      => 'string',
+    'costgold' => 'number',
+];

BIN
projects/colorrun/source/choujiang.xlsx


BIN
projects/colorrun/source/huoyue.xlsx


BIN
projects/colorrun/source/huoyuereward.xlsx


BIN
projects/colorrun/source/item.xlsx


BIN
projects/colorrun/source/meiriyaoqing.xlsx


BIN
projects/colorrun/source/road.xlsx


BIN
projects/colorrun/source/roadcolor.xlsx


BIN
projects/colorrun/source/signin.xlsx


BIN
projects/colorrun/source/weiji.xlsx


BIN
projects/colorrun/source/yaoqing.xlsx


BIN
projects/colorrun/source/zhuti.xlsx


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1643 - 0
projects/rank/output/rank.config.php


+ 21 - 0
projects/rank/script/rank.php

@@ -0,0 +1,21 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'auto_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'auto_id'      => 'number',
+    'grade_id'     => 'number',
+    'level'        => 'number',
+    'star'         => 'number',
+    'min_exp'      => 'number',
+    'max_exp'      => 'number',
+    'unrelegation' => 'number',
+];

BIN
projects/rank/source/rank.xlsx


+ 45 - 0
projects/runball/output/road.config.php

@@ -0,0 +1,45 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'money' => 0,
+    'icon' => 1,
+    'texture' => 1,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'money' => 50,
+    'icon' => 2,
+    'texture' => 2,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'money' => 90,
+    'icon' => 3,
+    'texture' => 3,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'money' => 130,
+    'icon' => 4,
+    'texture' => 4,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'money' => 200,
+    'icon' => 5,
+    'texture' => 5,
+  ),
+  6 => 
+  array (
+    'id' => 6,
+    'money' => 500,
+    'icon' => 6,
+    'texture' => 6,
+  ),
+);

+ 59 - 0
projects/runball/output/sign.config.php

@@ -0,0 +1,59 @@
+<?php
+return array (
+  1 => 
+  array (
+    'day' => 1,
+    'rewards_type' => 'money',
+    'amount' => 20,
+    'treasure' => 
+    array (
+    ),
+  ),
+  2 => 
+  array (
+    'day' => 2,
+    'rewards_type' => 'money',
+    'amount' => 50,
+    'treasure' => 
+    array (
+    ),
+  ),
+  3 => 
+  array (
+    'day' => 3,
+    'rewards_type' => 'money',
+    'amount' => 90,
+    'treasure' => 
+    array (
+    ),
+  ),
+  4 => 
+  array (
+    'day' => 4,
+    'rewards_type' => 'money',
+    'amount' => 130,
+    'treasure' => 
+    array (
+    ),
+  ),
+  5 => 
+  array (
+    'day' => 5,
+    'rewards_type' => 'money',
+    'amount' => 200,
+    'treasure' => 
+    array (
+    ),
+  ),
+  6 => 
+  array (
+    'day' => 6,
+    'rewards_type' => 'treasure',
+    'amount' => 1,
+    'treasure' => 
+    array (
+      'money:100' => 99,
+      'road:6' => 1,
+    ),
+  ),
+);

+ 45 - 0
projects/runball/output/theme.config.php

@@ -0,0 +1,45 @@
+<?php
+return array (
+  1 => 
+  array (
+    'id' => 1,
+    'money' => 0,
+    'icon' => 1,
+    'texture' => 1,
+  ),
+  2 => 
+  array (
+    'id' => 2,
+    'money' => 50,
+    'icon' => 2,
+    'texture' => 2,
+  ),
+  3 => 
+  array (
+    'id' => 3,
+    'money' => 90,
+    'icon' => 3,
+    'texture' => 3,
+  ),
+  4 => 
+  array (
+    'id' => 4,
+    'money' => 130,
+    'icon' => 4,
+    'texture' => 4,
+  ),
+  5 => 
+  array (
+    'id' => 5,
+    'money' => 200,
+    'icon' => 5,
+    'texture' => 5,
+  ),
+  6 => 
+  array (
+    'id' => 6,
+    'money' => 500,
+    'icon' => 6,
+    'texture' => 6,
+  ),
+);

+ 18 - 0
projects/runball/script/road.php

@@ -0,0 +1,18 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'      => 'number',
+    'money'   => 'number',
+    'icon'    => 'number',
+    'texture' => 'number',
+];

+ 18 - 0
projects/runball/script/sign.php

@@ -0,0 +1,18 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'day';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'day'          => 'number',
+    'rewards_type' => 'string',
+    'amount'       => 'number',
+    'treasure'     => 'json',
+];

+ 18 - 0
projects/runball/script/theme.php

@@ -0,0 +1,18 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'id';
+// 哪些字段被导出以及导出的格式
+// 支持string number 和 json 三种格式
+// 未设置的字段不被导出
+$columns = [
+    'id'      => 'number',
+    'money'   => 'number',
+    'icon'    => 'number',
+    'texture' => 'number',
+];

BIN
projects/runball/source/road.xlsx


BIN
projects/runball/source/sign.xlsx


BIN
projects/runball/source/theme.xlsx


+ 343 - 0
projects/shot/output/doll.config.php

@@ -0,0 +1,343 @@
+<?php
+return array (
+  1001 => 
+  array (
+    'doll_id' => 1001,
+    'doll_name' => '超可爱玻尿酸鸭',
+    'seq' => 1,
+    'price' => 7900,
+    'consume' => 18,
+    'item_id' => 1001,
+    'icon' => 'boniaosuanya.jpg',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => 'new.png',
+    'second_tag' => 'hot.png',
+    'details' => 'detail_1001_1.jpg;detail_1001_2.jpg',
+  ),
+  1002 => 
+  array (
+    'doll_id' => 1002,
+    'doll_name' => 'line布朗熊',
+    'seq' => 11,
+    'price' => 3000,
+    'consume' => 10,
+    'item_id' => 1002,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1003 => 
+  array (
+    'doll_id' => 1003,
+    'doll_name' => 'line可妮兔',
+    'seq' => 15,
+    'price' => 3000,
+    'consume' => 10,
+    'item_id' => 1003,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1004 => 
+  array (
+    'doll_id' => 1004,
+    'doll_name' => '可莱丝补水保湿面膜',
+    'seq' => 2,
+    'price' => 1800,
+    'consume' => 12,
+    'item_id' => 1004,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1005 => 
+  array (
+    'doll_id' => 1005,
+    'doll_name' => '懒蛋蛋呕吐蛋黄君',
+    'seq' => 4,
+    'price' => 1000,
+    'consume' => 6,
+    'item_id' => 1005,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1006 => 
+  array (
+    'doll_id' => 1006,
+    'doll_name' => '拿荷叶龙猫',
+    'seq' => 5,
+    'price' => 3900,
+    'consume' => 12,
+    'item_id' => 1006,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1007 => 
+  array (
+    'doll_id' => 1007,
+    'doll_name' => '史迪仔挂件',
+    'seq' => 12,
+    'price' => 1200,
+    'consume' => 8,
+    'item_id' => 1007,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1008 => 
+  array (
+    'doll_id' => 1008,
+    'doll_name' => '史迪仔娃娃',
+    'seq' => 6,
+    'price' => 3000,
+    'consume' => 10,
+    'item_id' => 1008,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1009 => 
+  array (
+    'doll_id' => 1009,
+    'doll_name' => '粉红豹',
+    'seq' => 3,
+    'price' => 3000,
+    'consume' => 10,
+    'item_id' => 1009,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1010 => 
+  array (
+    'doll_id' => 1010,
+    'doll_name' => '帽子蒙奇奇',
+    'seq' => 7,
+    'price' => 3500,
+    'consume' => 15,
+    'item_id' => 1010,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1011 => 
+  array (
+    'doll_id' => 1011,
+    'doll_name' => '西瓜蒙奇奇',
+    'seq' => 8,
+    'price' => 3500,
+    'consume' => 15,
+    'item_id' => 1011,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1012 => 
+  array (
+    'doll_id' => 1012,
+    'doll_name' => '小鸡蒙奇奇',
+    'seq' => 13,
+    'price' => 3500,
+    'consume' => 15,
+    'item_id' => 1012,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1013 => 
+  array (
+    'doll_id' => 1013,
+    'doll_name' => '招财猫蒙奇奇',
+    'seq' => 16,
+    'price' => 3500,
+    'consume' => 15,
+    'item_id' => 1013,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1014 => 
+  array (
+    'doll_id' => 1014,
+    'doll_name' => '黛西沐浴擦',
+    'seq' => 9,
+    'price' => 3000,
+    'consume' => 12,
+    'item_id' => 1014,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1015 => 
+  array (
+    'doll_id' => 1015,
+    'doll_name' => '美乐蒂沐浴擦',
+    'seq' => 10,
+    'price' => 3000,
+    'consume' => 12,
+    'item_id' => 1015,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1016 => 
+  array (
+    'doll_id' => 1016,
+    'doll_name' => '唐老鸭沐浴擦',
+    'seq' => 14,
+    'price' => 3000,
+    'consume' => 12,
+    'item_id' => 1016,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+  1017 => 
+  array (
+    'doll_id' => 1017,
+    'doll_name' => 'KT沐浴擦',
+    'seq' => 17,
+    'price' => 3000,
+    'consume' => 12,
+    'item_id' => 1017,
+    'icon' => '',
+    'speed' => 3,
+    'shot_cd' => 30,
+    'first_life_base_times' => 5,
+    'first_life_rate' => 20,
+    'second_life_base_times' => 10,
+    'second_life_rate' => 10,
+    'full_rate_times' => 50,
+    'first_tag' => '',
+    'second_tag' => '',
+    'details' => '',
+  ),
+);

+ 156 - 0
projects/shot/output/item.config.php

@@ -0,0 +1,156 @@
+<?php
+return array (
+  1001 => 
+  array (
+    'item_id' => 1001,
+    'item_name' => '玻尿酸鸭',
+    'icon' => '1001.png',
+    'size' => '30',
+    'purchase_price' => 1400,
+    'stock' => 100,
+  ),
+  1002 => 
+  array (
+    'item_id' => 1002,
+    'item_name' => 'line布朗熊',
+    'icon' => '1002.png',
+    'size' => '20',
+    'purchase_price' => 400,
+    'stock' => 100,
+  ),
+  1003 => 
+  array (
+    'item_id' => 1003,
+    'item_name' => 'line可妮兔',
+    'icon' => '1003.png',
+    'size' => '20',
+    'purchase_price' => 400,
+    'stock' => 100,
+  ),
+  1004 => 
+  array (
+    'item_id' => 1004,
+    'item_name' => '可莱丝补水保湿面膜',
+    'icon' => '1004.png',
+    'size' => '8',
+    'purchase_price' => 500,
+    'stock' => 200,
+  ),
+  1005 => 
+  array (
+    'item_id' => 1005,
+    'item_name' => '懒蛋蛋呕吐蛋黄君',
+    'icon' => '1005.png',
+    'size' => '5',
+    'purchase_price' => 100,
+    'stock' => 720,
+  ),
+  1006 => 
+  array (
+    'item_id' => 1006,
+    'item_name' => '拿荷叶龙猫',
+    'icon' => '1006.png',
+    'size' => '20',
+    'purchase_price' => 700,
+    'stock' => 100,
+  ),
+  1007 => 
+  array (
+    'item_id' => 1007,
+    'item_name' => '史迪仔挂件',
+    'icon' => '1007.png',
+    'size' => '5.5',
+    'purchase_price' => 200,
+    'stock' => 300,
+  ),
+  1008 => 
+  array (
+    'item_id' => 1008,
+    'item_name' => '史迪仔娃娃',
+    'icon' => '1008.png',
+    'size' => '20',
+    'purchase_price' => 400,
+    'stock' => 200,
+  ),
+  1009 => 
+  array (
+    'item_id' => 1009,
+    'item_name' => '粉红豹',
+    'icon' => '1009.png',
+    'size' => '25',
+    'purchase_price' => 500,
+    'stock' => 200,
+  ),
+  1010 => 
+  array (
+    'item_id' => 1010,
+    'item_name' => '帽子蒙奇奇',
+    'icon' => '1010.png',
+    'size' => '8',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1011 => 
+  array (
+    'item_id' => 1011,
+    'item_name' => '西瓜蒙奇奇',
+    'icon' => '1011.png',
+    'size' => '8',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1012 => 
+  array (
+    'item_id' => 1012,
+    'item_name' => '小鸡蒙奇奇',
+    'icon' => '1012.png',
+    'size' => '8',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1013 => 
+  array (
+    'item_id' => 1013,
+    'item_name' => '招财猫蒙奇奇',
+    'icon' => '1013.png',
+    'size' => '8',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1014 => 
+  array (
+    'item_id' => 1014,
+    'item_name' => '黛西沐浴擦',
+    'icon' => '1014.png',
+    'size' => '15',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1015 => 
+  array (
+    'item_id' => 1015,
+    'item_name' => '美乐蒂沐浴擦',
+    'icon' => '1015.png',
+    'size' => '15',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1016 => 
+  array (
+    'item_id' => 1016,
+    'item_name' => '唐老鸭沐浴擦',
+    'icon' => '1016.png',
+    'size' => '15',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+  1017 => 
+  array (
+    'item_id' => 1017,
+    'item_name' => 'KT沐浴擦',
+    'icon' => '1017.png',
+    'size' => '15',
+    'purchase_price' => 500,
+    'stock' => 50,
+  ),
+);

+ 111 - 0
projects/shot/output/mission.config.php

@@ -0,0 +1,111 @@
+<?php
+return array (
+  1 => 
+  array (
+    'mission_id' => 1,
+    'mission_type' => 1,
+    'desc' => '从公众号进入游戏',
+    'target' => 1,
+    'diamond' => 10,
+    'activity' => 5,
+  ),
+  2 => 
+  array (
+    'mission_id' => 2,
+    'mission_type' => 2,
+    'desc' => '射3次娃娃',
+    'target' => 3,
+    'diamond' => 5,
+    'activity' => 5,
+  ),
+  3 => 
+  array (
+    'mission_id' => 3,
+    'mission_type' => 2,
+    'desc' => '射5次娃娃',
+    'target' => 5,
+    'diamond' => 5,
+    'activity' => 5,
+  ),
+  4 => 
+  array (
+    'mission_id' => 4,
+    'mission_type' => 3,
+    'desc' => '分享到3个不同的微信群',
+    'target' => 3,
+    'diamond' => 10,
+    'activity' => 5,
+  ),
+  5 => 
+  array (
+    'mission_id' => 5,
+    'mission_type' => 4,
+    'desc' => '分享到朋友圈3次',
+    'target' => 3,
+    'diamond' => 10,
+    'activity' => 10,
+  ),
+  6 => 
+  array (
+    'mission_id' => 6,
+    'mission_type' => 2,
+    'desc' => '射10次娃娃',
+    'target' => 10,
+    'diamond' => 5,
+    'activity' => 5,
+  ),
+  7 => 
+  array (
+    'mission_id' => 7,
+    'mission_type' => 2,
+    'desc' => '射20次娃娃',
+    'target' => 20,
+    'diamond' => 10,
+    'activity' => 5,
+  ),
+  8 => 
+  array (
+    'mission_id' => 8,
+    'mission_type' => 2,
+    'desc' => '射30次娃娃',
+    'target' => 30,
+    'diamond' => 20,
+    'activity' => 10,
+  ),
+  9 => 
+  array (
+    'mission_id' => 9,
+    'mission_type' => 5,
+    'desc' => '射落1个娃娃',
+    'target' => 1,
+    'diamond' => 20,
+    'activity' => 10,
+  ),
+  10 => 
+  array (
+    'mission_id' => 10,
+    'mission_type' => 6,
+    'desc' => '累计充值达到6元',
+    'target' => 6,
+    'diamond' => 10,
+    'activity' => 10,
+  ),
+  11 => 
+  array (
+    'mission_id' => 11,
+    'mission_type' => 6,
+    'desc' => '累计充值达到30元',
+    'target' => 30,
+    'diamond' => 10,
+    'activity' => 20,
+  ),
+  12 => 
+  array (
+    'mission_id' => 12,
+    'mission_type' => 6,
+    'desc' => '累计充值达到100元',
+    'target' => 100,
+    'diamond' => 20,
+    'activity' => 30,
+  ),
+);

+ 101 - 0
projects/shot/output/product.config.php

@@ -0,0 +1,101 @@
+<?php
+return array (
+  2001 => 
+  array (
+    'product_id' => 2001,
+    'product_name' => '60金币',
+    'price' => 300,
+    'origin_price' => 300,
+    'diamond' => 60,
+    'diamond_free' => 0,
+    'seq' => 0,
+    'day_limit' => 1,
+    'rookie' => 1,
+    'finish_time' => '42368',
+    'icon' => '',
+  ),
+  2002 => 
+  array (
+    'product_id' => 2002,
+    'product_name' => '60金币',
+    'price' => 600,
+    'origin_price' => 600,
+    'diamond' => 60,
+    'diamond_free' => 0,
+    'seq' => 10,
+    'day_limit' => 0,
+    'rookie' => 0,
+    'finish_time' => '42368',
+    'icon' => '',
+  ),
+  2003 => 
+  array (
+    'product_id' => 2003,
+    'product_name' => '200金币',
+    'price' => 1990,
+    'origin_price' => 1990,
+    'diamond' => 200,
+    'diamond_free' => 20,
+    'seq' => 20,
+    'day_limit' => 0,
+    'rookie' => 0,
+    'finish_time' => '42368',
+    'icon' => '',
+  ),
+  2004 => 
+  array (
+    'product_id' => 2004,
+    'product_name' => '400金币',
+    'price' => 3990,
+    'origin_price' => 3990,
+    'diamond' => 400,
+    'diamond_free' => 50,
+    'seq' => 30,
+    'day_limit' => 0,
+    'rookie' => 0,
+    'finish_time' => '42368',
+    'icon' => '',
+  ),
+  2005 => 
+  array (
+    'product_id' => 2005,
+    'product_name' => '1000金币',
+    'price' => 9990,
+    'origin_price' => 9990,
+    'diamond' => 1000,
+    'diamond_free' => 200,
+    'seq' => 40,
+    'day_limit' => 0,
+    'rookie' => 0,
+    'finish_time' => '42368',
+    'icon' => '',
+  ),
+  2006 => 
+  array (
+    'product_id' => 2006,
+    'product_name' => '2000金币',
+    'price' => 19990,
+    'origin_price' => 19990,
+    'diamond' => 2000,
+    'diamond_free' => 500,
+    'seq' => 50,
+    'day_limit' => 0,
+    'rookie' => 0,
+    'finish_time' => '42368',
+    'icon' => '',
+  ),
+  3001 => 
+  array (
+    'product_id' => 3001,
+    'product_name' => '运费',
+    'price' => 800,
+    'origin_price' => 800,
+    'diamond' => 0,
+    'diamond_free' => 0,
+    'seq' => 0,
+    'day_limit' => 0,
+    'rookie' => 0,
+    'finish_time' => '',
+    'icon' => '',
+  ),
+);

+ 41 - 0
projects/shot/script/doll.php

@@ -0,0 +1,41 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 3;
+// 数据对应的行数(1开始)
+$dataLine = 4;
+// 键值对应的列(1开始)
+$keyColumn = 'doll_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'doll_id'                => 'number',
+    'doll_name'              => 'string',
+    'seq'                    => 'number',
+    'price'                  => 'number',
+    'consume'                => 'number',
+    'item_id'                => 'number',
+    'icon'                   => 'string',
+    'speed'                  => 'number',
+    'shot_cd'                => 'number',
+    'first_life_base_times'  => 'number',
+    'first_life_rate'        => 'number',
+    'second_life_base_times' => 'number',
+    'second_life_rate'       => 'number',
+    'full_rate_times'        => 'number',
+    'first_tag'              => 'string',
+    'second_tag'             => 'string',
+    'details'                => 'string',
+];
+
+// 额外处理函数, 如果没有, 就不定义
+function doll_handle($data)
+{
+    foreach ($data as $key => $value) {
+        $value['price'] = intval($value['price'] * 100);
+        $data[$key]     = $value;
+    }
+    return $data;
+}

+ 30 - 0
projects/shot/script/item.php

@@ -0,0 +1,30 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 3;
+// 数据对应的行数(1开始)
+$dataLine = 4;
+// 键值对应的列(1开始)
+$keyColumn = 'item_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'item_id'        => 'number',
+    'item_name'      => 'string',
+    'icon'           => 'string',
+    'size'           => 'string',
+    'purchase_price' => 'number',
+    'stock'          => 'number',
+];
+
+// 额外处理函数, 如果没有, 就不定义
+function item_handle($data)
+{
+    foreach ($data as $key => $value) {
+        $value['purchase_price'] = intval($value['purchase_price'] * 100);
+        $data[$key]    = $value;
+    }
+    return $data;
+}

+ 25 - 0
projects/shot/script/mission.php

@@ -0,0 +1,25 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 3;
+// 数据对应的行数(1开始)
+$dataLine = 4;
+// 键值对应的列(1开始)
+$keyColumn = 'mission_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'mission_id'   => 'number',
+    'mission_type' => 'number',
+    'desc'         => 'string',
+    'target'       => 'number',
+    'diamond'      => 'number',
+    'activity'     => 'number',
+];
+
+function mission_handle($data)
+{
+    return $data;
+}

+ 30 - 0
projects/shot/script/product.php

@@ -0,0 +1,30 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 3;
+// 数据对应的行数(1开始)
+$dataLine = 4;
+// 键值对应的列(1开始)
+$keyColumn = 'product_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'product_id'   => 'number',
+    'product_name' => 'string',
+    'price'        => 'number',
+    'origin_price' => 'number',
+    'diamond'      => 'number',
+    'diamond_free' => 'number',
+    'seq'          => 'number',
+    'day_limit'    => 'number',
+    'rookie'       => 'number',
+    'finish_time'  => 'string',
+    'icon'         => 'string',
+];
+
+function product_handle($data)
+{
+    return $data;
+}

BIN
projects/shot/source/doll.xlsx


BIN
projects/shot/source/item.xlsx


BIN
projects/shot/source/mission.xlsx


BIN
projects/shot/source/product.xlsx


+ 66 - 0
projects/tww/output/mission.config.php

@@ -0,0 +1,66 @@
+<?php
+return array (
+  1 =>
+  array (
+    'mission_id' => 1,
+    'mission_type' => 'sign',
+    'name' => '签到',
+    'desc' => '',
+    'target' => 1,
+    'activity' => 10,
+  ),
+  2 =>
+  array (
+    'mission_id' => 2,
+    'mission_type' => 'login',
+    'name' => '每日登陆',
+    'desc' => '',
+    'target' => 1,
+    'activity' => 10,
+  ),
+  3 =>
+  array (
+    'mission_id' => 3,
+    'mission_type' => 'gift',
+    'name' => '赠送碎片',
+    'desc' => '',
+    'target' => 1,
+    'activity' => 15,
+  ),
+  4 =>
+  array (
+    'mission_id' => 4,
+    'mission_type' => 'play',
+    'name' => '游戏一局',
+    'desc' => '',
+    'target' => 1,
+    'activity' => 10,
+  ),
+  5 =>
+  array (
+    'mission_id' => 5,
+    'mission_type' => 'hit',
+    'name' => '获取碎片',
+    'desc' => '',
+    'target' => 2,
+    'activity' => 15,
+  ),
+  6 =>
+  array (
+    'mission_id' => 6,
+    'mission_type' => 'invite_code_share',
+    'name' => '邀请码分享',
+    'desc' => '',
+    'target' => 1,
+    'activity' => 20,
+  ),
+  7 =>
+  array (
+    'mission_id' => 7,
+    'mission_type' => 'invite',
+    'name' => '好友填码',
+    'desc' => '',
+    'target' => 1,
+    'activity' => 20,
+  ),
+);

+ 120 - 0
projects/tww/output/product.config.php

@@ -0,0 +1,120 @@
+<?php
+return array (
+  1001 => 
+  array (
+    'product_id' => 1001,
+    'product_name' => '运费',
+    'product_type' => 'freight',
+    'price' => 5,
+    'origin_price' => 5,
+    'gold' => 0,
+    'gift_gold' => 0,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+  2001 => 
+  array (
+    'product_id' => 2001,
+    'product_name' => '超值周卡',
+    'product_type' => 'week_card',
+    'price' => 28,
+    'origin_price' => 28,
+    'gold' => 280,
+    'gift_gold' => 175,
+    'reward_day' => 7,
+    'reward_amount' => 25,
+    'icon' => '',
+  ),
+  2002 => 
+  array (
+    'product_id' => 2002,
+    'product_name' => '超值月卡',
+    'product_type' => 'month_card',
+    'price' => 100,
+    'origin_price' => 100,
+    'gold' => 1000,
+    'gift_gold' => 900,
+    'reward_day' => 30,
+    'reward_amount' => 30,
+    'icon' => '',
+  ),
+  3001 => 
+  array (
+    'product_id' => 3001,
+    'product_name' => '100金币',
+    'product_type' => 'gold',
+    'price' => 10,
+    'origin_price' => 10,
+    'gold' => 100,
+    'gift_gold' => 0,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+  3002 => 
+  array (
+    'product_id' => 3002,
+    'product_name' => '300金币',
+    'product_type' => 'gold',
+    'price' => 30,
+    'origin_price' => 30,
+    'gold' => 300,
+    'gift_gold' => 20,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+  3003 => 
+  array (
+    'product_id' => 3003,
+    'product_name' => '980金币',
+    'product_type' => 'gold',
+    'price' => 98,
+    'origin_price' => 98,
+    'gold' => 980,
+    'gift_gold' => 100,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+  3004 => 
+  array (
+    'product_id' => 3004,
+    'product_name' => '1980金币',
+    'product_type' => 'gold',
+    'price' => 198,
+    'origin_price' => 198,
+    'gold' => 1980,
+    'gift_gold' => 300,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+  3005 => 
+  array (
+    'product_id' => 3005,
+    'product_name' => '2980金币',
+    'product_type' => 'gold',
+    'price' => 298,
+    'origin_price' => 298,
+    'gold' => 2980,
+    'gift_gold' => 600,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+  3006 => 
+  array (
+    'product_id' => 3006,
+    'product_name' => '6980金币',
+    'product_type' => 'gold',
+    'price' => 698,
+    'origin_price' => 698,
+    'gold' => 6980,
+    'gift_gold' => 1800,
+    'reward_day' => 0,
+    'reward_amount' => 0,
+    'icon' => '',
+  ),
+);

+ 25 - 0
projects/tww/script/mission.php

@@ -0,0 +1,25 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 2;
+// 数据对应的行数(1开始)
+$dataLine = 3;
+// 键值对应的列(1开始)
+$keyColumn = 'mission_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'mission_id'   => 'number',
+    'mission_type' => 'string',
+    'name'         => 'string',
+    'desc'         => 'string',
+    'target'       => 'number',
+    'activity'     => 'number',
+];
+
+function mission_handle($data)
+{
+    return $data;
+}

+ 29 - 0
projects/tww/script/product.php

@@ -0,0 +1,29 @@
+<?php
+
+// 配置
+// 字段名对应的行数(1开始)
+$columnLine = 3;
+// 数据对应的行数(1开始)
+$dataLine = 4;
+// 键值对应的列(1开始)
+$keyColumn = 'product_id';
+// 哪些字段被导出以及导出的格式
+// 只支持string和number两种格式
+// 未设置的字段不被导出
+$columns = [
+    'product_id'    => 'number',
+    'product_name'  => 'string',
+    'product_type'  => 'string',
+    'price'         => 'number',
+    'origin_price'  => 'number',
+    'gold'          => 'number',
+    'gift_gold'     => 'number',
+    'reward_day'     => 'number',
+    'reward_amount' => 'number',
+    'icon'          => 'string',
+];
+
+function product_handle($data)
+{
+    return $data;
+}

BIN
projects/tww/source/mission.xlsx


BIN
projects/tww/source/product.xlsx


+ 10 - 0
test.php

@@ -0,0 +1,10 @@
+<?php
+
+require 'vendor/autoload.php';
+
+$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
+$sheet       = $spreadsheet->getActiveSheet();
+$sheet->setCellValue('A1', 'Hello World !');
+
+$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
+$writer->save('hello world.xlsx');

+ 7 - 0
vendor/autoload.php

@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInit5610f3634223d7b932bf842bbd5d7c39::getLoader();

+ 445 - 0
vendor/composer/ClassLoader.php

@@ -0,0 +1,445 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    http://www.php-fig.org/psr/psr-0/
+ * @see    http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    // PSR-4
+    private $prefixLengthsPsr4 = array();
+    private $prefixDirsPsr4 = array();
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    private $prefixesPsr0 = array();
+    private $fallbackDirsPsr0 = array();
+
+    private $useIncludePath = false;
+    private $classMap = array();
+    private $classMapAuthoritative = false;
+    private $missingClasses = array();
+    private $apcuPrefix;
+
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', $this->prefixesPsr0);
+        }
+
+        return array();
+    }
+
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string       $prefix  The prefix
+     * @param array|string $paths   The PSR-0 root directories
+     * @param bool         $prepend Whether to prepend the directories
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string       $prefix  The prefix/namespace, with trailing '\\'
+     * @param array|string $paths   The PSR-4 base directories
+     * @param bool         $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string       $prefix The prefix
+     * @param array|string $paths  The PSR-0 base directories
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string       $prefix The prefix/namespace, with trailing '\\'
+     * @param array|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return bool|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath.'\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        $length = $this->prefixLengthsPsr4[$first][$search];
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+    include $file;
+}

+ 21 - 0
vendor/composer/LICENSE

@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+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.
+

+ 9 - 0
vendor/composer/autoload_classmap.php

@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);

+ 9 - 0
vendor/composer/autoload_namespaces.php

@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);

+ 11 - 0
vendor/composer/autoload_psr4.php

@@ -0,0 +1,11 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
+    'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'),
+);

+ 52 - 0
vendor/composer/autoload_real.php

@@ -0,0 +1,52 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit5610f3634223d7b932bf842bbd5d7c39
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInit5610f3634223d7b932bf842bbd5d7c39', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInit5610f3634223d7b932bf842bbd5d7c39', 'loadClassLoader'));
+
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+        if ($useStaticLoader) {
+            require_once __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInit5610f3634223d7b932bf842bbd5d7c39::getInitializer($loader));
+        } else {
+            $map = require __DIR__ . '/autoload_namespaces.php';
+            foreach ($map as $namespace => $path) {
+                $loader->set($namespace, $path);
+            }
+
+            $map = require __DIR__ . '/autoload_psr4.php';
+            foreach ($map as $namespace => $path) {
+                $loader->setPsr4($namespace, $path);
+            }
+
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
+
+        $loader->register(true);
+
+        return $loader;
+    }
+}

+ 36 - 0
vendor/composer/autoload_static.php

@@ -0,0 +1,36 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInit5610f3634223d7b932bf842bbd5d7c39
+{
+    public static $prefixLengthsPsr4 = array (
+        'P' => 
+        array (
+            'Psr\\SimpleCache\\' => 16,
+            'PhpOffice\\PhpSpreadsheet\\' => 25,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'Psr\\SimpleCache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/simple-cache/src',
+        ),
+        'PhpOffice\\PhpSpreadsheet\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet',
+        ),
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInit5610f3634223d7b932bf842bbd5d7c39::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit5610f3634223d7b932bf842bbd5d7c39::$prefixDirsPsr4;
+
+        }, null, ClassLoader::class);
+    }
+}

+ 142 - 0
vendor/composer/installed.json

@@ -0,0 +1,142 @@
+[
+    {
+        "name": "psr/simple-cache",
+        "version": "1.0.0",
+        "version_normalized": "1.0.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/simple-cache.git",
+            "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
+            "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2017-01-02T13:31:39+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\SimpleCache\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interfaces for simple caching",
+        "keywords": [
+            "cache",
+            "caching",
+            "psr",
+            "psr-16",
+            "simple-cache"
+        ]
+    },
+    {
+        "name": "phpoffice/phpspreadsheet",
+        "version": "1.1.0",
+        "version_normalized": "1.1.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+            "reference": "a2771e562e3a17c0d512d2009e38fd628beece90"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a2771e562e3a17c0d512d2009e38fd628beece90",
+            "reference": "a2771e562e3a17c0d512d2009e38fd628beece90",
+            "shasum": ""
+        },
+        "require": {
+            "ext-ctype": "*",
+            "ext-dom": "*",
+            "ext-gd": "*",
+            "ext-iconv": "*",
+            "ext-libxml": "*",
+            "ext-mbstring": "*",
+            "ext-simplexml": "*",
+            "ext-xml": "*",
+            "ext-xmlreader": "*",
+            "ext-xmlwriter": "*",
+            "ext-zip": "*",
+            "ext-zlib": "*",
+            "php": "^5.6|^7.0",
+            "psr/simple-cache": "^1.0"
+        },
+        "require-dev": {
+            "dompdf/dompdf": "^0.8.0",
+            "friendsofphp/php-cs-fixer": "@stable",
+            "jpgraph/jpgraph": "^4.0",
+            "mpdf/mpdf": "^7.0.0",
+            "phpunit/phpunit": "^5.7",
+            "squizlabs/php_codesniffer": "^2.7",
+            "tecnickcom/tcpdf": "^6.2"
+        },
+        "suggest": {
+            "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+            "ext-dom": "Option to read and write HTML files",
+            "ext-gd": "Required for exact column width autocalculation",
+            "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+            "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+            "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer"
+        },
+        "time": "2018-01-28T12:37:15+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "LGPL-2.1"
+        ],
+        "authors": [
+            {
+                "name": "Maarten Balliauw",
+                "homepage": "http://blog.maartenballiauw.be"
+            },
+            {
+                "name": "Erik Tilt"
+            },
+            {
+                "name": "Franck Lefevre",
+                "homepage": "http://rootslabs.net"
+            },
+            {
+                "name": "Mark Baker",
+                "homepage": "http://markbakeruk.net"
+            }
+        ],
+        "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+        "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+        "keywords": [
+            "OpenXML",
+            "excel",
+            "gnumeric",
+            "ods",
+            "php",
+            "spreadsheet",
+            "xls",
+            "xlsx"
+        ]
+    }
+]

+ 2 - 0
vendor/phpoffice/phpspreadsheet/.gitattributes

@@ -0,0 +1,2 @@
+/tests export-ignore
+README.md export-ignore

+ 31 - 0
vendor/phpoffice/phpspreadsheet/.github/ISSUE_TEMPLATE.md

@@ -0,0 +1,31 @@
+This is:
+
+```
+- [ ] a bug report
+- [ ] a feature request
+- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
+```
+
+### What is the expected behavior?
+
+
+### What is the current behavior?
+
+
+### What are the steps to reproduce?
+
+Please provide a [Minimal, Complete, and Verifiable example](http://stackoverflow.com/help/mcve) of code that exhibits the issue without relying on an external Excel file or a web server:
+
+```php
+<?php
+
+require __DIR__ . '/vendor/autoload.php';
+
+// Create new Spreadsheet object
+$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
+
+// add code that show the issue here...
+```
+
+
+### Which versions of PhpSpreadsheet and PHP are affected?

+ 16 - 0
vendor/phpoffice/phpspreadsheet/.github/PULL_REQUEST_TEMPLATE.md

@@ -0,0 +1,16 @@
+This is:
+
+```
+- [ ] a bugfix
+- [ ] a new feature
+```
+
+Checklist:
+
+- [ ] Changes are covered by unit tests
+- [ ] Code style is respected
+- [ ] Commit message explains **why** the change is made (see https://github.com/erlang/otp/wiki/Writing-good-commit-messages)
+- [ ] CHANGELOG.md contains a short summary of the change
+- [ ] Documentation is updated as necessary
+
+### Why this change is needed?

+ 22 - 0
vendor/phpoffice/phpspreadsheet/.github/stale.yml

@@ -0,0 +1,22 @@
+# Number of days of inactivity before an issue becomes stale
+daysUntilStale: 60
+# Number of days of inactivity before a stale issue is closed
+daysUntilClose: 7
+# Issues with these labels will never be considered stale
+exemptLabels:
+  - pinned
+  - security
+# Label to use when marking an issue as stale
+staleLabel: stale
+# Comment to post when marking an issue as stale. Set to `false` to disable
+markComment: >
+  This issue has been automatically marked as stale because it has not had
+  recent activity. It will be closed if no further activity occurs.
+
+  If this is still an issue for you, please try to help by debugging it
+  further and sharing your results.
+
+  Thank you for your contributions.
+
+# Comment to post when closing a stale issue. Set to `false` to disable
+closeComment: false

+ 15 - 0
vendor/phpoffice/phpspreadsheet/.github/support.yml

@@ -0,0 +1,15 @@
+# Label used to mark issues as support requests
+supportLabel: question
+# Comment to post on issues marked as support requests. Add a link
+# to a support page, or set to `false` to disable
+supportComment: >
+  This looks like a support question. Please ask your support questions on
+  [StackOverflow](http://stackoverflow.com/questions/tagged/phpspreadsheet),
+  or [Gitter](https://gitter.im/PHPOffice/PhpSpreadsheet).
+
+  Thank you for your contributions.
+
+# Whether to close issues marked as support requests
+close: true
+# Whether to lock issues marked as support requests
+lock: false

+ 11 - 0
vendor/phpoffice/phpspreadsheet/.gitignore

@@ -0,0 +1,11 @@
+/tests/codeCoverage
+/analysis
+/vendor/
+/phpunit.xml
+/.php_cs.cache
+
+## IDE support
+*.buildpath
+*.project
+/.settings
+/.idea

+ 181 - 0
vendor/phpoffice/phpspreadsheet/.php_cs.dist

@@ -0,0 +1,181 @@
+<?php
+
+$finder = PhpCsFixer\Finder::create()
+    ->exclude('vendor')
+    ->in('samples')
+    ->in('src')
+    ->in('tests');
+
+return PhpCsFixer\Config::create()
+    ->setRiskyAllowed(true)
+    ->setFinder($finder)
+    ->setRules([
+        'align_multiline_comment' => true,
+        'array_syntax' => ['syntax' => 'short'],
+        'backtick_to_shell_exec' => true,
+        'binary_operator_spaces' => true,
+        'blank_line_after_namespace' => true,
+        'blank_line_after_opening_tag' => true,
+        'blank_line_before_statement' => true,
+        'braces' => true,
+        'cast_spaces' => true,
+        'class_attributes_separation' => ['elements' => ['method', 'property']], // const are often grouped with other related const
+        'class_definition' => true,
+        'class_keyword_remove' => false, // ::class keyword gives us beter support in IDE
+        'combine_consecutive_issets' => true,
+        'combine_consecutive_unsets' => true,
+        'compact_nullable_typehint' => true,
+        'concat_space' => ['spacing' => 'one'],
+        'declare_equal_normalize' => true,
+        'declare_strict_types' => false, // Too early to adopt strict types
+        'dir_constant' => true,
+        'doctrine_annotation_array_assignment' => true,
+        'doctrine_annotation_braces' => true,
+        'doctrine_annotation_indentation' => true,
+        'doctrine_annotation_spaces' => true,
+        'elseif' => true,
+        'encoding' => true,
+        'ereg_to_preg' => true,
+        'escape_implicit_backslashes' => true,
+        'explicit_indirect_variable' => false, // I feel it makes the code actually harder to read
+        'explicit_string_variable' => false, // I feel it makes the code actually harder to read
+        'final_internal_class' => true,
+        'full_opening_tag' => true,
+        'function_declaration' => true,
+        'function_to_constant' => true,
+        'function_typehint_space' => true,
+        'general_phpdoc_annotation_remove' => false, // No use for that
+        'hash_to_slash_comment' => true,
+        'header_comment' => false, // We don't use common header in all our files
+        'heredoc_to_nowdoc' => false, // Not sure about this one
+        'include' => true,
+        'increment_style' => true,
+        'indentation_type' => true,
+        'is_null' => ['use_yoda_style' => false],
+        'linebreak_after_opening_tag' => true,
+        'line_ending' => true,
+        'list_syntax' => ['syntax' => 'long'], // Stay compatiblew with PHP 5.6
+        'lowercase_cast' => true,
+        'lowercase_constants' => true,
+        'lowercase_keywords' => true,
+        'magic_constant_casing' => true,
+        'mb_str_functions' => false, // No, too dangerous to change that
+        'method_argument_space' => true,
+        'method_chaining_indentation' => true,
+        'method_separation' => true,
+        'modernize_types_casting' => true,
+        'multiline_comment_opening_closing' => true,
+        'native_function_casing' => true,
+        'native_function_invocation' => false, // This is risky and seems to be micro-optimization that make code uglier so not worth it, at least for now
+        'new_with_braces' => true,
+        'no_alias_functions' => true,
+        'no_blank_lines_after_class_opening' => true,
+        'no_blank_lines_after_phpdoc' => true,
+        'no_blank_lines_before_namespace' => false, // we want 1 blank line before namespace
+        'no_break_comment' => true,
+        'no_closing_tag' => true,
+        'no_empty_comment' => true,
+        'no_empty_phpdoc' => true,
+        'no_empty_statement' => true,
+        'no_extra_blank_lines' => true,
+        'no_homoglyph_names' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_mixed_echo_print' => true,
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_multiline_whitespace_before_semicolons' => true,
+        'non_printable_character' => true,
+        'no_null_property_initialization' => true,
+        'no_php4_constructor' => true,
+        'normalize_index_brace' => true,
+        'no_short_bool_cast' => true,
+        'no_short_echo_tag' => true,
+        'no_singleline_whitespace_before_semicolons' => true,
+        'no_spaces_after_function_name' => true,
+        'no_spaces_around_offset' => true,
+        'no_spaces_inside_parenthesis' => true,
+        'no_superfluous_elseif' => false, // Might be risky on a huge code base
+        'not_operator_with_space' => false, // No we prefer to keep '!' without spaces
+        'not_operator_with_successor_space' => false, // idem
+        'no_trailing_comma_in_list_call' => true,
+        'no_trailing_comma_in_singleline_array' => true,
+        'no_trailing_whitespace_in_comment' => true,
+        'no_trailing_whitespace' => true,
+        'no_unneeded_control_parentheses' => true,
+        'no_unneeded_curly_braces' => true,
+        'no_unneeded_final_method' => true,
+        'no_unreachable_default_argument_value' => true,
+        'no_unused_imports' => true,
+        'no_useless_else' => true,
+        'no_useless_return' => true,
+        'no_whitespace_before_comma_in_array' => true,
+        'no_whitespace_in_blank_line' => true,
+        'object_operator_without_whitespace' => true,
+        'ordered_class_elements' => false, // We prefer to keep some freedom
+        'ordered_imports' => true,
+        'phpdoc_add_missing_param_annotation' => true,
+        'phpdoc_align' => false, // Waste of time
+        'phpdoc_annotation_without_dot' => true,
+        'phpdoc_indent' => true,
+        'phpdoc_inline_tag' => true,
+        'phpdoc_no_access' => true,
+        'phpdoc_no_alias_tag' => true,
+        'phpdoc_no_empty_return' => true,
+        'phpdoc_no_package' => true,
+        'phpdoc_no_useless_inheritdoc' => true,
+        'phpdoc_order' => true,
+        'phpdoc_return_self_reference' => true,
+        'phpdoc_scalar' => true,
+        'phpdoc_separation' => true,
+        'phpdoc_single_line_var_spacing' => true,
+        'phpdoc_summary' => true,
+        'phpdoc_to_comment' => true,
+        'phpdoc_trim' => true,
+        'phpdoc_types_order' => true,
+        'phpdoc_types' => true,
+        'phpdoc_var_without_name' => true,
+        'php_unit_construct' => true,
+        'php_unit_dedicate_assert' => true,
+        'php_unit_expectation' => true,
+        'php_unit_fqcn_annotation' => true,
+        'php_unit_mock' => true,
+        'php_unit_namespaced' => true,
+        'php_unit_no_expectation_annotation' => true,
+        'php_unit_strict' => false, // We sometime actually need assertEquals
+        'php_unit_test_annotation' => true,
+        'php_unit_test_class_requires_covers' => false, // We don't care as much as we should about coverage
+        'pow_to_exponentiation' => false,
+        'protected_to_private' => true,
+        'psr0' => true,
+        'psr4' => true,
+        'random_api_migration' => false, // This breaks our unit tests
+        'return_type_declaration' => true,
+        'self_accessor' => true,
+        'semicolon_after_instruction' => false, // Buggy in `samples/index.php`
+        'short_scalar_cast' => true,
+        'silenced_deprecation_error' => true,
+        'simplified_null_return' => false, // While technically correct we prefer to be explicit when returning null
+        'single_blank_line_at_eof' => true,
+        'single_blank_line_before_namespace' => true,
+        'single_class_element_per_statement' => true,
+        'single_import_per_statement' => true,
+        'single_line_after_imports' => true,
+        'single_line_comment_style' => true,
+        'single_quote' => true,
+        'space_after_semicolon' => true,
+        'standardize_not_equals' => true,
+        'static_lambda' => false, // Risky if we can't guarantee nobody use `bindTo()`
+        'strict_comparison' => false, // No, too dangerous to change that
+        'strict_param' => false, // No, too dangerous to change that
+        'switch_case_semicolon_to_colon' => true,
+        'switch_case_space' => true,
+        'ternary_operator_spaces' => true,
+        'ternary_to_null_coalescing' => false, // Cannot use that with PHP 5.6
+        'trailing_comma_in_multiline_array' => true,
+        'trim_array_spaces' => true,
+        'unary_operator_spaces' => true,
+        'visibility_required' => true,
+        'void_return' => false, // Cannot use that with PHP 5.6
+        'whitespace_after_comma_in_array' => true,
+        'yoda_style' => false,
+    ]);

+ 27 - 0
vendor/phpoffice/phpspreadsheet/.scrutinizer.yml

@@ -0,0 +1,27 @@
+checks:
+    php: true
+
+coding_style:
+    php:
+        spaces:
+            before_parentheses:
+                closure_definition: true
+            around_operators:
+                concatenation: true
+
+build:
+    nodes:
+        analysis:
+            tests:
+                override:
+                    - php-scrutinizer-run
+
+tools:
+    external_code_coverage:
+        timeout: 3600
+
+build_failure_conditions:
+    - 'elements.rating(<= C).new.exists'                        # No new classes/methods with a rating of C or worse allowed
+    - 'issues.severity(>= MAJOR).new.exists'                    # New issues of major or higher severity
+    - 'project.metric_change("scrutinizer.test_coverage", < 0)' # Code Coverage decreased from previous inspection
+    - 'patches.label("Unused Use Statements").new.exists'       # No new unused imports patches allowed

+ 40 - 0
vendor/phpoffice/phpspreadsheet/.travis.yml

@@ -0,0 +1,40 @@
+language: php
+dist: trusty
+sudo: false
+
+php:
+  - 5.6
+  - 7.0
+  - 7.1
+  - 7.2
+
+cache:
+  directories:
+    - vendor
+    - $HOME/.composer/cache
+
+before_script:
+  # Deactivate xdebug
+  - if [ -z "$KEEP_XDEBUG" ]; then rm -rfv /home/travis/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ; fi
+  - composer install --ignore-platform-reqs
+
+script:
+  - ./vendor/bin/phpunit
+
+jobs:
+  include:
+
+    - stage: Code style
+      php: 7.1
+      script:
+        - ./vendor/bin/php-cs-fixer fix --diff --verbose --dry-run
+        - ./vendor/bin/phpcs --report-width=200 --report-summary  --report-full samples/ src/ tests/ --ignore=samples/Header.php --standard=PSR2 -n
+
+    - stage: Coverage
+      php: 7.1
+      env: KEEP_XDEBUG=1
+      script:
+        - ./vendor/bin/phpunit --debug --coverage-clover coverage-clover.xml
+      after_script:
+        - wget https://scrutinizer-ci.com/ocular.phar
+        - php ocular.phar code-coverage:upload --format=php-clover tests/coverage-clover.xml

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1593 - 0
vendor/phpoffice/phpspreadsheet/CHANGELOG.PHPExcel.md


+ 124 - 0
vendor/phpoffice/phpspreadsheet/CHANGELOG.md

@@ -0,0 +1,124 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## [1.1.0] - 2018-01-28
+
+### Added
+
+- Support for PHP 7.2
+- Support cell comments in HTML writer and reader - [#308](https://github.com/PHPOffice/PhpSpreadsheet/issues/308)
+- Option to stop at a conditional styling, if it matches (only XLSX format) - [#292](https://github.com/PHPOffice/PhpSpreadsheet/pull/292)
+- Support for line width for data series when rendering Xlsx - [#329](https://github.com/PHPOffice/PhpSpreadsheet/pull/329)
+
+### Fixed
+
+- Better auto-detection of CSV separators - [#305](https://github.com/PHPOffice/PhpSpreadsheet/issues/305)
+- Support for shape style ending with `;` - [#304](https://github.com/PHPOffice/PhpSpreadsheet/issues/304)
+- Freeze Panes takes wrong coordinates for XLSX - [#322](https://github.com/PHPOffice/PhpSpreadsheet/issues/322)
+- `COLUMNS` and `ROWS` functions crashed in some cases - [#336](https://github.com/PHPOffice/PhpSpreadsheet/issues/336)
+- Support XML file without styles - [#331](https://github.com/PHPOffice/PhpSpreadsheet/pull/331)
+- Cell coordinates which are already a range cause an exception [#319](https://github.com/PHPOffice/PhpSpreadsheet/issues/319)
+
+## [1.0.0] - 2017-12-25
+
+### Added
+
+- Support to write merged cells in ODS format - [#287](https://github.com/PHPOffice/PhpSpreadsheet/issues/287)
+- Able to set the `topLeftCell` in freeze panes - [#261](https://github.com/PHPOffice/PhpSpreadsheet/pull/261)
+- Support `DateTimeImmutable` as cell value
+- Support migration of prefixed classes
+
+### Fixed
+
+- Can read very small HTML files - [#194](https://github.com/PHPOffice/PhpSpreadsheet/issues/194)
+- Written DataValidation was corrupted - [#290](https://github.com/PHPOffice/PhpSpreadsheet/issues/290)
+- Date format compatible with both LibreOffice and Excel - [#298](https://github.com/PHPOffice/PhpSpreadsheet/issues/298)
+
+### BREAKING CHANGE
+
+- Constant `TYPE_DOUGHTNUTCHART` is now `TYPE_DOUGHNUTCHART`.
+
+## [1.0.0-beta2] - 2017-11-26
+
+### Added
+
+- Support for chart fill color - @CrazyBite [#158](https://github.com/PHPOffice/PhpSpreadsheet/pull/158)
+- Support for read Hyperlink for xml - @GreatHumorist [#223](https://github.com/PHPOffice/PhpSpreadsheet/pull/223)
+- Support for cell value validation according to data validation rules - @SailorMax [#257](https://github.com/PHPOffice/PhpSpreadsheet/pull/257)
+- Support for custom implementation, or configuration, of PDF libraries - @SailorMax [#266](https://github.com/PHPOffice/PhpSpreadsheet/pull/266)
+
+### Changed
+
+- Merge data-validations to reduce written worksheet size - @billblume [#131](https://github.com/PHPOffice/PhpSpreadSheet/issues/131)
+- Throws exception if a XML file is invalid - @GreatHumorist [#222](https://github.com/PHPOffice/PhpSpreadsheet/pull/222)
+- Upgrade to mPDF 7.0+ - [#144](https://github.com/PHPOffice/PhpSpreadsheet/issues/144)
+
+### Fixed
+
+- Control characters in cell values are automatically escaped - [#212](https://github.com/PHPOffice/PhpSpreadsheet/issues/212)
+- Prevent color changing when copy/pasting xls files written by PhpSpreadsheet to another file - @al-lala [#218](https://github.com/PHPOffice/PhpSpreadsheet/issues/218)
+- Add cell reference automatic when there is no cell reference('r' attribute) in Xlsx file. - @GreatHumorist [#225](https://github.com/PHPOffice/PhpSpreadsheet/pull/225) Refer to [issue#201](https://github.com/PHPOffice/PhpSpreadsheet/issues/201)
+- `Reader\Xlsx::getFromZipArchive()` function return false if the zip entry could not be located. - @anton-harvey [#268](https://github.com/PHPOffice/PhpSpreadsheet/pull/268)
+
+### BREAKING CHANGE
+
+- Extracted coordinate method to dedicate class [migration guide](./docs/topics/migration-from-PHPExcel.md).
+- Column indexes are based on 1, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
+- Standardization of array keys used for style, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
+- Easier usage of PDF writers, and other custom readers and writers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
+- Easier usage of chart renderers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
+- Rename a few more classes to keep them in their related namespaces:
+    - `CalcEngine` => `Calculation\Engine`
+    - `PhpSpreadsheet\Calculation` => `PhpSpreadsheet\Calculation\Calculation`
+    - `PhpSpreadsheet\Cell` => `PhpSpreadsheet\Cell\Cell`
+    - `PhpSpreadsheet\Chart` => `PhpSpreadsheet\Chart\Chart`
+    - `PhpSpreadsheet\RichText` => `PhpSpreadsheet\RichText\RichText`
+    - `PhpSpreadsheet\Style` => `PhpSpreadsheet\Style\Style`
+    - `PhpSpreadsheet\Worksheet` => `PhpSpreadsheet\Worksheet\Worksheet`
+
+## [1.0.0-beta] - 2017-08-17
+
+### Added
+
+- Initial implementation of SUMIFS() function
+- Additional codepages
+- MemoryDrawing not working in HTML writer [#808](https://github.com/PHPOffice/PHPExcel/issues/808)
+- CSV Reader can auto-detect the separator used in file [#141](https://github.com/PHPOffice/PhpSpreadsheet/pull/141)
+- HTML Reader supports some basic inline styles [#180](https://github.com/PHPOffice/PhpSpreadsheet/pull/180)
+
+### Changed
+
+- Start following [SemVer](http://semver.org) properly.
+
+### Fixed
+
+- Fix to getCell() method when cell reference includes a worksheet reference - @MarkBaker
+- Ignore inlineStr type if formula element exists - @ncrypthic [#570](https://github.com/PHPOffice/PHPExcel/issues/570)
+- Excel 2007 Reader freezes because of conditional formatting - @rentalhost [#575](https://github.com/PHPOffice/PHPExcel/issues/575)
+- Readers will now parse files containing worksheet titles over 31 characters [#176](https://github.com/PHPOffice/PhpSpreadsheet/pull/176)
+
+### General
+
+- Whitespace after toRichTextObject() - @MarkBaker [#554](https://github.com/PHPOffice/PHPExcel/issues/554)
+- Optimize vlookup() sort - @umpirsky [#548](https://github.com/PHPOffice/PHPExcel/issues/548)
+- c:max and c:min elements shall NOT be inside c:orientation elements - @vitalyrepin [#869](https://github.com/PHPOffice/PHPExcel/pull/869)
+- Implement actual timezone adjustment into PHPExcel_Shared_Date::PHPToExcel - @sim642 [#489](https://github.com/PHPOffice/PHPExcel/pull/489)
+
+### BREAKING CHANGE
+
+- Introduction of namespaces for all classes, eg: `PHPExcel_Calculation_Functions` becomes `PhpOffice\PhpSpreadsheet\Calculation\Functions`
+- Some classes were renamed for clarity and/or consistency:
+
+For a comprehensive list of all class changes, and a semi-automated migration path, read the [migration guide](./docs/topics/migration-from-PHPExcel.md).
+
+- Dropped `PHPExcel_Calculation_Functions::VERSION()`. Composer or git should be used to know the version.
+- Dropped `PHPExcel_Settings::setPdfRenderer()` and `PHPExcel_Settings::setPdfRenderer()`. Composer should be used to autoload PDF libs.
+- Dropped support for HHVM
+
+## Previous versions of PHPExcel
+
+The changelog for the project when it was called PHPExcel is [still available](./CHANGELOG.PHPExcel.md).

+ 11 - 0
vendor/phpoffice/phpspreadsheet/CONTRIBUTING.md

@@ -0,0 +1,11 @@
+# Want to contribute?
+
+If you would like to contribute, here are some notes and guidelines:
+
+ - All new development happens on feature/fix branches referenced with the GitHub issue number, and are then merged to the develop branch; so the develop branch is always the most up-to-date, working code
+ - The master branch only contains tagged releases
+ - If you are going to be submitting a pull request, please fork from develop, and submit your pull request back as a fix/feature branch referencing the GitHub issue number
+ - Code style might be automatically fixed by `composer fix`
+ - All code changes must be validated by `composer check`
+ - [Helpful article about forking](https://help.github.com/articles/fork-a-repo/ "Forking a GitHub repository")
+ - [Helpful article about pull requests](https://help.github.com/articles/using-pull-requests/ "Pull Requests")

+ 345 - 0
vendor/phpoffice/phpspreadsheet/LICENSE

@@ -0,0 +1,345 @@
+GNU LESSER GENERAL PUBLIC LICENSE
+
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+END OF TERMS AND CONDITIONS

+ 8 - 0
vendor/phpoffice/phpspreadsheet/bin/migrate-from-phpexcel

@@ -0,0 +1,8 @@
+#!/usr/bin/env php
+<?php
+use PhpOffice\PhpSpreadsheet\Helper\Migrator;
+
+require_once __DIR__ . '/../src/Bootstrap.php';
+
+$migrator = new Migrator();
+$migrator->migrate();

+ 33 - 0
vendor/phpoffice/phpspreadsheet/bin/pre-commit

@@ -0,0 +1,33 @@
+#!/bin/bash
+
+pass=true
+
+files=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.(php|phtml)$')
+if [ "$files" != "" ]; then
+
+    # Run php syntax check before commit
+    while read -r file; do
+        php -l "$file"
+        if [ $? -ne 0 ]; then
+            pass=false
+        fi
+    done <<< "$files"
+
+    # Run php-cs-fixer validation before commit
+    echo "$files" | xargs ./vendor/bin/php-cs-fixer fix --diff --config .php_cs.dist
+    if [ $? -ne 0 ]; then
+        pass=false
+    fi
+
+    # Automatically add files that may have been fixed by php-cs-fixer
+    echo "$files" | xargs git add
+fi
+
+if $pass; then
+    exit 0
+else
+    echo ""
+    echo "PRE-COMMIT HOOK FAILED:"
+    echo "Code style validation failed. Please fix errors and try committing again."
+    exit 1
+fi

+ 78 - 0
vendor/phpoffice/phpspreadsheet/composer.json

@@ -0,0 +1,78 @@
+{
+    "name": "phpoffice/phpspreadsheet",
+    "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+    "keywords": ["PHP", "OpenXML", "Excel", "xlsx", "xls", "ods", "gnumeric", "spreadsheet"],
+    "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+    "type": "library",
+    "license": "LGPL-2.1",
+    "authors": [
+        {
+            "name": "Maarten Balliauw",
+            "homepage": "http://blog.maartenballiauw.be"
+        },
+        {
+            "name": "Mark Baker",
+            "homepage": "http://markbakeruk.net"
+        },
+        {
+            "name": "Franck Lefevre",
+            "homepage": "http://rootslabs.net"
+        },
+        {
+            "name": "Erik Tilt"
+        }
+    ],
+    "scripts": {
+        "check": [
+            "php-cs-fixer fix --ansi --dry-run --diff",
+            "phpcs --report-width=200 --report-summary  --report-full samples/ src/ tests/ --ignore=samples/Header.php --standard=PSR2 -n",
+            "phpunit --color=always"
+        ],
+        "fix": [
+            "php-cs-fixer fix --ansi"
+        ]
+    },
+    "require": {
+        "php": "^5.6|^7.0",
+        "ext-ctype": "*",
+        "ext-dom": "*",
+        "ext-gd": "*",
+        "ext-iconv": "*",
+        "ext-libxml": "*",
+        "ext-mbstring": "*",
+        "ext-SimpleXML": "*",
+        "ext-xml": "*",
+        "ext-xmlreader": "*",
+        "ext-xmlwriter": "*",
+        "ext-zip": "*",
+        "ext-zlib": "*",
+        "psr/simple-cache": "^1.0"
+    },
+    "require-dev": {
+        "tecnickcom/tcpdf": "^6.2",
+        "squizlabs/php_codesniffer": "^2.7",
+        "phpunit/phpunit": "^5.7",
+        "dompdf/dompdf": "^0.8.0",
+        "mpdf/mpdf": "^7.0.0",
+        "jpgraph/jpgraph": "^4.0",
+        "friendsofphp/php-cs-fixer": "@stable"
+    },
+    "suggest": {
+        "ext-gd": "Required for exact column width autocalculation",
+        "ext-dom": "Option to read and write HTML files",
+        "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+        "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+        "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer",
+        "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers"
+    },
+    "autoload": {
+        "psr-4": {
+            "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "PhpOffice\\PhpSpreadsheetTests\\": "tests/PhpSpreadsheetTests"
+        }
+    }
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 3103 - 0
vendor/phpoffice/phpspreadsheet/composer.lock


+ 51 - 0
vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/Architecture.cd

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Font Name="Tahoma" Size="8.25" />
+  <Class Name="ClassDiagrams.PHPExcel" Collapsed="true">
+    <Position X="3.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Classes\PHPExcel.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+    <ShowAsAssociation>
+      <Property Name="Worksheets" />
+    </ShowAsAssociation>
+  </Class>
+  <Class Name="ClassDiagrams.Worksheet" Collapsed="true">
+    <Position X="0.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <FileName>Classes\Worksheet.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+  </Class>
+  <Interface Name="ClassDiagrams.PHPExcel_Reader_IReader" Collapsed="true">
+    <Position X="2.25" Y="2.5" Width="2" />
+    <TypeIdentifier>
+      <FileName>Classes\IReader.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+    <ShowAsAssociation>
+      <Property Name="reads" />
+    </ShowAsAssociation>
+    <AssociationLine Name="reads" Type="ClassDiagrams.PHPExcel">
+      <MemberNameLabel ManuallyPlaced="true" ManuallySized="true">
+        <Position X="0.152" Y="1.279" Height="0.16" Width="0.597" />
+      </MemberNameLabel>
+    </AssociationLine>
+  </Interface>
+  <Interface Name="ClassDiagrams.PHPExcel_Writer_IWriter" Collapsed="true">
+    <Position X="4.5" Y="2.5" Width="2" />
+    <TypeIdentifier>
+      <FileName>Classes\IWriter.cs</FileName>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAA=</HashCode>
+    </TypeIdentifier>
+    <ShowAsAssociation>
+      <Property Name="writes" />
+    </ShowAsAssociation>
+    <AssociationLine Name="writes" Type="ClassDiagrams.PHPExcel">
+      <MemberNameLabel ManuallyPlaced="true" ManuallySized="true">
+        <Position X="-1.002" Y="1.298" Height="0.16" Width="0.764" />
+      </MemberNameLabel>
+    </AssociationLine>
+  </Interface>
+</ClassDiagram>

BIN
vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/Architecture.png


+ 64 - 0
vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/ClassDiagrams.csproj

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{CC8CD7D2-8EFF-48E5-A17A-C1C482744D31}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ClassDiagrams</RootNamespace>
+    <AssemblyName>ClassDiagrams</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ItemGroup>
+    <None Include="Architecture.cd" />
+    <None Include="ReaderWriter.cd" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Classes\IReader.cs" />
+    <Compile Include="Classes\IWriter.cs" />
+    <Compile Include="Classes\PHPExcel_IOFactory.cs" />
+    <Compile Include="Classes\Worksheet.cs" />
+    <Compile Include="Classes\PHPExcel.cs" />
+    <Compile Include="Classes\PHPExcel_Reader_Excel2007.cs" />
+    <Compile Include="Classes\PHPExcel_Reader_Serialized.cs" />
+    <Compile Include="Classes\PHPExcel_Writer_Excel2007.cs" />
+    <Compile Include="Classes\PHPExcel_Writer_Serialized.cs" />
+    <Compile Include="Classes\PHPExcel_Reader_Excel5.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Exports\Architecture.png" />
+    <Content Include="Exports\ReaderWriter.png" />
+  </ItemGroup>
+</Project>

+ 5 - 0
vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/ClassDiagrams.csproj.user

@@ -0,0 +1,5 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ShowAllFiles</ProjectView>
+  </PropertyGroup>
+</Project>

+ 0 - 0
vendor/phpoffice/phpspreadsheet/docs/assets/ClassDiagrams/ClassDiagrams.sln


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است