<?php namespace Maatwebsite\Excel;
use Closure;
use Maatwebsite\Excel\Readers\Batch;
use Maatwebsite\Excel\Classes\PHPExcel;
use Maatwebsite\Excel\Readers\LaravelExcelReader;
use Maatwebsite\Excel\Writers\LaravelExcelWriter;
use Maatwebsite\Excel\Exceptions\LaravelExcelException;
*
* Laravel wrapper for PHPExcel
*
* @category Laravel Excel
* @version 1.0.0
* @package maatwebsite/excel
* @copyright Copyright (c) 2013 - 2014 Maatwebsite (http://www.maatwebsite.nl)
* @author Maatwebsite <info@maatwebsite.nl>
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
*/
class Excel {
* Filter
* @var array
*/
protected $filters = [
'registered' => [],
'enabled' => []
];
* Excel object
* @var PHPExcel
*/
protected $excel;
* Reader object
* @var LaravelExcelReader
*/
protected $reader;
* Writer object
* @var LaravelExcelWriter
*/
protected $writer;
* Construct Excel
* @param PHPExcel $excel
* @param LaravelExcelReader $reader
* @param LaravelExcelWriter $writer
*/
public function __construct(PHPExcel $excel, LaravelExcelReader $reader, LaravelExcelWriter $writer)
{
$this->excel = $excel;
$this->reader = $reader;
$this->writer = $writer;
}
* Create a new file
* @param $filename
* @param callable|null $callback
* @return LaravelExcelWriter
*/
public function create($filename, $callback = null)
{
$writer = clone $this->writer;
$this->excel->disconnectWorksheets();
$writer->injectExcel($this->excel);
$writer->setFileName($filename);
$writer->setTitle($filename);
if (is_callable($callback))
call_user_func($callback, $writer);
return $writer;
}
*
* Load an existing file
*
* @param string $file The file we want to load
* @param callback|null $callback
* @param string|null $encoding
* @param bool $noBasePath
* @param callback|null $callbackConfigReader
* @return LaravelExcelReader
*/
public function load($file, $callback = null, $encoding = null, $noBasePath = false, $callbackConfigReader = null)
{
$reader = clone $this->reader;
$reader->injectExcel($this->excel);
$reader->setFilters($this->filters);
$encoding = is_string($callback) ? $callback : $encoding;
$reader->load($file, $encoding, $noBasePath, $callbackConfigReader);
if ($callback instanceof Closure)
call_user_func($callback, $reader);
return $reader;
}
* Set select sheets
* @param $sheets
* @return LaravelExcelReader
*/
public function selectSheets($sheets = [])
{
$sheets = is_array($sheets) ? $sheets : func_get_args();
$this->reader->setSelectedSheets($sheets);
return $this;
}
* Select sheets by index
* @param array $sheets
* @return $this
*/
public function selectSheetsByIndex($sheets = [])
{
$sheets = is_array($sheets) ? $sheets : func_get_args();
$this->reader->setSelectedSheetIndices($sheets);
return $this;
}
* Batch import
* @param $files
* @param callback $callback
* @return PHPExcel
*/
public function batch($files, Closure $callback)
{
$batch = new Batch;
return $batch->start($this, $files, $callback);
}
* Create a new file and share a view
* @param string $view
* @param array $data
* @param array $mergeData
* @return LaravelExcelWriter
*/
public function shareView($view, $data = [], $mergeData = [])
{
return $this->create($view)->shareView($view, $data, $mergeData);
}
* Create a new file and load a view
* @param string $view
* @param array $data
* @param array $mergeData
* @return LaravelExcelWriter
*/
public function loadView($view, $data = [], $mergeData = [])
{
return $this->shareView($view, $data, $mergeData);
}
* Set filters
* @param array $filters
* @return Excel
*/
public function registerFilters($filters = [])
{
if(array_key_exists('enabled', $filters))
{
$registered = $filters['registered'];
$this->filter($filters['enabled']);
}
else
{
$registered = $filters;
}
$this->filters['registered'] = !empty($this->filters['registered']) ? array_merge($this->filters['registered'], $registered) : $registered;
return $this;
}
* Enable certain filters
* @param string|array $filter
* @param bool|false|string $class
* @return Excel
*/
public function filter($filter, $class = false)
{
if(is_array($filter))
{
$this->filters['enabled'] = !empty($this->filters['enabled']) ? array_merge($this->filters['enabled'], $filter) : $filter;
}
else
{
$this->filters['enabled'][] = $filter;
if($class)
$this->filters['registered'][$filter] = $class;
}
$this->filters['enabled'] = array_unique($this->filters['enabled']);
return $this;
}
* Get register, enabled (or both) filters
* @param string|boolean $key [description]
* @return array
*/
public function getFilters($key = false)
{
return $key ? $this->filters[$key] : $this->filters;
}
* Dynamically call methods
* @throws LaravelExcelException
*/
public function __call($method, $params)
{
if (method_exists($this->excel, $method))
{
return call_user_func_array([$this->excel, $method], $params);
}
if (method_exists($this->reader, $method))
{
return call_user_func_array([$this->reader, $method], $params);
}
throw new LaravelExcelException('Laravel Excel method [' . $method . '] does not exist');
}
}