Skip to content

Commit 95cf51b

Browse files
committed
Modify the general settings ExcelCalendar to be simply a default, Create a new ExcelCalendar property for Spreadsheets, and modify the Xlsx and Xls Readers/Writers to maintain 1900 or 1904 calendar against the spreadsheet
1 parent 08849a7 commit 95cf51b

File tree

6 files changed

+49
-12
lines changed

6 files changed

+49
-12
lines changed

src/PhpSpreadsheet/Reader/Xls.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2026,9 +2026,9 @@ private function readDateMode(): void
20262026
$this->pos += 4 + $length;
20272027

20282028
// offset: 0; size: 2; 0 = base 1900, 1 = base 1904
2029-
Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
2029+
$this->spreadsheet->setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
20302030
if (ord($recordData[0]) == 1) {
2031-
Date::setExcelCalendar(Date::CALENDAR_MAC_1904);
2031+
$this->spreadsheet->setExcelCalendar(Date::CALENDAR_MAC_1904);
20322032
}
20332033
}
20342034

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,11 +681,11 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
681681

682682
// Set base date
683683
if ($xmlWorkbookNS->workbookPr) {
684-
Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
684+
$excel->setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
685685
$attrs1904 = self::getAttributes($xmlWorkbookNS->workbookPr);
686686
if (isset($attrs1904['date1904'])) {
687687
if (self::boolean((string) $attrs1904['date1904'])) {
688-
Date::setExcelCalendar(Date::CALENDAR_MAC_1904);
688+
$excel->setExcelCalendar(Date::CALENDAR_MAC_1904);
689689
}
690690
}
691691
}

src/PhpSpreadsheet/Shared/Date.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class Date
6767
protected static $defaultTimeZone;
6868

6969
/**
70-
* Set the Excel calendar (Windows 1900 or Mac 1904).
70+
* Set the Excel Default Calendar (Windows 1900 or Mac 1904).
7171
*
7272
* @param int $baseYear Excel base date (1900 or 1904)
7373
*
@@ -85,7 +85,7 @@ public static function setExcelCalendar($baseYear)
8585
}
8686

8787
/**
88-
* Return the Excel calendar (Windows 1900 or Mac 1904).
88+
* Return the Excel Default Calendar (Windows 1900 or Mac 1904).
8989
*
9090
* @return int Excel base date (1900 or 1904)
9191
*/

src/PhpSpreadsheet/Spreadsheet.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PhpOffice\PhpSpreadsheet;
44

55
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
6+
use PhpOffice\PhpSpreadsheet\Shared\Date;
67
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
78
use PhpOffice\PhpSpreadsheet\Style\Style;
89
use PhpOffice\PhpSpreadsheet\Worksheet\Iterator;
@@ -52,6 +53,14 @@ class Spreadsheet
5253
*/
5354
private $workSheetCollection = [];
5455

56+
/**
57+
* Base calendar year to use for calculations
58+
* Value is either CALENDAR_WINDOWS_1900 (1900) or CALENDAR_MAC_1904 (1904).
59+
*
60+
* @var int
61+
*/
62+
protected $excelCalendar = Date::CALENDAR_WINDOWS_1900;
63+
5564
/**
5665
* Calculation Engine.
5766
*
@@ -199,6 +208,34 @@ class Spreadsheet
199208
*/
200209
private $tabRatio = 600;
201210

211+
/**
212+
* Set the Excel Calendar (Windows 1900 or Mac 1904).
213+
*
214+
* @param int $baseYear Excel base date (1900 or 1904)
215+
*
216+
* @return bool Success or failure
217+
*/
218+
public function setExcelCalendar(int $baseYear): bool
219+
{
220+
if (($baseYear == Date::CALENDAR_WINDOWS_1900) || ($baseYear == Date::CALENDAR_MAC_1904)) {
221+
$this->excelCalendar = $baseYear;
222+
223+
return true;
224+
}
225+
226+
return false;
227+
}
228+
229+
/**
230+
* Return the Excel Calendar (Windows 1900 or Mac 1904).
231+
*
232+
* @return int Excel base date (1900 or 1904)
233+
*/
234+
public function getExcelCalendar(): int
235+
{
236+
return $this->excelCalendar;
237+
}
238+
202239
/**
203240
* The workbook has macros ?
204241
*

src/PhpSpreadsheet/Writer/Xls/Workbook.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -960,9 +960,9 @@ private function writeDateMode(): void
960960
$record = 0x0022; // Record identifier
961961
$length = 0x0002; // Bytes to follow
962962

963-
$f1904 = (Date::getExcelCalendar() === Date::CALENDAR_MAC_1904)
964-
? 1
965-
: 0; // Flag for 1904 date system
963+
$f1904 = ($this->spreadsheet->getExcelCalendar() === Date::CALENDAR_MAC_1904)
964+
? 1 // Flag for 1904 date system
965+
: 0; // Flag for 1900 date system
966966

967967
$header = pack('vv', $record, $length);
968968
$data = pack('v', $f1904);

src/PhpSpreadsheet/Writer/Xlsx/Workbook.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function writeWorkbook(Spreadsheet $spreadsheet, $recalcRequired = false)
3939
$this->writeFileVersion($objWriter);
4040

4141
// workbookPr
42-
$this->writeWorkbookPr($objWriter);
42+
$this->writeWorkbookPr($objWriter, $spreadsheet);
4343

4444
// workbookProtection
4545
$this->writeWorkbookProtection($objWriter, $spreadsheet);
@@ -80,11 +80,11 @@ private function writeFileVersion(XMLWriter $objWriter): void
8080
/**
8181
* Write WorkbookPr.
8282
*/
83-
private function writeWorkbookPr(XMLWriter $objWriter): void
83+
private function writeWorkbookPr(XMLWriter $objWriter, Spreadsheet $spreadsheet): void
8484
{
8585
$objWriter->startElement('workbookPr');
8686

87-
if (Date::getExcelCalendar() === Date::CALENDAR_MAC_1904) {
87+
if ($spreadsheet->getExcelCalendar() === Date::CALENDAR_MAC_1904) {
8888
$objWriter->writeAttribute('date1904', '1');
8989
}
9090

0 commit comments

Comments
 (0)