create a reader by file type #569

This commit is contained in:
madflow 2018-10-16 16:29:04 +02:00 committed by Adrien Loison
parent 8f7f106555
commit e99c80b3ad
10 changed files with 202 additions and 0 deletions

View File

@ -68,6 +68,17 @@ $reader->close();
If there are multiple sheets in the file, the reader will read all of them sequentially. If there are multiple sheets in the file, the reader will read all of them sequentially.
---
In addition to passing a reader type to ```ReaderEntityFactory::createReader```, it is also possible to provide a path to a file and create the reader.
```php
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
$reader = ReaderEntityFactory::createReaderFromFile('/path/to/file.xlsx');
```
### Writer ### Writer
As with the reader, there is one common interface to write data to a file: As with the reader, there is one common interface to write data to a file:

View File

@ -21,4 +21,17 @@ class ReaderEntityFactory
{ {
return (new ReaderFactory())->create($readerType); return (new ReaderFactory())->create($readerType);
} }
/**
* Creates a reader by file extension
*
* @param string The path to the spreadsheet file. Supported extensions are .csv,.ods and .xlsx
* @throws \Box\Spout\Common\Exception\IOException
* @throws \Box\Spout\Common\Exception\UnsupportedTypeException
* @return ReaderInterface
*/
public static function createReaderFromFile(string $path)
{
return (new ReaderFactory())->createFromFile($path);
}
} }

View File

@ -3,6 +3,7 @@
namespace Box\Spout\Reader\Common\Creator; namespace Box\Spout\Reader\Common\Creator;
use Box\Spout\Common\Creator\HelperFactory; use Box\Spout\Common\Creator\HelperFactory;
use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Exception\UnsupportedTypeException; use Box\Spout\Common\Exception\UnsupportedTypeException;
use Box\Spout\Common\Type; use Box\Spout\Common\Type;
use Box\Spout\Reader\CSV\Creator\InternalEntityFactory as CSVInternalEntityFactory; use Box\Spout\Reader\CSV\Creator\InternalEntityFactory as CSVInternalEntityFactory;
@ -28,6 +29,16 @@ use Box\Spout\Reader\XLSX\Reader as XLSXReader;
*/ */
class ReaderFactory class ReaderFactory
{ {
/**
* Map file extensions to reader types
* @var array
*/
private static $extensionReaderMap = [
'csv' => Type::CSV,
'ods' => Type::ODS,
'xlsx' => Type::XLSX,
];
/** /**
* This creates an instance of the appropriate reader, given the type of the file to be read * This creates an instance of the appropriate reader, given the type of the file to be read
* *
@ -46,6 +57,34 @@ class ReaderFactory
} }
} }
/**
* Creates a reader by file extension
*
* @param string The path to the spreadsheet file. Supported extensions are .csv,.ods and .xlsx
* @throws \Box\Spout\Common\Exception\IOException
* @throws \Box\Spout\Common\Exception\UnsupportedTypeException
* @return ReaderInterface
*/
public static function createFromFile(string $path)
{
if (!\is_file($path)) {
throw new IOException(
sprintf('Could not open "%s" for reading! File does not exist.', $path)
);
}
$ext = \pathinfo($path, PATHINFO_EXTENSION);
$ext = \strtolower($ext);
$readerType = self::$extensionReaderMap[$ext] ?? null;
if ($readerType === null) {
throw new UnsupportedTypeException(
sprintf('No readers supporting the file extension "%s".', $ext)
);
}
return self::create($readerType);
}
/** /**
* @return CSVReader * @return CSVReader
*/ */

View File

@ -0,0 +1,73 @@
<?php
namespace Box\Spout\Reader\Common\Creator;
use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Exception\UnsupportedTypeException;
use Box\Spout\TestUsingResource;
use PHPUnit\Framework\TestCase;
class ReaderEntityFactoryTest extends TestCase
{
use TestUsingResource;
/**
* @return void
*/
public function testCreateFromFileCSV()
{
$validCsv = $this->getResourcePath('csv_test_create_from_file.csv');
$reader = ReaderEntityFactory::createReaderFromFile($validCsv);
$this->assertInstanceOf('Box\Spout\Reader\CSV\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileCSVAllCaps()
{
$validCsv = $this->getResourcePath('csv_test_create_from_file.CSV');
$reader = ReaderEntityFactory::createReaderFromFile($validCsv);
$this->assertInstanceOf('Box\Spout\Reader\CSV\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileODS()
{
$validOds = $this->getResourcePath('csv_test_create_from_file.ods');
$reader = ReaderEntityFactory::createReaderFromFile($validOds);
$this->assertInstanceOf('Box\Spout\Reader\ODS\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileXLSX()
{
$validXlsx = $this->getResourcePath('csv_test_create_from_file.xlsx');
$reader = ReaderEntityFactory::createReaderFromFile($validXlsx);
$this->assertInstanceOf('Box\Spout\Reader\XLSX\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileUnsupported()
{
$this->expectException(UnsupportedTypeException::class);
$invalid = $this->getResourcePath('test_unsupported_file_type.other');
$reader = ReaderEntityFactory::createReaderFromFile($invalid);
}
/**
* @return void
*/
public function testCreateFromFileMissing()
{
$this->expectException(IOException::class);
$invalid = 'thereisnosuchfile.ext';
$reader = ReaderEntityFactory::createReaderFromFile($invalid);
}
}

View File

@ -2,7 +2,9 @@
namespace Box\Spout\Reader\Common\Creator; namespace Box\Spout\Reader\Common\Creator;
use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Exception\UnsupportedTypeException; use Box\Spout\Common\Exception\UnsupportedTypeException;
use Box\Spout\TestUsingResource;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
/** /**
@ -10,6 +12,48 @@ use PHPUnit\Framework\TestCase;
*/ */
class ReaderFactoryTest extends TestCase class ReaderFactoryTest extends TestCase
{ {
use TestUsingResource;
/**
* @return void
*/
public function testCreateFromFileCSV()
{
$validCsv = $this->getResourcePath('csv_test_create_from_file.csv');
$reader = ReaderFactory::createFromFile($validCsv);
$this->assertInstanceOf('Box\Spout\Reader\CSV\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileCSVAllCaps()
{
$validCsv = $this->getResourcePath('csv_test_create_from_file.CSV');
$reader = ReaderFactory::createFromFile($validCsv);
$this->assertInstanceOf('Box\Spout\Reader\CSV\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileODS()
{
$validOds = $this->getResourcePath('csv_test_create_from_file.ods');
$reader = ReaderFactory::createFromFile($validOds);
$this->assertInstanceOf('Box\Spout\Reader\ODS\Reader', $reader);
}
/**
* @return void
*/
public function testCreateFromFileXLSX()
{
$validXlsx = $this->getResourcePath('csv_test_create_from_file.xlsx');
$reader = ReaderFactory::createFromFile($validXlsx);
$this->assertInstanceOf('Box\Spout\Reader\XLSX\Reader', $reader);
}
/** /**
* @return void * @return void
*/ */
@ -19,4 +63,24 @@ class ReaderFactoryTest extends TestCase
ReaderFactory::create('unsupportedType'); ReaderFactory::create('unsupportedType');
} }
/**
* @return void
*/
public function testCreateFromFileUnsupported()
{
$this->expectException(UnsupportedTypeException::class);
$invalid = $this->getResourcePath('test_unsupported_file_type.other');
$reader = ReaderFactory::createFromFile($invalid);
}
/**
* @return void
*/
public function testCreateFromFileMissing()
{
$this->expectException(IOException::class);
$invalid = 'thereisnosuchfile.ext';
$reader = ReaderFactory::createFromFile($invalid);
}
} }

View File

@ -0,0 +1 @@
test
1 test

View File

@ -0,0 +1 @@
test
1 test

Binary file not shown.

Binary file not shown.