XLSX Reader and Empty Fill Tag (#2011)
Openpyxl can generate the xml tag `<patternFill/>`, possibly even as a default style. Excel has no problem with this, treating it as "fill none", but PhpSpreadsheet has a glitch because it treats it as "fill solid white". So, when PhpSpreadsheet loads and saves such a file, the result at first appears as if gridlines are disabled; in fact, the gridlines are merely invisible behind the cells with their solid white fill. This PR makes PhpSpreadsheet behave the same as Excel in this circumstance. Co-authored-by: Mark Baker <mark@lange.demon.co.uk>
This commit is contained in:
parent
6282035c96
commit
aeccdb35e2
|
|
@ -30,6 +30,7 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|||
use PhpOffice\PhpSpreadsheet\Style\Border;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Borders;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Color;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Fill;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Protection;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Style;
|
||||
|
|
@ -1646,7 +1647,7 @@ class Xlsx extends BaseReader
|
|||
$docStyle->getFill()->getStartColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=0]'))->color));
|
||||
$docStyle->getFill()->getEndColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=1]'))->color));
|
||||
} elseif ($style->fill->patternFill) {
|
||||
$patternType = (string) $style->fill->patternFill['patternType'] != '' ? (string) $style->fill->patternFill['patternType'] : 'solid';
|
||||
$patternType = (string) $style->fill->patternFill['patternType'] != '' ? (string) $style->fill->patternFill['patternType'] : Fill::FILL_NONE;
|
||||
$docStyle->getFill()->setFillType($patternType);
|
||||
if ($style->fill->patternFill->fgColor) {
|
||||
$docStyle->getFill()->getStartColor()->setARGB(self::readColor($style->fill->patternFill->fgColor, true));
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ class Styles extends BaseParserClass
|
|||
$fillStyle->getStartColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=0]'))->color));
|
||||
$fillStyle->getEndColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=1]'))->color));
|
||||
} elseif ($fillStyleXml->patternFill) {
|
||||
$patternType = (string) $fillStyleXml->patternFill['patternType'] != '' ? (string) $fillStyleXml->patternFill['patternType'] : 'solid';
|
||||
$patternType = (string) $fillStyleXml->patternFill['patternType'] != '' ? (string) $fillStyleXml->patternFill['patternType'] : Fill::FILL_NONE;
|
||||
$fillStyle->setFillType($patternType);
|
||||
if ($fillStyleXml->patternFill->fgColor) {
|
||||
$fillStyle->getStartColor()->setARGB(self::readColor($fillStyleXml->patternFill->fgColor, true));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Reader;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DefaultFillTest extends TestCase
|
||||
{
|
||||
public function testDefaultFill(): void
|
||||
{
|
||||
// default fill pattern doesn't specify filltype
|
||||
$filename = 'tests/data/Reader/XLSX/pr1769g.py.xlsx';
|
||||
$file = 'zip://';
|
||||
$file .= $filename;
|
||||
$file .= '#xl/styles.xml';
|
||||
$data = file_get_contents($file);
|
||||
// confirm that file contains expected empty xml tag
|
||||
if ($data === false) {
|
||||
self::fail('Unable to read file');
|
||||
} else {
|
||||
self::assertStringContainsString('<patternFill/>', $data);
|
||||
}
|
||||
$reader = IOFactory::createReader('Xlsx');
|
||||
$spreadsheet = $reader->load($filename);
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
self::assertSame('none', $sheet->getCell('A1')->getStyle()->getFill()->getFillType());
|
||||
self::assertSame('none', $sheet->getCell('D4')->getStyle()->getFill()->getFillType());
|
||||
self::assertSame('none', $sheet->getCell('J16')->getStyle()->getFill()->getFillType());
|
||||
self::assertSame('solid', $sheet->getCell('C2')->getStyle()->getFill()->getFillType());
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in New Issue