Skip to content

Commit a54d1c1

Browse files
authored
Merge pull request #2850 from PHPOffice/Ods-Writer-Worksheet-Visibility
Add support for writing Worksheet Visibility for Ods
2 parents 6569f72 + 2de58d4 commit a54d1c1

File tree

7 files changed

+103
-3
lines changed

7 files changed

+103
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
1515
Note that a ChartSheet is still only written as a normal Worksheet containing a single chart, not as an actual ChartSheet.
1616

1717
- Added Worksheet visibility in Ods Reader [PR #2851](https://github.com/PHPOffice/PhpSpreadsheet/pull/2851)
18+
- Added Worksheet visibility in Ods Writer [PR #2850](https://github.com/PHPOffice/PhpSpreadsheet/pull/2850)
1819

1920
### Changed
2021

src/PhpSpreadsheet/Writer/Ods/Cell/Style.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
use PhpOffice\PhpSpreadsheet\Style\Style as CellStyle;
1111
use PhpOffice\PhpSpreadsheet\Worksheet\ColumnDimension;
1212
use PhpOffice\PhpSpreadsheet\Worksheet\RowDimension;
13+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
1314

1415
class Style
1516
{
1617
public const CELL_STYLE_PREFIX = 'ce';
1718
public const COLUMN_STYLE_PREFIX = 'co';
1819
public const ROW_STYLE_PREFIX = 'ro';
20+
public const TABLE_STYLE_PREFIX = 'ta';
1921

2022
private $writer;
2123

@@ -221,6 +223,26 @@ public function writeRowStyles(RowDimension $rowDimension, int $sheetId): void
221223
$this->writer->endElement(); // Close style:style
222224
}
223225

226+
public function writeTableStyle(Worksheet $worksheet, int $sheetId): void
227+
{
228+
$this->writer->startElement('style:style');
229+
$this->writer->writeAttribute('style:family', 'table');
230+
$this->writer->writeAttribute(
231+
'style:name',
232+
sprintf('%s%d', self::TABLE_STYLE_PREFIX, $sheetId)
233+
);
234+
235+
$this->writer->startElement('style:table-properties');
236+
237+
$this->writer->writeAttribute(
238+
'table:display',
239+
$worksheet->getSheetState() === Worksheet::SHEETSTATE_VISIBLE ? 'true' : 'false'
240+
);
241+
242+
$this->writer->endElement(); // Close style:table-properties
243+
$this->writer->endElement(); // Close style:style
244+
}
245+
224246
public function write(CellStyle $style): void
225247
{
226248
$this->writer->startElement('style:style');

src/PhpSpreadsheet/Writer/Ods/Content.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ private function writeSheets(XMLWriter $objWriter): void
123123
for ($sheetIndex = 0; $sheetIndex < $sheetCount; ++$sheetIndex) {
124124
$objWriter->startElement('table:table');
125125
$objWriter->writeAttribute('table:name', $spreadsheet->getSheet($sheetIndex)->getTitle());
126+
$objWriter->writeAttribute('table:style-name', Style::TABLE_STYLE_PREFIX . (string) ($sheetIndex + 1));
126127
$objWriter->writeElement('office:forms');
127128
foreach ($spreadsheet->getSheet($sheetIndex)->getColumnDimensions() as $columnDimension) {
128129
$objWriter->startElement('table:table-column');
@@ -289,6 +290,8 @@ private function writeXfStyles(XMLWriter $writer, Spreadsheet $spreadsheet): voi
289290
$sheetCount = $spreadsheet->getSheetCount();
290291
for ($i = 0; $i < $sheetCount; ++$i) {
291292
$worksheet = $spreadsheet->getSheet($i);
293+
$styleWriter->writeTableStyle($worksheet, $i + 1);
294+
292295
$worksheet->calculateColumnWidths();
293296
foreach ($worksheet->getColumnDimensions() as $columnDimension) {
294297
if ($columnDimension->getWidth() !== -1.0) {

tests/PhpSpreadsheetTests/Writer/Ods/ContentTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpOffice\PhpSpreadsheet\Style\Fill;
1111
use PhpOffice\PhpSpreadsheet\Style\Font;
1212
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
13+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
1314
use PhpOffice\PhpSpreadsheet\Writer\Ods;
1415
use PhpOffice\PhpSpreadsheet\Writer\Ods\Content;
1516
use PHPUnit\Framework\TestCase;
@@ -106,4 +107,26 @@ public function testWriteSpreadsheet(): void
106107

107108
self::assertXmlStringEqualsXmlFile($this->samplesPath . '/content-with-data.xml', $xml);
108109
}
110+
111+
public function testWriteWithHiddenWorksheet(): void
112+
{
113+
$workbook = new Spreadsheet();
114+
115+
// Worksheet 1
116+
$worksheet1 = $workbook->getActiveSheet();
117+
$worksheet1->setCellValue('A1', 1);
118+
119+
// Worksheet 2
120+
$worksheet2 = $workbook->createSheet();
121+
$worksheet2->setTitle('New Worksheet');
122+
$worksheet2->setCellValue('A1', 2);
123+
124+
$worksheet2->setSheetState(Worksheet::SHEETSTATE_HIDDEN);
125+
126+
// Write
127+
$content = new Content(new Ods($workbook));
128+
$xml = $content->write();
129+
130+
self::assertXmlStringEqualsXmlFile($this->samplesPath . '/content-hidden-worksheet.xml', $xml);
131+
}
109132
}

tests/data/Writer/Ods/content-empty.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
<office:scripts />
44
<office:font-face-decls />
55
<office:automatic-styles>
6+
<style:style style:family="table" style:name="ta1">
7+
<style:table-properties table:display="true" />
8+
</style:style>
69
<style:style style:name="ce0" style:family="table-cell" style:parent-style-name="Default">
710
<style:table-cell-properties style:rotation-align="none" style:vertical-align="bottom" />
811
<style:paragraph-properties fo:text-align="start" />
@@ -12,7 +15,7 @@
1215
<office:body>
1316
<office:spreadsheet>
1417
<table:calculation-settings />
15-
<table:table table:name="Worksheet">
18+
<table:table table:name="Worksheet" table:style-name="ta1">
1619
<office:forms />
1720
<table:table-row>
1821
<table:table-cell table:style-name="ce0" />
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2">
3+
<office:scripts />
4+
<office:font-face-decls />
5+
<office:automatic-styles>
6+
<style:style style:family="table" style:name="ta1">
7+
<style:table-properties table:display="true" />
8+
</style:style>
9+
<style:style style:family="table" style:name="ta2">
10+
<style:table-properties table:display="false"/>
11+
</style:style>
12+
<style:style style:name="ce0" style:family="table-cell" style:parent-style-name="Default">
13+
<style:table-cell-properties style:rotation-align="none" style:vertical-align="bottom" />
14+
<style:paragraph-properties fo:text-align="start" />
15+
<style:text-properties fo:color="#000000" fo:font-family="Calibri" fo:font-size="11.0pt" />
16+
</style:style>
17+
</office:automatic-styles>
18+
<office:body>
19+
<office:spreadsheet>
20+
<table:calculation-settings />
21+
<table:table table:name="Worksheet" table:style-name="ta1">
22+
<office:forms />
23+
<table:table-row>
24+
<table:table-cell office:value="1" office:value-type="float" table:style-name="ce0">
25+
<text:p>1</text:p>
26+
</table:table-cell>
27+
<table:table-cell table:number-columns-repeated="1023"/>
28+
</table:table-row>
29+
</table:table>
30+
<table:table table:name="New Worksheet" table:style-name="ta2">
31+
<office:forms/>
32+
<table:table-row>
33+
<table:table-cell office:value="2" office:value-type="float" table:style-name="ce0">
34+
<text:p>2</text:p>
35+
</table:table-cell>
36+
<table:table-cell table:number-columns-repeated="1023" />
37+
</table:table-row>
38+
</table:table>
39+
<table:named-expressions />
40+
</office:spreadsheet>
41+
</office:body>
42+
</office:document-content>

tests/data/Writer/Ods/content-with-data.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
<office:scripts/>
44
<office:font-face-decls/>
55
<office:automatic-styles>
6+
<style:style style:family="table" style:name="ta1">
7+
<style:table-properties table:display="true" />
8+
</style:style>
9+
<style:style style:family="table" style:name="ta2">
10+
<style:table-properties table:display="true" />
11+
</style:style>
612
<style:style style:family="table-cell" style:name="ce0" style:parent-style-name="Default">
713
<style:table-cell-properties style:rotation-align="none" style:vertical-align="bottom" />
814
<style:paragraph-properties fo:text-align="start" />
@@ -62,7 +68,7 @@
6268
<office:body>
6369
<office:spreadsheet>
6470
<table:calculation-settings/>
65-
<table:table table:name="Worksheet">
71+
<table:table table:name="Worksheet" table:style-name="ta1">
6672
<office:forms/>
6773
<table:table-row>
6874
<table:table-cell office:value="1" office:value-type="float" table:style-name="ce2">
@@ -107,7 +113,7 @@
107113
<table:table-cell table:number-columns-repeated="1017"/>
108114
</table:table-row>
109115
</table:table>
110-
<table:table table:name="New Worksheet">
116+
<table:table table:name="New Worksheet" table:style-name="ta2">
111117
<office:forms/>
112118
<table:table-row>
113119
<table:table-cell office:value="2" office:value-type="float" table:style-name="ce0">

0 commit comments

Comments
 (0)