sigwin / xezilaires-dev
Iterate structured Excel spreadsheets, normalize rows into value objects, validate, serialize into CSV, JSON, XML
Installs: 601
Dependents: 0
Suggesters: 0
Security: 0
Stars: 62
Watchers: 3
Forks: 4
Open Issues: 29
Requires
- php: ^8.2
- ext-json: *
- symfony/options-resolver: ^6.4 || ^7.0
- symfony/serializer: ^6.4 || ^7.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^5.0
- nyholm/nsa: ^1.1
- nyholm/symfony-bundle-test: ^3.0
- openspout/openspout: ^4.0
- phpoffice/phpspreadsheet: ^2.0
- phpunit/phpunit: ^10.5
- sigwin/infra: ~1.9.0
- symfony/console: ^6.4 || ^7.0
- symfony/framework-bundle: ^6.4 || ^7.0
- symfony/phpunit-bridge: ^6.4 || ^7.0
- symfony/property-access: ^6.4 || ^7.0
- symfony/property-info: ^6.4 || ^7.0
- symfony/validator: ^6.4 || ^7.0
Suggests
- openspout/openspout: Read Excel files with Spout
- phpoffice/phpspreadsheet: Read Excel files with PhpSpreadsheet
- symfony/console: bin/xezilaires use
- symfony/framework-bundle: Symfony bundle integration, bin/xezilaires use
- symfony/validator: Symfony bundle integration, bin/xezilaires validate use
Replaces
- sigwin/xezilaires-core: 1.0.0
- sigwin/xezilaires-phpspreadsheet: 1.0.0
- sigwin/xezilaires-spout: 1.0.0
- sigwin/xezilaires-symfony: 1.0.0
README
Xezilaires is a PHP library which helps to iterate structured Excel spreadsheets, normalize rows into value objects, validate, serialize into CSV, JSON, XML.
What it does
- we create a PHP class which will hold our Excel row data
- we next create spreadsheet iterator instance
- passing the path to the Excel file we wish to read
- passing the configuration mapping the Excel columns into PHP properties
- as we're iterating, we are getting an value object (instance of the defined class) for each row
Think of it as an "ORM" (Object Relation Manager) for an Excel file. An OEM (Object Excel Manager), if you will.
Example usage
Without attributes
class Product { private $name; } $symfonySerializer = new \Symfony\Component\Serializer\Serializer([ new \Symfony\Component\Serializer\Normalizer\PropertyNormalizer(), ]); $normalizer = new \Xezilaires\Bridge\Symfony\Serializer\ObjectSerializer($symfonySerializer); $iteratorFactory = new \Xezilaires\SpreadsheetIteratorFactory($normalizer, [ \Xezilaires\Bridge\PhpSpreadsheet\Spreadsheet::class, ]); $iterator = $iteratorFactory->fromFile( // https://github.com/sigwinhq/xezilaires-dev/raw/master/src/Xezilaires/Test/resources/fixtures/products.xlsx new \SplFileObject(__DIR__.'/../../src/Xezilaires/Test/resources/fixtures/products.xlsx'), new \Xezilaires\Metadata\Mapping( Model\Product::class, [ 'name' => new \Xezilaires\Metadata\ColumnReference('A'), ], [ // options 'start' => 2, ] ) );
With attributes
use Xezilaires\Attribute as XLS; #[XLS\Options(header=1, start=2)] class Product { #[@XLS\HeaderReference(header="Name")] private $name; } $symfonySerializer = new \Symfony\Component\Serializer\Serializer([ new \Symfony\Component\Serializer\Normalizer\PropertyNormalizer(), ]); $normalizer = new \Xezilaires\Bridge\Symfony\Serializer\ObjectSerializer($symfonySerializer); $iteratorFactory = new \Xezilaires\SpreadsheetIteratorFactory($normalizer, [ \Xezilaires\Bridge\PhpSpreadsheet\Spreadsheet::class, ]); $attributeDriver = new \Xezilaires\Metadata\Attribute\AttributeDriver(); $iterator = $iteratorFactory->fromFile( // https://github.com/sigwinhq/xezilaires-dev/raw/master/src/Xezilaires/Test/resources/fixtures/products.xlsx new \SplFileObject(__DIR__.'/../../src/Xezilaires/Test/resources/fixtures/products.xlsx'), $attributeDriver->getMetadataMapping(Product::class, ['reverse' => true]) );
See more examples in the docs/examples/
folder.
Options
start
, which row do we start on
(integer, optional, default:1
)header
, which row contains the header labels
(integer, optional if not usingHeaderReference
, default:null
)reverse
, do we iterate the rows in reverse, from end to start
(boolean, optional, default:false
)sequential
, is the key sequential (0, 1, 2) or represents current row?
(boolean, optional, default:false
)
Features
Features included:
- Reading Excel files
(using eitherphpoffice/PhpSpreadsheet
oropenspout/openspout
) - Denormalization / normalization support
(usingsymfony/serializer
, from / to all supported formats) - Attributes support
- mapping via column names or header labels
(saying "Map header labelPrdctEN
to propertyproduct
") - A Symfony bundle
(for easy integration into existing apps) - CLI (command-line interface) tool
Custom normalizers / validators
You can use your own normalizers / validators by passing your own Symfony bundle
which registers them to the Xezilaires commands via --bundle
, like so:
vendor/bin/xezilaires validate --bundle Xezilaires\\Test\\ExampleBundle\\XezilairesExampleBundle Xezilaires\\Test\\Model\\Product src/Xezilaires/Test/resources/fixtures/products.xlsx
See example bundle in src/Xezilaires/Test/ExampleBundle/
.
What's with the name
xezilaires
is serializex
backwards.
We added the X so the name so we can shorten it as XLS. As a side-effect, we made reading Excel files with this library cool.