Commit Graph

1998 Commits

Author SHA1 Message Date
zhukoff74 c8fc2863e3 Improve ArrayTest structure and readability 2025-12-02 21:09:08 +03:00
oleibman ac5ce66274 Merge pull request #4727 from oleibman/codeunicode
CODE/UNICODE and CHAR/UNICHAR
2025-12-02 07:03:53 +00:00
zhukoff74 461baaff65 Two tests have been rewritten to use modern PHPUnit style. 2025-12-02 00:06:43 +03:00
oleibman edd28628f3 Typos in Test Comments 2025-12-01 11:00:23 -08:00
oleibman 5c504ac4ce MACROMAN Charset is on My System, but not Github's - Try MAC Instead 2025-11-28 18:15:10 -08:00
oleibman b243f2f4e5 CODE/UNICODE and CHAR/UNICHAR
PhpSpreadsheet treats CODE and UNICODE as equivalent, likewise for CHAR and UNICHAR. They are, in fact, different. CODE and CHAR deal only with single-byte character sets (Windows-1252 or MacRoman), while UNICODE and UNICHAR deal with all of Unicode. This PR separates them. The existing unit test for CODE was, in many cases, applicable to UNICODE (for which there was no separate test). The tests are corrected for CODE, new tests are added, and a separate test for UNICODE is added. CHAR was mostly okay, new tests are added, and a separate test for UNICHAR is added.
2025-11-28 13:21:27 -08:00
oleibman aa719cdb02 Merge branch 'master' into explicit 2025-11-21 16:57:24 -08:00
oleibman 78190ffdb6 Prepare to Deprecate Optionality of Second Arg to Cell::setValueExplicit
In PR #4716, @RobinvanderVliet points out that Cell::setValueExplicit and Worksheet::setCellValueExplicit are strangely inconsistent, where the latter requires you to specify a DataType but the former does not. The fix in that PR is to make the latter offer a default DataType rather than requiring the parameter. While that does eliminate inconsistency, I think it does so in the wrong direction - the solution should be to eliminate the optionality in the former - an implicit value for setValueExplicit just doesn't make sense. We can't do that without a breaking change, which this is not. However, we can update the doc-block and change log to indicate our intention to make that change in the next breaking release.
2025-11-21 00:12:07 -08:00
Robin van der Vliet 122b36b09f Implement missing BAHTTEXT function 2025-11-16 18:02:10 +01:00
oleibman ee2d4e8e39 Merge pull request #4711 from oleibman/printarea
Limited PrintArea Support for Html/Pdf
2025-11-14 06:17:44 +00:00
oleibman dcf475eec1 Merge pull request #4713 from oleibman/calcvalue
Use `calculateFormula` Rather Than `_calculateFormulaValue` in Tests
2025-11-14 05:37:48 +00:00
oleibman 55098edf99 Minor Touchup 2025-11-13 21:07:19 -08:00
oleibman 70b4ecd4d3 Use calculateFormula Rather Than _calculateFormulaValue in Tests
They aren't quite interchangeable. Both are used in the test suite, with no indication of why one or the other. I think we'd be best off being consistent. Based on the names, I think `_calculateFormulaValue` was intended as a private, or at least internal, method, so favor `calculateFormula`. I do not intend to rename or re-categorize `_calculateFormulaValue`, just remove its usage when it isn't clearly warranted.
2025-11-13 20:48:46 -08:00
Robin van der Vliet 70802fafe6 Add another test 2025-11-13 20:43:41 +01:00
Robin van der Vliet 07d68b3bc8 Add support for remaining types 2025-11-13 19:03:21 +01:00
Robin van der Vliet 536c63e100 Implement ìnfoSupported 2025-11-12 18:15:11 +01:00
oleibman ed00f8e14f Limited PrintArea Support for Html/Pdf
Fix #3941. Html and Pdf Writers will show PrintArea if specified rather than the entire sheet. Html Writer, which needs to handle both screen and print views, will use PrintArea through CSS; PDF, which needs to handle only print view, will use it by not including rows and columns which are not in the PrintArea. The support is limited because:
- PrintArea can consist of several different ranges. The writers will use the PrintArea only if it consists of a single range.
- Html use will be effective only if `useInlineCSS` is set to `false`, which is its default value.
- Other aspects of page setup, e.g. horizontal centered, remain unsupported, with or without PrintArea.

Html Writer will also set a `data-printarea` attribute on the `table` declaration for a worksheet when appropriate. Html Reader will recognize and process that attribute. This usage does not require that the PrintArea consist of a single range.
2025-11-11 22:28:41 -08:00
Robin van der Vliet 99d24e2b6b Remove unused imports 2025-11-11 23:35:01 +01:00
Robin van der Vliet ec9d343e8a Remove test for unimplemented function, because it is implemented now 2025-11-11 23:29:19 +01:00
Robin van der Vliet e929a94ef6 Fix tests 2025-11-11 23:17:46 +01:00
Robin van der Vliet e18bf2a2ef Fix tests 2025-11-10 22:45:43 +01:00
Robin van der Vliet 4fd2f4d551 Fix issues 2025-11-10 22:00:38 +01:00
Robin van der Vliet 92a3bb8a9e Fix issues 2025-11-10 21:54:17 +01:00
Robin van der Vliet e9ec166018 Add tests 2025-11-10 21:50:15 +01:00
Robin van der Vliet 603b92e827 Fix lots of typos throughout codebase 2025-11-09 17:10:55 +01:00
oleibman 2bc326bb16 Merge branch 'master' into issue4695 2025-11-07 08:28:30 -08:00
oleibman c944b1a162 Merge pull request #4697 from oleibman/issue4696
Unexpected Exception in Php DateTime
2025-11-02 07:02:47 +00:00
oleibman 938ba72eb1 Coverage Tweak 2025-11-01 23:39:14 -07:00
oleibman f1562c967b Protected Ranges and Insert/Delete Columns/Rows
Fix #4695. PhpSpreadsheet has assumed that each Protected Range on a Worksheet is defined in the Xml using a single range. However, Excel itself will often combine ranges together. So, in the xml for the spreadsheet supplied with the issue, we see:
```xml
<protectedRange name="Champs_non_bloqués_2" sqref="B2:D4 J2:L4 F2:H4"/>
```

When inserting or deleting rows or columns, ReferenceHelper is used to adjust (among other things) Protected Ranges. The existing code (probably) works well enough if there is only one range in `sqref`, but fails to parse correctly and throws an Exception when there is more than one. It is replaced with a fairly straightforward manner of updating when rows/columns are inserted, and a slightly more convoluted manner of updating when rows/columns are deleted.
2025-11-01 21:58:23 -07:00
oleibman e88eaa6d95 Upgrade Phpstan
Too many new errors when Dependabot tried to upgrade.
2025-11-01 07:12:39 -07:00
oleibman b9857e4804 AutoFilter Exposures 2025-10-31 10:12:17 -07:00
oleibman f713b52b6d Additional Affected Functions 2025-10-31 00:36:24 -07:00
oleibman 57985fde8e Unexpected Exception in Php DateTime
Fix #4696. Fix #917 (which had gone stale but is now reopened). Fix #916. People were receiving unexpected exceptions calling `Date::isDateTime($cell)`. 916 and 917 had been mostly resolved long ago by adding a numeric check on the contents of $cell. However, it turns out that the use of values with very large absolute values can cause Php DateTime to throw an exception, which is the problem with 4696, when it calls `Date::toExcelDateTimeObject` for a cell with a large integer value.

`Date::toExcelDateTimeObject` is coded to return a Php DateTime object. I don't see any reasonable non-breaking fix for that. People can always add try/catch if they are worried about that. However, `Date::isDateTime` can add an additional check and return `false` if this situation occurs. All 3 of the issues resolved by this PR mention isDateTime in their discussion; they are all fixed without additional coding changes by this.

An additional change is needed for `Cell::getFormattedValue` to avoid this problem. This is fixed in `Style::NumberFormatter::DateFormatter::format`.
2025-10-30 18:05:54 -07:00
oleibman 030ece8666 Merge branch 'master' into listdimensions 2025-10-23 17:36:09 -07:00
oleibman 02090c1d3f Another Test 2025-10-23 17:07:26 -07:00
oleibman d5b9ba68e2 New Tests 2025-10-23 12:18:59 -07:00
oleibman ee03c0a467 Add Some Coverage 2025-10-21 09:58:26 -07:00
oleibman c3a78e480d Xls Reader ListWorksheetInfo and New ListWorksheetDimensions
PR #4687 corrected how Xls Writer generated its Dimensions records. We ignore the Dimensions record on read since it does not affect our processing in the slightest. However, the PR raises the possibility that someone might wish to see the data in the Dimensions record. (The PR did an adequate test for retrieving Dimensions data, but it is not generalizable.) To accommodate such a case, we add a new ListWorksheetDimensions function to Xls Reader, similar to ListWorksheetInfo. As luck would have it, the spreadsheet with which I tested the new function produced incorrect results for ListWorksheetInfo, which was ignoring XLS_TYPE_MULRK records. So I added the necessary code to fix ListWorksheetInfo as well.
2025-10-21 07:12:20 -07:00
Nebojša Zlatanović adde74b4e6 Fix DIMENSIONS record to use 0-based indices for both rows AND columns
The initial fix only converted column indices to 0-based, but overlooked
that row indices also need the same treatment per BIFF8 specification.

Changes:
- Convert firstRowIndex from 1-based to 0-based (subtract 1)
- Convert lastRowIndex from 1-based to 0-based (subtract 1)
- Update row capping logic for 65536 limit
- Fix test assertions to expect rwMic=0 and rwMac=5 (not 1 and 6)
- Enhanced documentation to clarify all DIMENSIONS indices are 0-based

This now matches the behavior observed in Excel-generated XLS files,
where a file with 3 rows × 5 columns shows: rwMic=0, rwMac=3, colMic=0, colMac=5

All tests pass (53 tests, 244 assertions).
2025-10-20 09:07:39 +02:00
Nebojša Zlatanović f2ea8b6cb9 Fix PHPStan type safety issues in DimensionsRecordTest
Add proper type assertions to handle potential false returns:
- Assert file_get_contents() returns string, not false
- Assert strpos() returns int, not false
- Assert unpack() returns array, not false

This resolves all 7 PHPStan errors reported in CI while maintaining
test functionality (12 assertions, all passing).
2025-10-17 13:35:12 +02:00
Nebojša Zlatanović b9857e53d5 Improve DIMENSIONS record fix with better code coverage and unit tests
This commit refines the BIFF8 DIMENSIONS record fix by:

1. **Optimized column index capping**: Replaced the if-statement with min()
   function to ensure lastColumnIndex never exceeds 255, improving code
   coverage and eliminating unreachable branches in unit tests.

2. **Added comprehensive unit tests**: Created DimensionsRecordTest.php which
   directly parses the binary DIMENSIONS record (0x0200) from XLS files to
   verify correct 0-based column indices.

The tests validate:
- colMic (first column) = 0 for column A (was incorrectly 1 before fix)
- colMac (last column + 1) uses proper 0-based indexing
- Column indices are correctly capped at 255 (BIFF8 limit)

These tests fail without the fix and pass with it, ensuring the DIMENSIONS
record is correctly written for compatibility with legacy XLS parsers that
expect 0-based column indices per the BIFF8 specification.
2025-10-17 13:26:55 +02:00
oleibman fba2a43c8c Merge branch 'master' into issue4673 2025-10-12 15:21:52 -07:00
oleibman b5ba4ffa24 Merge pull request #4655 from oleibman/issue850
Better Support For Style Alignment Read Order
2025-10-11 19:26:32 +00:00
oleibman d52dbaa632 Merge pull request #4666 from oleibman/tcpdfnodie
Offer Tcpdf Interface Which Throws Exception Rather than Die
2025-10-11 18:47:10 +00:00
oleibman 7c9f42e9ea Merge pull request #4676 from oziriemeka/fix/4505-vml-namespace
Xlsx: register x and o namespaces for VML shapes; add test for #4505
2025-10-11 18:38:00 +00:00
oleibman db1aba6554 Better Sample File 2025-10-09 08:19:12 -07:00
karrakoliko b8687edd53 fix: do not trigger Undefined array key "x" 2025-10-04 16:15:27 +07:00
Emeka Oziri 8fcde62db6 Xlsx: register x and o namespaces for VML shapes; add test for #4505
Fixes SimpleXMLElement::xpath(): Undefined namespace prefix when reading VML comments/shapes by registering x: (Excel) and o: (Office) namespaces alongside v:.

Includes:
- tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4505Test.php
- tests/data/Reader/XLSX/issue.4505.xlsx

Refs: https://github.com/PHPOffice/PhpSpreadsheet/issues/4505
2025-10-03 23:37:56 +01:00
oleibman 08a6e7549f More Sophisticated Workbook Password Algorithms (Xlsx only)
Fix #4673. Our password hasher can handle different algorithms, but the workbook password (for maintaining the structure of the workbook, not for encrypting the entire workbook) currently supports only the single algorithm that was in place many years ago. Expand it, and Xlsx Reader and Writer, to be able to use, say, SHA-512, which is what Excel itself uses.

The revisions password needs to be expanded in the same way as the workbook password. It is used for file sharing, but MS has deprecated it because it feels that modern technologies introduce better ways to accomplish what it was needed for. You'll need to look pretty hard to even find it in Excel - it's not, for example, on any of the ribbons. Nevertheless, the solution here is pretty much identical to the solution for the workbook password, so I am fixing it at the same time.
2025-10-03 13:07:36 -07:00
oleibman b1c5c64060 Tweak 2025-09-30 07:33:04 -07:00