source: sourcecode/application/libraries/PHPExcel/IOFactory.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 7.8 KB
Line 
1<?php
2/**
3 * PHPExcel
4 *
5 * Copyright (c) 2006 - 2014 PHPExcel
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20 *
21 * @category   PHPExcel
22 * @package    PHPExcel
23 * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
25 * @version    1.8.0, 2014-03-02
26 */
27
28
29/**     PHPExcel root directory */
30if (!defined('PHPEXCEL_ROOT')) {
31        /**
32         * @ignore
33         */
34        define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../');
35        require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
36}
37
38/**
39 * PHPExcel_IOFactory
40 *
41 * @category   PHPExcel
42 * @package    PHPExcel
43 * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
44 */
45class PHPExcel_IOFactory
46{
47        /**
48         * Search locations
49         *
50         * @var array
51         * @access      private
52         * @static
53         */
54        private static $_searchLocations = array(
55                array( 'type' => 'IWriter', 'path' => 'PHPExcel/Writer/{0}.php', 'class' => 'PHPExcel_Writer_{0}' ),
56                array( 'type' => 'IReader', 'path' => 'PHPExcel/Reader/{0}.php', 'class' => 'PHPExcel_Reader_{0}' )
57        );
58
59        /**
60         * Autoresolve classes
61         *
62         * @var array
63         * @access      private
64         * @static
65         */
66        private static $_autoResolveClasses = array(
67                'Excel2007',
68                'Excel5',
69                'Excel2003XML',
70                'OOCalc',
71                'SYLK',
72                'Gnumeric',
73                'HTML',
74                'CSV',
75        );
76
77    /**
78     *  Private constructor for PHPExcel_IOFactory
79     */
80    private function __construct() { }
81
82    /**
83     * Get search locations
84     *
85         * @static
86         * @access      public
87     * @return  array
88     */
89        public static function getSearchLocations() {
90                return self::$_searchLocations;
91        }       //      function getSearchLocations()
92
93        /**
94         * Set search locations
95         *
96         * @static
97         * @access      public
98         * @param       array $value
99         * @throws      PHPExcel_Reader_Exception
100         */
101        public static function setSearchLocations($value) {
102                if (is_array($value)) {
103                        self::$_searchLocations = $value;
104                } else {
105                        throw new PHPExcel_Reader_Exception('Invalid parameter passed.');
106                }
107        }       //      function setSearchLocations()
108
109        /**
110         * Add search location
111         *
112         * @static
113         * @access      public
114         * @param       string $type            Example: IWriter
115         * @param       string $location        Example: PHPExcel/Writer/{0}.php
116         * @param       string $classname       Example: PHPExcel_Writer_{0}
117         */
118        public static function addSearchLocation($type = '', $location = '', $classname = '') {
119                self::$_searchLocations[] = array( 'type' => $type, 'path' => $location, 'class' => $classname );
120        }       //      function addSearchLocation()
121
122        /**
123         * Create PHPExcel_Writer_IWriter
124         *
125         * @static
126         * @access      public
127         * @param       PHPExcel $phpExcel
128         * @param       string  $writerType     Example: Excel2007
129         * @return      PHPExcel_Writer_IWriter
130         * @throws      PHPExcel_Reader_Exception
131         */
132        public static function createWriter(PHPExcel $phpExcel, $writerType = '') {
133                // Search type
134                $searchType = 'IWriter';
135
136                // Include class
137                foreach (self::$_searchLocations as $searchLocation) {
138                        if ($searchLocation['type'] == $searchType) {
139                                $className = str_replace('{0}', $writerType, $searchLocation['class']);
140
141                                $instance = new $className($phpExcel);
142                                if ($instance !== NULL) {
143                                        return $instance;
144                                }
145                        }
146                }
147
148                // Nothing found...
149                throw new PHPExcel_Reader_Exception("No $searchType found for type $writerType");
150        }       //      function createWriter()
151
152        /**
153         * Create PHPExcel_Reader_IReader
154         *
155         * @static
156         * @access      public
157         * @param       string $readerType      Example: Excel2007
158         * @return      PHPExcel_Reader_IReader
159         * @throws      PHPExcel_Reader_Exception
160         */
161        public static function createReader($readerType = '') {
162                // Search type
163                $searchType = 'IReader';
164
165                // Include class
166                foreach (self::$_searchLocations as $searchLocation) {
167                        if ($searchLocation['type'] == $searchType) {
168                                $className = str_replace('{0}', $readerType, $searchLocation['class']);
169
170                                $instance = new $className();
171                                if ($instance !== NULL) {
172                                        return $instance;
173                                }
174                        }
175                }
176
177                // Nothing found...
178                throw new PHPExcel_Reader_Exception("No $searchType found for type $readerType");
179        }       //      function createReader()
180
181        /**
182         * Loads PHPExcel from file using automatic PHPExcel_Reader_IReader resolution
183         *
184         * @static
185         * @access public
186         * @param       string          $pFilename              The name of the spreadsheet file
187         * @return      PHPExcel
188         * @throws      PHPExcel_Reader_Exception
189         */
190        public static function load($pFilename) {
191                $reader = self::createReaderForFile($pFilename);
192                return $reader->load($pFilename);
193        }       //      function load()
194
195        /**
196         * Identify file type using automatic PHPExcel_Reader_IReader resolution
197         *
198         * @static
199         * @access public
200         * @param       string          $pFilename              The name of the spreadsheet file to identify
201         * @return      string
202         * @throws      PHPExcel_Reader_Exception
203         */
204        public static function identify($pFilename) {
205                $reader = self::createReaderForFile($pFilename);
206                $className = get_class($reader);
207                $classType = explode('_',$className);
208                unset($reader);
209                return array_pop($classType);
210        }       //      function identify()
211
212        /**
213         * Create PHPExcel_Reader_IReader for file using automatic PHPExcel_Reader_IReader resolution
214         *
215         * @static
216         * @access      public
217         * @param       string          $pFilename              The name of the spreadsheet file
218         * @return      PHPExcel_Reader_IReader
219         * @throws      PHPExcel_Reader_Exception
220         */
221        public static function createReaderForFile($pFilename) {
222
223                // First, lucky guess by inspecting file extension
224                $pathinfo = pathinfo($pFilename);
225
226                $extensionType = NULL;
227                if (isset($pathinfo['extension'])) {
228                        switch (strtolower($pathinfo['extension'])) {
229                                case 'xlsx':                    //      Excel (OfficeOpenXML) Spreadsheet
230                                case 'xlsm':                    //      Excel (OfficeOpenXML) Macro Spreadsheet (macros will be discarded)
231                                case 'xltx':                    //      Excel (OfficeOpenXML) Template
232                                case 'xltm':                    //      Excel (OfficeOpenXML) Macro Template (macros will be discarded)
233                                        $extensionType = 'Excel2007';
234                                        break;
235                                case 'xls':                             //      Excel (BIFF) Spreadsheet
236                                case 'xlt':                             //      Excel (BIFF) Template
237                                        $extensionType = 'Excel5';
238                                        break;
239                                case 'ods':                             //      Open/Libre Offic Calc
240                                case 'ots':                             //      Open/Libre Offic Calc Template
241                                        $extensionType = 'OOCalc';
242                                        break;
243                                case 'slk':
244                                        $extensionType = 'SYLK';
245                                        break;
246                                case 'xml':                             //      Excel 2003 SpreadSheetML
247                                        $extensionType = 'Excel2003XML';
248                                        break;
249                                case 'gnumeric':
250                                        $extensionType = 'Gnumeric';
251                                        break;
252                                case 'htm':
253                                case 'html':
254                                        $extensionType = 'HTML';
255                                        break;
256                                case 'csv':
257                                        // Do nothing
258                                        // We must not try to use CSV reader since it loads
259                                        // all files including Excel files etc.
260                                        break;
261                                default:
262                                        break;
263                        }
264
265                        if ($extensionType !== NULL) {
266                                $reader = self::createReader($extensionType);
267                                // Let's see if we are lucky
268                                if (isset($reader) && $reader->canRead($pFilename)) {
269                                        return $reader;
270                                }
271                        }
272                }
273
274                // If we reach here then "lucky guess" didn't give any result
275                // Try walking through all the options in self::$_autoResolveClasses
276                foreach (self::$_autoResolveClasses as $autoResolveClass) {
277                        //      Ignore our original guess, we know that won't work
278                        if ($autoResolveClass !== $extensionType) {
279                                $reader = self::createReader($autoResolveClass);
280                                if ($reader->canRead($pFilename)) {
281                                        return $reader;
282                                }
283                        }
284                }
285
286                throw new PHPExcel_Reader_Exception('Unable to identify a reader for this file');
287        }       //      function createReaderForFile()
288}
Note: See TracBrowser for help on using the repository browser.