Commit Graph

2356 Commits

Author SHA1 Message Date
Adrien Crivelli c725128a68
CSV writer also use common code to open file 2020-05-17 18:58:32 +09:00
Adrien Crivelli 5f413b8a58
Keep sample bootstrap purely in samples 2020-05-17 18:51:13 +09:00
Adrien Crivelli cfb8b2f9e3
Use current PHPUnit configuration xsd 2020-05-17 18:38:49 +09:00
Adrien Crivelli e868e58d20
Allow to run an entire folder of tests
We now can do something like:

```sh
./vendor/bin/phpunit tests/PhpSpreadsheetTests/Reader/
```
2020-05-17 18:35:55 +09:00
oleibman 7517cdd008
Improve Coverage for CSV (#1475)
I believe that both CSV Reader and Writer are 100% covered now.

There were some errors uncovered during development.

The reader specifically permits encodings other than UTF-8 to be used.
However, fgetcsv will not properly handle other encodings.
I tried replacing it with fgets/iconv/strgetcsv, but that could not
handle line breaks within a cell, even for UTF-8.
This is, I'm sure, a very rare use case.
I eventually handled it by using php://memory to hold the translated
file contents for non-UTF8. There were no tests for this situation,
and now there are (probably too many).

"Contiguous" read was not handle correctly. There is a file
in samples which uses it. It was designed to read a large sheet,
and split it into three. The first sheet was corrrect, but the
second and third were almost entirely empty. This has been corrected,
and the sample code was adapted into a formal test with assertions
to confirm that it works as designed.

I made a minor documentation change. Unlike HTML, where you never
need a BOM because you can declare the encoding in the file,
a CSV with non-ASCII characters must explicitly include a BOM
for Excel to handle it correctly. This was explained in the Reading CSV
section, but was glossed over in the Writing CSV section, which I
have updated.
2020-05-17 18:15:18 +09:00
drewblin 3090c1e73f
Support CSV files with data wrapping a lot of lines
If there is "line" splited on lot of lines we can reach limit of recursion
nesting. It's better to use while instead of recursion.

Closes #1468
2020-05-17 17:58:08 +09:00
Benedikt Franke c4931de1f9
Limit composer package to `src/`
While there is value in providing those, they also clutter IDE auto-complete feature.
Now they users can opt-in to download them via `--prefer-source` flag.

Closes #908
Closes #1424
2020-05-17 12:47:55 +09:00
Tomas Votruba bc101dafbc
README - add link to migration path to show people easier way (#1460) 2020-05-16 20:40:36 +09:00
Adrien Crivelli 7e79782dae
Remove @throws comment
Those are extremely hard to maintain properly and bring almost
no value, especially if they are outdated
2020-05-16 20:33:25 +09:00
Adrien Crivelli 6579551954
Update CHANGELOG 2020-05-16 20:27:47 +09:00
Adrien Crivelli 8967696095
Merge pull request #1292 from basbl/write-to-stream-support
Support writing to resource handles in all IWriter implementations
2020-05-16 20:25:53 +09:00
Adrien Crivelli e34535329d
Remove obsolete arguments 2020-05-16 20:25:01 +09:00
Adrien Crivelli fcf7820467
All writers can write to stream 2020-05-16 20:12:28 +09:00
Adrien Crivelli 9cdbddf3bf
Early bail out if resource cannot be opened 2020-05-16 18:08:10 +09:00
Adrien Crivelli 4b5c922731
Follow redirect to download phpDocumentor 2020-05-02 21:45:11 +09:00
Adrien Crivelli 925fafdecf
Placeholder for new changelog 2020-05-02 12:35:42 +09:00
Adrien Crivelli 588ca6beb3
Replace migration tool with RectorPHP
Fixes #1445
2020-05-02 12:34:50 +09:00
oleibman 1861412d60
Merge pull request #1 from PHPOffice/master
Resync with base project
2020-04-27 22:04:30 -07:00
basbl b60b1d25c0
Test scrutinizer 2020-04-27 21:48:56 +02:00
basbl 11499aad9a
Add resource parameter handling to html, csv and xls writers 2020-04-27 21:26:55 +02:00
basbl ccb49de301
Add support for streaming zip files in the xlsx and ods writers 2020-04-27 21:26:55 +02:00
basbl 1bcdf15533
Add maennchen/zipstream-php dependency
The built-in ZipArchive class does not have the ability
to accept streams. This means that we would always have to
write the zip to disk. The ZipStream library does offer
support for writing to streams.
2020-04-27 21:26:54 +02:00
Adrien Crivelli 385b83362f
Keep PHPUnit result out of project 2020-04-27 21:16:53 +09:00
Adrien Crivelli b07cd2028d
Don't patch PHPUnit for phpcov 2020-04-27 20:21:07 +09:00
Adrien Crivelli f1a019e492
Upgrad PHP deps 2020-04-27 19:29:45 +09:00
Gennadiy Litvinyuk a7986520f9
Removed unnecessary object creation. (#1430) 2020-04-27 12:02:49 +02:00
Collie-IT 973011921d
Add Missing Operator NOTBETWEEN (#1390) 2020-04-27 12:01:36 +02:00
Adrien Crivelli 03c587fe0b
Drop PHP 7.1
This is according to our formal, published, policy to only support
eol PHP after 6 months.

See https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support
2020-04-27 18:42:32 +09:00
Adrien Crivelli 8ea48ecb40
Run code style and coverage with PHP 7.4 2020-04-27 18:33:44 +09:00
Adrien Crivelli 4e6d6838e0
Deploy doc only when tags on master 2020-04-27 18:29:05 +09:00
Adrien Crivelli b1a7863485
Force doc deploy just for this once 2020-04-27 18:27:45 +09:00
Adrien Crivelli f79611d6dc
1.12.0 2020-04-27 17:12:48 +09:00
n-longcape f9f9f4cacf
Fix ROUNDUP and ROUNDDOWN for negative number
Closes #1417
2020-04-27 17:03:07 +09:00
bbinotto e2f87e8b7a
Load with styles should not default to black fill color
Fixes #1353
Closes #1361
2020-04-26 22:33:30 +09:00
Paul Kievits a6c56d0f81
Added support for the FLOOR.MATH and FLOOR.PRECISE functions 2020-04-26 22:19:33 +09:00
Owen Leibman c4895b9468
MATCH with a static array should return the position of the found value based on the values submitted.
Returns #N/A, unless the element searched for is at the end of the array.

The problem is in Calculation.php line 4231:
                    if (!is_array($functionCall)) {
                        foreach ($args as &$arg) {
                            $arg = Functions::flattenSingleValue($arg);
                        }
                        unset($arg);
                    }

I believe this code is intended to handle functions where PhpSpreadsheet just passes
the call on to PHP without implementing the code on its own, e.g. for atan or acos.
In the bug report, the following code fails:
  $flat_rate = "=MATCH(6,{4,5,6,2}, 0)";
  $sheet->getCell('A1')->setValue($flat_rate);
The expected value is 3, but the actual result is "#N/A".
The reason for this result is that the parser replaces the braces with calls
to the MKMATRIX internal function, whose value for functioncall was:
'self::MKMATRIX'. Since this isn't an array, the flattening code is executed,
and the unintended result occurs. The fix is to change the definition for
functioncall in that case to [__CLASS__, 'mkMatrix'], avoiding the flattening.

However, there is also another part to this bug. The flattening should be
returning the first entry in the array, but is in fact returning the last.
This explains why the bug report specified "unless ... end of the array".
I confirmed that Excel does use the first item in the array rather than the last,
e.g. =atan({1,2,3}) entered into a cell will return atan(1), not atan(3).
The problem here is that flattenSingleValue, which says in its comments that
it is supposed to be returning the first item, uses array_pop rather than array_shift.
I have changed that as well. The same mistake was also present in
Cell.php function getCalculatedValue. The correct behavior can be verified
by entering =minverse({-2.5,1.5;2,-1}) into an Excel cell'
Excel flattens the result ({2,3;4,5}) to 2, and so should PhpSpreadsheet.

Fixes #1271
Closes #1332
2020-04-26 22:09:31 +09:00
Jon Dufresne 6788869a40
Fix typo: occured → occurred (#1435) 2020-04-26 21:09:56 +09:00
Tim Gavryutenko 3dcc5ca753
Fix removing last row incorrect behavior
`$highestRow = $this->getHighestDataRow();` was calculated after `$this->getCellCollection()->removeRow($pRow + $r);` - this is the root reason for incorrect rows removal because removing last row will change '$this->getHighestDataRow()' value, but removing row from the middle will not change it. So, removing last row causes incorrect `$highestRow` value that is used for wiping out empty rows from the bottom of the table:
```php
for ($r = 0; $r < $pNumRows; ++$r) {
    $this->getCellCollection()->removeRow($highestRow);
    --$highestRow;
}
```
To prevent this incorrect behavior I've moved highest row calculation before row removal.
But this still doesn't solve another problem when trying remove non existing rows: in this case the code above will remove `$pNumRows` rows from below of the table, e.g. if `$highestRow=4` and `$pNumRows=6`, than rows 4, 3, 2, 1, 0, -1 will be deleted. Obviously, this is not good, that is why I've added `$removedRowsCounter` to fix this issue.
And finally, moved Exception to early if statement to get away from unnecessary 'if-else'.

Fixes #1364
Closes #1365
2020-04-26 11:00:43 +09:00
Adrien Crivelli 6e76d4e8b5
Cleanup CHANGELOG accidental changes 2020-04-26 10:24:14 +09:00
Matthijs Alles 87f71e1930 Support whitespaces in CSS style in Xlsx
Indentation in the xml leaves spaces in style string even after
replacing newlines. Replacing the spaces ensures no spaces in keys
of the resulting style-array

Fixes #1347
2020-04-05 19:50:57 +09:00
Adrien Crivelli 57c36e01d5
Replace Sami with phpDocumentor 3
Because Sami is deprecated and now raise errors. We lose API
docs for multiple versions but we still have latest version with low
maintenance cost.
2020-04-05 17:47:25 +09:00
Adrien Crivelli 5daa38f456
Add missing sections 2020-03-07 21:04:37 +07:00
youkan a79b344d53
Fix ROUNDUP and ROUNDDOWN for floating-point rounding error (#1404)
Closes #1404
2020-03-07 12:48:54 +07:00
Paul Kievits a08415a7b5 Improved the ARABIC function to handle short-form roman numerals 2020-03-07 12:43:59 +07:00
Adrien Crivelli 560e672b30
Merge pull request #1385 from ikeyan/feature/update-document
Update docs/references/function-list-by-*.md
2020-03-07 09:25:16 +07:00
Marius 50d78ce789 update doc on how to run the migrate tool
as per this https://stackoverflow.com/questions/53215313/phpspreadsheet-how-do-i-use-auto-migration-tool clarify how to run the tool
2020-03-07 09:20:30 +07:00
Adrien Crivelli c2a205e82f
1.10.1 2020-03-02 20:09:03 +07:00
Claas Augner ffb0d21cec PHPDoc: use @return $this for fluent methods
Fluent methods, especially setters, return the object on which are
called. This is documented in PHPDoc using the `$this` keyword, which
is equivalent to `static` with the additional notion of object identity.
This helps IDEs and static analysis tools provide more meaningful output.
2020-03-02 19:11:00 +07:00
Stronati Andrea 9f5a472426 Fix XLSX file loading with autofilter containing '$'
The `setRange` method of the `Xlsx/AutoFilter` class expects a filter
range format like "A1:E10". The returned value from
`$this->worksheetXml->autoFilter['ref']` could contain "$" and returning
a value like "$A$1:$E$10".

Fixes #687
Fixes #1325
Closes #1326
2020-03-02 18:43:27 +07:00
Owen Leibman fb379385e0
Fix active cell when freeze pane is used
When freeze pane is in use on a worksheet, PhpSpreadsheet saves to Xlsx in such
a way that the active cell is always set to the top left cell below the freeze
pane. I find it difficult to understand why:

  1. You have given users the setSelectedCells function, but then choose to
     ignore it.
  2. Excel itself does not act in this manner.
  3. PHPExcel did not act in this manner.
  4. PhpSpreadsheet when writing to Xls does not act in this manner.
     This is especially emphasized because the one test in FreezePaneTest which
     would expose the difference is the only test in that member which is
     not made for both Xls and Xlsx.
  5. It is *really* useful to be able to open a spreadsheet anywhere, even when
     it has header rows.

Closes #1323
2020-03-02 18:11:37 +07:00