From 7e0f777a86ee3cec65e176f0ce09226df055a1f7 Mon Sep 17 00:00:00 2001 From: Clemente Date: Wed, 27 Sep 2023 14:38:17 -0300 Subject: [PATCH 1/2] Add custom styles feature --- testbench/test.php | 3 +++ xlsxwriter.class.php | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/testbench/test.php b/testbench/test.php index ba7ca4c4d..bc2519ded 100644 --- a/testbench/test.php +++ b/testbench/test.php @@ -15,9 +15,12 @@ $data2 = array( array('2003','01','343.12'), array('2003','02','345.12'), + array('2003','02', ['Vencedor', 'SaoPaulo'], ['Perdedor', 'Flamengo']), ); $writer = new XLSXWriter(); $writer->setAuthor('Some Author'); +$writer->addStyle('SaoPaulo', 'FFFFFF', 'FF0000', true); +$writer->addStyle('Flamengo', 'FF0000', '000000', false); $writer->writeSheet($data1,'Sheet1',$header); $writer->writeSheet($data2,'Sheet2'); $writer->writeToFile('test.xlsx'); diff --git a/xlsxwriter.class.php b/xlsxwriter.class.php index 085e294a7..85fb01e3c 100644 --- a/xlsxwriter.class.php +++ b/xlsxwriter.class.php @@ -20,6 +20,10 @@ class XLSXWriter protected $current_sheet = ''; + protected $fonts = []; + protected $fills = []; + protected $styles = []; + public function __construct() { if(!ini_get('date.timezone')) @@ -31,6 +35,21 @@ public function __construct() public function setAuthor($author='') { $this->author=$author; } + public function addStyle(string $name, string $font_color, string $background_color, bool $bold = false): void { + $this->fonts[] = [ + $font_color, + $bold + ]; + $this->fills[] = [ + $background_color + ]; + $this->styles[$name] = [ + count($this->fonts) + 5, + count($this->fills) + 3, + 7 + count($this->styles), + ]; + } + public function __destruct() { if (!empty($this->temp_files)) { @@ -279,7 +298,7 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col 'blackheader' => 6 ); $cell = self::xlsCell($row_number, $column_number); - $s = isset($styles[$cell_format]) ? $styles[$cell_format] : '0'; + $s = $styles[$cell_format] ?? $this->styles[$cell_format][2] ?? '0'; if (!is_scalar($value) || $value==='') { //objects, array, empty $file->write(''); @@ -314,17 +333,23 @@ protected function writeStylesXML() $file->write( ''); $file->write( ''); $file->write(''); - $file->write(''); + $file->write(''); $file->write( ''); $file->write( ''); $file->write( ''); $file->write( ''); $file->write( ''); + foreach($this->fonts as [$color, $bold]) { + $file->write( ''); + } $file->write(''); - $file->write(''); + $file->write(''); $file->write(' '); $file->write(' '); $file->write(' '); + foreach($this->fills as [$color]) { + $file->write(' '); + } $file->write(''); $file->write(''); $file->write( ''); @@ -352,7 +377,7 @@ protected function writeStylesXML() $file->write( ''); $file->write( ''); $file->write( ''); - $file->write( ''); + $file->write( ''); $file->write( ''); $file->write( ''); $file->write( ''); @@ -360,6 +385,9 @@ protected function writeStylesXML() $file->write( ''); $file->write( ''); $file->write( ''); + foreach($this->styles as [$font_id, $fill_id, $_]) { + $file->write( ''); + } $file->write( ''); $file->write( ''); $file->write( ''); From 0e4c74abac49080e2e2eaba4c35cc3c61ff91669 Mon Sep 17 00:00:00 2001 From: Clemente Date: Wed, 27 Sep 2023 14:55:09 -0300 Subject: [PATCH 2/2] Add test --- testbench/xlsxwriter.class.Test.php | 14 ++++++++++++++ xlsxwriter.class.php | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/testbench/xlsxwriter.class.Test.php b/testbench/xlsxwriter.class.Test.php index a84198c20..d9b25a494 100644 --- a/testbench/xlsxwriter.class.Test.php +++ b/testbench/xlsxwriter.class.Test.php @@ -77,6 +77,20 @@ public function testWriteToFile() $this->assertEmpty($r2); } + public function testCustomStyle() + { + $filename = tempnam("/tmp", "xlsx_writer"); + $file_writer = new XLSXWriter_BuffererWriter($filename); + + $xlsx_writer = new _XLSXWriter_(); + $xlsx_writer->addStyle('test', 'FFFFFF', 'FFFFFF'); + $xlsx_writer->writeCell($file_writer, 0, 0, '0123', 'test'); + $file_writer->close(); + $cell_xml = file_get_contents($filename); + $this->assertEquals('0', $cell_xml); + @unlink($filename); + } + private function stripCellsFromSheetXML($sheet_xml) { $output=array(); diff --git a/xlsxwriter.class.php b/xlsxwriter.class.php index 85fb01e3c..213abfc45 100644 --- a/xlsxwriter.class.php +++ b/xlsxwriter.class.php @@ -333,7 +333,7 @@ protected function writeStylesXML() $file->write( ''); $file->write( ''); $file->write(''); - $file->write(''); + $file->write(''); $file->write( ''); $file->write( ''); $file->write( ''); @@ -343,7 +343,7 @@ protected function writeStylesXML() $file->write( ''); } $file->write(''); - $file->write(''); + $file->write(''); $file->write(' '); $file->write(' '); $file->write(' '); @@ -377,7 +377,7 @@ protected function writeStylesXML() $file->write( ''); $file->write( ''); $file->write( ''); - $file->write( ''); + $file->write( ''); $file->write( ''); $file->write( ''); $file->write( '');