From 72b73bc9a690435034e6613f44be0b7494eedbc0 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Sat, 29 Feb 2020 20:06:45 +0100 Subject: [PATCH] support multi-line values in excel invoices (#1507) --- UPGRADING.md | 1 + .../Renderer/AbstractSpreadsheetRenderer.php | 3 + src/Invoice/Renderer/AdvancedValueBinder.php | 58 +++++++++++++++++++ tests/Invoice/Renderer/CsvRendererTest.php | 1 + tests/Invoice/Renderer/RendererTestTrait.php | 1 + tests/Invoice/Renderer/XlsxRendererTest.php | 1 + 6 files changed, 65 insertions(+) create mode 100644 src/Invoice/Renderer/AdvancedValueBinder.php diff --git a/UPGRADING.md b/UPGRADING.md index 6fd99fff..02f2cc19 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -11,6 +11,7 @@ Perform EACH version specific task between your version and the new one, otherwi ## [1.8](https://github.com/kevinpapst/kimai2/releases/tag/1.8) - New mailer library: check if emails are still working (eg. by using the "password forgotten" function) or if you need to adjust your configuration, [see docs at symfony.com](https://symfony.com/doc/current/components/mailer.html#transport) +- Support for line breaks in multiline invoice fields for spreadsheets (check your invoice templates after the update) Permission changes: diff --git a/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php b/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php index 25547c66..cb0f3f8e 100644 --- a/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php +++ b/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php @@ -11,6 +11,7 @@ namespace App\Invoice\Renderer; use App\Entity\InvoiceDocument; use App\Invoice\InvoiceModel; +use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; @@ -59,6 +60,8 @@ abstract class AbstractSpreadsheetRenderer extends AbstractRenderer $entryRow = 0; + Cell::setValueBinder(new AdvancedValueBinder()); + foreach ($worksheet->getRowIterator() as $row) { $sheetValues = false; foreach ($row->getCellIterator() as $cell) { diff --git a/src/Invoice/Renderer/AdvancedValueBinder.php b/src/Invoice/Renderer/AdvancedValueBinder.php new file mode 100644 index 00000000..634cff4a --- /dev/null +++ b/src/Invoice/Renderer/AdvancedValueBinder.php @@ -0,0 +1,58 @@ +setValueExplicit($value, DataType::TYPE_STRING); + $cell->getWorksheet()->getStyle($cell->getCoordinate())->getAlignment()->setWrapText(true); + + $amount = substr_count($value, "\n"); + $dimension = $cell->getWorksheet()->getRowDimension($cell->getRow()); + if ($dimension->getRowHeight() !== -1) { + $defaultHeight = $cell->getWorksheet()->getDefaultRowDimension()->getRowHeight(); + $dimension->setRowHeight($defaultHeight * ($amount + 1)); + } + + return true; + } + } + + return parent::bindValue($cell, $value); + } +} diff --git a/tests/Invoice/Renderer/CsvRendererTest.php b/tests/Invoice/Renderer/CsvRendererTest.php index 9f5fa849..3a749e69 100644 --- a/tests/Invoice/Renderer/CsvRendererTest.php +++ b/tests/Invoice/Renderer/CsvRendererTest.php @@ -18,6 +18,7 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; * @covers \App\Invoice\Renderer\CsvRenderer * @covers \App\Invoice\Renderer\AbstractRenderer * @covers \App\Invoice\Renderer\AbstractSpreadsheetRenderer + * @covers \App\Invoice\Renderer\AdvancedValueBinder * @group integration */ class CsvRendererTest extends TestCase diff --git a/tests/Invoice/Renderer/RendererTestTrait.php b/tests/Invoice/Renderer/RendererTestTrait.php index 7548f220..6ec8d605 100644 --- a/tests/Invoice/Renderer/RendererTestTrait.php +++ b/tests/Invoice/Renderer/RendererTestTrait.php @@ -108,6 +108,7 @@ trait RendererTestTrait $customer = new Customer(); $customer->setName('customer,with/special#name'); + $customer->setAddress('Foo' . PHP_EOL . 'Street' . PHP_EOL . '1111 City'); $customer->setCurrency('EUR'); $customer->setMetaField((new CustomerMeta())->setName('foo-customer')->setValue('bar-customer')->setIsVisible(true)); diff --git a/tests/Invoice/Renderer/XlsxRendererTest.php b/tests/Invoice/Renderer/XlsxRendererTest.php index 7fe21a72..d4be4491 100644 --- a/tests/Invoice/Renderer/XlsxRendererTest.php +++ b/tests/Invoice/Renderer/XlsxRendererTest.php @@ -18,6 +18,7 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; * @covers \App\Invoice\Renderer\XlsxRenderer * @covers \App\Invoice\Renderer\AbstractRenderer * @covers \App\Invoice\Renderer\AbstractSpreadsheetRenderer + * @covers \App\Invoice\Renderer\AdvancedValueBinder * @group integration */ class XlsxRendererTest extends TestCase