Skip to content

Commit c05e68c

Browse files
committed
Add a couple of worksheet functions
1 parent dd12f02 commit c05e68c

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ use alexandrainst\XlsxFastEditor\XlsxFastEditorException;
4646
try {
4747
$xlsxFastEditor = new XlsxFastEditor('test.xlsx');
4848

49+
// Workbook / worksheet methods
50+
$nbWorksheets = $xlsxFastEditor->getWorksheetCount();
51+
$worksheetName = $xlsxFastEditor->getWorksheetName(1);
4952
$worksheetId1 = $xlsxFastEditor->getWorksheetNumber('Sheet1');
5053
$worksheetId2 = $xlsxFastEditor->getWorksheetNumber('Sheet2');
5154

src/XlsxFastEditor.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,19 @@ public function save(bool $close = true): void
121121
}
122122

123123
/**
124-
* Get a worksheet number (ID) from its name.
124+
* Count the number of worksheets in the workbook.
125+
*/
126+
public function getWorksheetCount(): int
127+
{
128+
$dom = $this->getDomFromPath(self::WORKBOOK_PATH);
129+
$xpath = new \DOMXPath($dom);
130+
$xpath->registerNamespace('o', self::OXML_NAMESPACE);
131+
$count = $xpath->evaluate('count(/o:workbook/o:sheets/o:sheet)');
132+
return is_numeric($count) ? (int)$count : 0;
133+
}
134+
135+
/**
136+
* Get a worksheet number (ID) from its name (base 1).
125137
* @param string $sheetName The name of the worksheet to look up.
126138
* @return int The worksheet ID, or -1 if not found.
127139
*/
@@ -137,6 +149,20 @@ public function getWorksheetNumber(string $sheetName): int
137149
return -1;
138150
}
139151

152+
/**
153+
* Get a worksheet name from its number (ID).
154+
* @param int $sheetNumber The number of the worksheet to look up.
155+
* @return string|null The worksheet name, or null if not found.
156+
*/
157+
public function getWorksheetName(int $sheetNumber): ?string
158+
{
159+
$dom = $this->getDomFromPath(self::WORKBOOK_PATH);
160+
$xpath = new \DOMXPath($dom);
161+
$xpath->registerNamespace('o', self::OXML_NAMESPACE);
162+
$sheetName = $xpath->evaluate("normalize-space(/o:workbook/o:sheets/o:sheet[$sheetNumber][1]/@name)");
163+
return is_string($sheetName) ? $sheetName : null;
164+
}
165+
140166
private static function getWorksheetPath(int $sheetNumber): string
141167
{
142168
return "xl/worksheets/sheet{$sheetNumber}.xml";

tests/test.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
try {
1616
$xlsxFastEditor = new XlsxFastEditor(__DIR__ . '/_copy.xlsx');
1717

18+
assert($xlsxFastEditor->getWorksheetCount() === 2);
19+
1820
$sheet1 = $xlsxFastEditor->getWorksheetNumber('Sheet1');
1921
assert($sheet1 === 1);
2022

@@ -28,6 +30,7 @@
2830

2931
$sheet2 = $xlsxFastEditor->getWorksheetNumber('Sheet2');
3032
assert($sheet2 === 2);
33+
assert($xlsxFastEditor->getWorksheetName($sheet2) === 'Sheet2');
3134

3235
assert($xlsxFastEditor->readFormula($sheet2, 'c2') === '=Sheet1!C2*2');
3336
assert($xlsxFastEditor->readFloat($sheet2, 'D2') === 3.14159 * 2);

0 commit comments

Comments
 (0)