forked from SimplesIP/pabx-app
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
11 KiB
406 lines
11 KiB
<?php |
|
|
|
/** PHPExcel root directory */ |
|
if (!defined('PHPEXCEL_ROOT')) { |
|
/** |
|
* @ignore |
|
*/ |
|
define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); |
|
require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); |
|
} |
|
|
|
/** |
|
* PHPExcel_Reader_CSV |
|
* |
|
* Copyright (c) 2006 - 2015 PHPExcel |
|
* |
|
* This library is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation; either |
|
* version 2.1 of the License, or (at your option) any later version. |
|
* |
|
* This library is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* Lesser General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public |
|
* License along with this library; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
* |
|
* @category PHPExcel |
|
* @package PHPExcel_Reader |
|
* @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) |
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|
* @version ##VERSION##, ##DATE## |
|
*/ |
|
class PHPExcel_Reader_CSV extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader |
|
{ |
|
/** |
|
* Input encoding |
|
* |
|
* @access private |
|
* @var string |
|
*/ |
|
private $inputEncoding = 'UTF-8'; |
|
|
|
/** |
|
* Delimiter |
|
* |
|
* @access private |
|
* @var string |
|
*/ |
|
private $delimiter = ','; |
|
|
|
/** |
|
* Enclosure |
|
* |
|
* @access private |
|
* @var string |
|
*/ |
|
private $enclosure = '"'; |
|
|
|
/** |
|
* Sheet index to read |
|
* |
|
* @access private |
|
* @var int |
|
*/ |
|
private $sheetIndex = 0; |
|
|
|
/** |
|
* Load rows contiguously |
|
* |
|
* @access private |
|
* @var int |
|
*/ |
|
private $contiguous = false; |
|
|
|
/** |
|
* Row counter for loading rows contiguously |
|
* |
|
* @var int |
|
*/ |
|
private $contiguousRow = -1; |
|
|
|
|
|
/** |
|
* Create a new PHPExcel_Reader_CSV |
|
*/ |
|
public function __construct() |
|
{ |
|
$this->readFilter = new PHPExcel_Reader_DefaultReadFilter(); |
|
} |
|
|
|
/** |
|
* Validate that the current file is a CSV file |
|
* |
|
* @return boolean |
|
*/ |
|
protected function isValidFormat() |
|
{ |
|
return true; |
|
} |
|
|
|
/** |
|
* Set input encoding |
|
* |
|
* @param string $pValue Input encoding |
|
*/ |
|
public function setInputEncoding($pValue = 'UTF-8') |
|
{ |
|
$this->inputEncoding = $pValue; |
|
return $this; |
|
} |
|
|
|
/** |
|
* Get input encoding |
|
* |
|
* @return string |
|
*/ |
|
public function getInputEncoding() |
|
{ |
|
return $this->inputEncoding; |
|
} |
|
|
|
/** |
|
* Move filepointer past any BOM marker |
|
* |
|
*/ |
|
protected function skipBOM() |
|
{ |
|
rewind($this->fileHandle); |
|
|
|
switch ($this->inputEncoding) { |
|
case 'UTF-8': |
|
fgets($this->fileHandle, 4) == "\xEF\xBB\xBF" ? |
|
fseek($this->fileHandle, 3) : fseek($this->fileHandle, 0); |
|
break; |
|
case 'UTF-16LE': |
|
fgets($this->fileHandle, 3) == "\xFF\xFE" ? |
|
fseek($this->fileHandle, 2) : fseek($this->fileHandle, 0); |
|
break; |
|
case 'UTF-16BE': |
|
fgets($this->fileHandle, 3) == "\xFE\xFF" ? |
|
fseek($this->fileHandle, 2) : fseek($this->fileHandle, 0); |
|
break; |
|
case 'UTF-32LE': |
|
fgets($this->fileHandle, 5) == "\xFF\xFE\x00\x00" ? |
|
fseek($this->fileHandle, 4) : fseek($this->fileHandle, 0); |
|
break; |
|
case 'UTF-32BE': |
|
fgets($this->fileHandle, 5) == "\x00\x00\xFE\xFF" ? |
|
fseek($this->fileHandle, 4) : fseek($this->fileHandle, 0); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
|
/** |
|
* Identify any separator that is explicitly set in the file |
|
* |
|
*/ |
|
protected function checkSeparator() |
|
{ |
|
$line = fgets($this->fileHandle); |
|
if ($line === false) { |
|
return; |
|
} |
|
|
|
if ((strlen(trim($line, "\r\n")) == 5) && (stripos($line, 'sep=') === 0)) { |
|
$this->delimiter = substr($line, 4, 1); |
|
return; |
|
} |
|
return $this->skipBOM(); |
|
} |
|
|
|
/** |
|
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) |
|
* |
|
* @param string $pFilename |
|
* @throws PHPExcel_Reader_Exception |
|
*/ |
|
public function listWorksheetInfo($pFilename) |
|
{ |
|
// Open file |
|
$this->openFile($pFilename); |
|
if (!$this->isValidFormat()) { |
|
fclose($this->fileHandle); |
|
throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); |
|
} |
|
$fileHandle = $this->fileHandle; |
|
|
|
// Skip BOM, if any |
|
$this->skipBOM(); |
|
$this->checkSeparator(); |
|
|
|
$escapeEnclosures = array( "\\" . $this->enclosure, $this->enclosure . $this->enclosure ); |
|
|
|
$worksheetInfo = array(); |
|
$worksheetInfo[0]['worksheetName'] = 'Worksheet'; |
|
$worksheetInfo[0]['lastColumnLetter'] = 'A'; |
|
$worksheetInfo[0]['lastColumnIndex'] = 0; |
|
$worksheetInfo[0]['totalRows'] = 0; |
|
$worksheetInfo[0]['totalColumns'] = 0; |
|
|
|
// Loop through each line of the file in turn |
|
while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) { |
|
$worksheetInfo[0]['totalRows']++; |
|
$worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1); |
|
} |
|
|
|
$worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']); |
|
$worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; |
|
|
|
// Close file |
|
fclose($fileHandle); |
|
|
|
return $worksheetInfo; |
|
} |
|
|
|
/** |
|
* Loads PHPExcel from file |
|
* |
|
* @param string $pFilename |
|
* @return PHPExcel |
|
* @throws PHPExcel_Reader_Exception |
|
*/ |
|
public function load($pFilename) |
|
{ |
|
// Create new PHPExcel |
|
$objPHPExcel = new PHPExcel(); |
|
|
|
// Load into this instance |
|
return $this->loadIntoExisting($pFilename, $objPHPExcel); |
|
} |
|
|
|
/** |
|
* Loads PHPExcel from file into PHPExcel instance |
|
* |
|
* @param string $pFilename |
|
* @param PHPExcel $objPHPExcel |
|
* @return PHPExcel |
|
* @throws PHPExcel_Reader_Exception |
|
*/ |
|
public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) |
|
{ |
|
$lineEnding = ini_get('auto_detect_line_endings'); |
|
ini_set('auto_detect_line_endings', true); |
|
|
|
// Open file |
|
$this->openFile($pFilename); |
|
if (!$this->isValidFormat()) { |
|
fclose($this->fileHandle); |
|
throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); |
|
} |
|
$fileHandle = $this->fileHandle; |
|
|
|
// Skip BOM, if any |
|
$this->skipBOM(); |
|
$this->checkSeparator(); |
|
|
|
// Create new PHPExcel object |
|
while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) { |
|
$objPHPExcel->createSheet(); |
|
} |
|
$sheet = $objPHPExcel->setActiveSheetIndex($this->sheetIndex); |
|
|
|
$escapeEnclosures = array( "\\" . $this->enclosure, |
|
$this->enclosure . $this->enclosure |
|
); |
|
|
|
// Set our starting row based on whether we're in contiguous mode or not |
|
$currentRow = 1; |
|
if ($this->contiguous) { |
|
$currentRow = ($this->contiguousRow == -1) ? $sheet->getHighestRow(): $this->contiguousRow; |
|
} |
|
|
|
// Loop through each line of the file in turn |
|
while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) { |
|
$columnLetter = 'A'; |
|
foreach ($rowData as $rowDatum) { |
|
if ($rowDatum != '' && $this->readFilter->readCell($columnLetter, $currentRow)) { |
|
// Unescape enclosures |
|
$rowDatum = str_replace($escapeEnclosures, $this->enclosure, $rowDatum); |
|
|
|
// Convert encoding if necessary |
|
if ($this->inputEncoding !== 'UTF-8') { |
|
$rowDatum = PHPExcel_Shared_String::ConvertEncoding($rowDatum, 'UTF-8', $this->inputEncoding); |
|
} |
|
|
|
// Set cell value |
|
$sheet->getCell($columnLetter . $currentRow)->setValue($rowDatum); |
|
} |
|
++$columnLetter; |
|
} |
|
++$currentRow; |
|
} |
|
|
|
// Close file |
|
fclose($fileHandle); |
|
|
|
if ($this->contiguous) { |
|
$this->contiguousRow = $currentRow; |
|
} |
|
|
|
ini_set('auto_detect_line_endings', $lineEnding); |
|
|
|
// Return |
|
return $objPHPExcel; |
|
} |
|
|
|
/** |
|
* Get delimiter |
|
* |
|
* @return string |
|
*/ |
|
public function getDelimiter() |
|
{ |
|
return $this->delimiter; |
|
} |
|
|
|
/** |
|
* Set delimiter |
|
* |
|
* @param string $pValue Delimiter, defaults to , |
|
* @return PHPExcel_Reader_CSV |
|
*/ |
|
public function setDelimiter($pValue = ',') |
|
{ |
|
$this->delimiter = $pValue; |
|
return $this; |
|
} |
|
|
|
/** |
|
* Get enclosure |
|
* |
|
* @return string |
|
*/ |
|
public function getEnclosure() |
|
{ |
|
return $this->enclosure; |
|
} |
|
|
|
/** |
|
* Set enclosure |
|
* |
|
* @param string $pValue Enclosure, defaults to " |
|
* @return PHPExcel_Reader_CSV |
|
*/ |
|
public function setEnclosure($pValue = '"') |
|
{ |
|
if ($pValue == '') { |
|
$pValue = '"'; |
|
} |
|
$this->enclosure = $pValue; |
|
return $this; |
|
} |
|
|
|
/** |
|
* Get sheet index |
|
* |
|
* @return integer |
|
*/ |
|
public function getSheetIndex() |
|
{ |
|
return $this->sheetIndex; |
|
} |
|
|
|
/** |
|
* Set sheet index |
|
* |
|
* @param integer $pValue Sheet index |
|
* @return PHPExcel_Reader_CSV |
|
*/ |
|
public function setSheetIndex($pValue = 0) |
|
{ |
|
$this->sheetIndex = $pValue; |
|
return $this; |
|
} |
|
|
|
/** |
|
* Set Contiguous |
|
* |
|
* @param boolean $contiguous |
|
*/ |
|
public function setContiguous($contiguous = false) |
|
{ |
|
$this->contiguous = (bool) $contiguous; |
|
if (!$contiguous) { |
|
$this->contiguousRow = -1; |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Get Contiguous |
|
* |
|
* @return boolean |
|
*/ |
|
public function getContiguous() |
|
{ |
|
return $this->contiguous; |
|
} |
|
}
|
|
|