Giter Club home page Giter Club logo

xezilaires-dev's Introduction

Xezilaires

Xezilaires is a PHP library which helps to iterate structured Excel spreadsheets, normalize rows into value objects, validate, serialize into CSV, JSON, XML.

Latest Stable Version Actions Status PHPStan enabled Psalm enabled

What it does

  1. we create a PHP class which will hold our Excel row data
  2. we next create spreadsheet iterator instance
    1. passing the path to the Excel file we wish to read
    2. passing the configuration mapping the Excel columns into PHP properties
  3. 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 using HeaderReference, 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 either phpoffice/PhpSpreadsheet or openspout/openspout)
  • Denormalization / normalization support
    (using symfony/serializer, from / to all supported formats)
  • Attributes support
  • mapping via column names or header labels
    (saying "Map header label PrdctEN to property product")
  • 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.

xezilaires-dev's People

Contributors

dkarlovi avatar gitter-badger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

xezilaires-dev's Issues

Sequential index when serializing

  1. Add a Mapping option sequence, default false
  2. if sequence===true, use behaviour from before 1c8d5fb90ed5e2cce7e3efd7e0debb41d263780b, else use current
  3. set sequence => true in SerializeCommand

Additional care for child packages

Needed:

  • LICENSE
  • README
  • make test-all, etc
  • Github Actions for everything (root)
  • Github Actions individually (per child package)
  • child GH repo metadata (tags, description)

Unit tests

Want tests with coverage to test infection.

ValueReference

Hardcoded reference which always returns the same value.

Streamline exception messages

It's now:

Invalid property name "0"

Could be

Xezilaires: Invalid mapping for \App\Xezilaires\OEM\Product, invalid property name "0" for HeaderReference('Name')

Force value cast

$objPHPExcel->getActiveSheet()->setCellValueExplicit('A1', '0029', PHPExcel_Cell_DataType::TYPE_STRING);

Avoids having ie. EANs with leading zeros being misinterpreted as octal integers.

Mapping => Hydrator

Move the hydration out the SerializerIterator, doesn't need the denormalizer, context, etc.

Box

vendor/bin/xezilaires + PHAR

Validation

Requirements:

  • returns a array<Violations>, it contains the row, cell and current value, error message

Invalid reference

        $iterator = $this->factory->createFromPath($path, new Mapping(Product::class, [
            'name' => new HeaderReference('Name'),
            ['header' => 1, 'start' => 2],
        ]));

Index for header reference

If there are multiple times the same header is used, allow to add a numeric designation, example

    /**
     * @XLS\HeaderReference(header="Status", index=0)
     */
    public $status;

    /**
     * @XLS\HeaderReference(header="Status", index=1)
     */
    public $statusLabel;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.