This is:
- [ X]([url](url)) a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
I should be able to parse cells with line breaks.
The package throws and exception because there's a row with multiple cells with line breaks. When I remove the row with line breaks it starts working again.
[2023-03-20 19:19:18] local.ERROR: Could not find zip member zip:///tmp/phpANFbmg#_rels/.rels {"userId":3,"exception":"[object] (PhpOffice\PhpSpreadsheet\Reader\Exception(code: 0): Could not find zip member zip:///tmp/phpANFbmg#_rels/.rels at /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php:159)
[stacktrace]
#0 /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php(408): PhpOffice\PhpSpreadsheet\Shared\File::assertFile()
#1 /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php(166): PhpOffice\PhpSpreadsheet\Reader\Xlsx->loadSpreadsheetFromFile()
#2 /var/www/html/app/Utils/Util.php(382): PhpOffice\PhpSpreadsheet\Reader\BaseReader->load()
Try uploading the attached XLSX file. I don't believe there's a problem with the file or the code, the package just can't parse the cell with line breaks.
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
<?php
require __DIR__ . '/vendor/autoload.php';
// Create new Spreadsheet object
$reader = PhpExcel::createReader('Xlsx');
$spreadsheet = $reader->load($file);
If this is an issue with reading a specific spreadsheet file, then it may be appropriate to provide a sample file that demonstrates the problem; but please keep it as small as possible, and sanitize any confidential information before uploading.
PHP 8.1.16
phpoffice/phpspreadsheet * 1.25.2
This is:
- [x] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Should copy Charts if there exists.
Error during generation if the graph is based on random rows.:
PhpOffice\PhpSpreadsheet\Calculation\Exception
Formula Error: Unexpected ,
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
<?php
require __DIR__ . '/vendor/autoload.php';
$inputFileType = 'Xlsx';
$inputFileName = 'Graph.xlsx';
$reader = IOFactory::createReader($inputFileType);
$reader->setIncludeCharts(true);
$spreadsheet = $reader->load($inputFileName);
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->setIncludeCharts(true);
$writer->save('output.xslx');
If this is an issue with reading a specific spreadsheet file, then it may be appropriate to provide a sample file that demonstrates the problem; but please keep it as small as possible, and sanitize any confidential information before uploading.
This template works
https://ufile.io/3pkwv0xz
This template is not working
https://ufile.io/gktlbr4j
This is:
- [X] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Cell references and formula in Chart definitions should be updated on insert/delete of rows/columns.
Cell references and formula in Chart definitions are not updated on insert/delete of rows/columns.
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
<?php
require __DIR__ . '/vendor/autoload.php';
// Create new Spreadsheet object
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// add code that show the issue here...
If this is an issue with reading a specific spreadsheet file, then it may be appropriate to provide a sample file that demonstrates the problem; but please keep it as small as possible, and sanitize any confidential information before uploading.
Xlsx (the only format that supports Charts at present)
All
This is:
- [x] a bug report
This code is not calculating formulas with read filters. If I change $chunk_read_filter->setRows(1500, 3000); to $chunk_read_filter->setRows(1, 3000); it works. It need to calculate formulas with the range. My all formulas are in range and within same row.
Not calculating formulas correctly with read filters applied.
Below is usage code
<?php
...
public function test()
{
//This file is attached below
$file_path = storage_path('app/import/test-files/Test Template 2- TotalRecord 10000.xlsx');
//This class code is below
$chunk_read_filter = new ChunkReadFilter();
$chunk_read_filter->setRows(1500, 3000);
$reader = IOFactory::createReaderForFile($file_path);
$reader->setReadFilter($chunk_read_filter);
$reader->setReadDataOnly(true);
$reader->setReadEmptyCells(false);
$spreadsheet = $reader->load($file_path)->getActiveSheet();
$header_row = $spreadsheet->rangeToArray("A1500:" . $spreadsheet->getHighestColumn() . "3000");
//Print or echo or dd or var_dump or return view etc...
return view('test', ['content' => json_encode($header_row)]);
}
...
ChunkReadFilter.PHP
<?php
namespace App\Helpers;
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter;
class ChunkReadFilter implements IReadFilter
{
private $startRow = 0;
private $endRow = 0;
/** Set the list of rows that we want to read */
public function setRows($startRow, $chunkSize)
{
$this->startRow = $startRow;
$this->endRow = $startRow + $chunkSize;
}
public function readCell($columnAddress, $row, $worksheetName = '')
{
if (($row == 1) || ($row >= $this->startRow && $row < $this->endRow)) {
return true;
}
return false;
}
}
PhpSpreadsheet: "1.27"
PHP: "8.2"
I am also attaching excel file
Test Template 2- TotalRecord 10000.xlsx
This is:
- [x] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Theme/scheme colors should be read as part of Xlsx Reader, and reproduced by Xlsx Writer.
Reader appears to ignore scheme colors. Writer appears to write theme file with hard-coded colors. As a result, the input and output files may differ in their coloring when scheme colors are used. This is especially noticeable in some charts (see PR #3476); I suspect, but am not certain, that other situations might also be affected.
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
After the PR identified above is merged, this behavior is demonstrated by sample 32readwriteLineChart6.
This is probably just a problem for Xlsx.
All.
This is:
- [ ] a bug report
- [x ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
PhpSpreadsheet should be able to read Strict Open XML-Worksheets (xlsx)
When trying to read a Strict Open XML-Worksheets (xlsx) file an Exception is thrown:
"message": "Unable to identify a reader for this file",
"exception": "PhpOffice\PhpSpreadsheet\Reader\Exception",
<= 1.3.1
This is:
- [X ] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
The docs indicate that there is a method entitled “setDiagonal()” but in searching the code base there is only setDiagonalDirection().
1.28.0
There appears to be a bug when applying a number format to a Style
instance when Style
was created with a CellAddress
instance that has got a Worksheet
instance defined.
Style
instance to be retrieved for further use.
An exception is thrown due to "Invalid cell coordinate". Stack trace is as follows:
PhpOffice\PhpSpreadsheet\Exception:
Invalid cell coordinate 'CLIENT ACCOUNTS'!N2
at vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php:42
at PhpOffice\PhpSpreadsheet\Cell\Coordinate::coordinateFromString('\'CLIENT ACCOUNTS\'!N2')
(vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php:218)
at PhpOffice\PhpSpreadsheet\Style\Style->applyFromArray(array('numberFormat' => array('formatCode' => 'yyyy/mm/dd;@')))
(vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php:186)
at (blah blah Symfony framework stuff here)
First create an instance of a CellAddress
class and specify its worksheet instance.
Then try to apply a number format to that cell by passing through the CellAddress
instance.
/** @var \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $worksheet */
$worksheet = ...;
// Make a `CellAddress` instance. This would usually be necessary for more complex iterators and such worksheet building code.
$cellAddress = new \PhpOffice\PhpSpreadsheet\Cell\CellAddress("A1", $worksheet);
// Grab a `Style` instance for that `CellAddress` to do whatever presentation necessary.
$style = $worksheet->getStyle($cellAddress);
// Crash here when applying a number format to the cell(s) in question.
$style->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
This problem does not occur if you omit the worksheet instance when building the CellAddress
instance, though you may need to reference the worksheet later.
Most likely Styles.
This happens when building a spreadsheet prior to a file save. We typically export as XLSX though I suspect this issue isn't related to the desired format of the resulting spreadsheet.
Tried on PhpSpreadsheet version 1.24.0. PHP version is 7.3 because "insert mundane project specific reasons here", though this issue doesn't appear to be related to the PHP version.
Looking through the same stack trace on the current version (1.28.0 at time of writing) the issue will occur here too as the relative code is unchanged.
At the deepest point the issue occurs when \PhpOffice\PhpSpreadsheet\Cell\Coordinate::coordinateFromString()
tries to parse a cell address that contains a worksheet, e.g. "'CLIENT ACCOUNTS'!N2"
.
Looking up the stack trace there are a number of opportunities in which the worksheet name could be cut out of the cell address, and I'm probably not best placed to decide where this would be best done. Essentially the following needs to happen somewhere:
if (false !== ($worksheetNameMarker = strrpos($cellAddress, '!'))) {
$cellAddress = substr($cellAddress, $worksheetNameMarker + 1);
}
There are 2 reasonable places for this to happen:
\PhpOffice\PhpSpreadsheet\Cell\Coordinate::coordinateFromString()
: Immediately, before trying to parse the coordinate string.\PhpOffice\PhpSpreadsheet\Style\Style::applyFromArray()
: Just after retrieving the selected cells? Though using variable name $pRange
instead of $cellAddress
.$pRange = $this->getSelectedCells();
I suspect the 2nd point (Style::applyFromArray()
) would be most appropriate because Coordinate::coordinateFromString
is not even expecting a range of cells at this deep point. This function already iterates over the range of cells (if a range was provided), so if the specific worksheet part of the coordinate is no longer necessary this would be a good chance to cut it.
Whichever position, this would correct "'CLIENT ACCOUNTS'!N2"
to "N2"
and all continues to work as expected.
This is:
- [X] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
The Excel EOMONTH()
and EDATE()
functions should always return a float with the date, but with the time truncated to 0.
e.g.
EOMONTH(22269.75, 3)
should result in float22371.0
EDATE(22269.75, 2)
should result in float22331.0
If the dateValue
argument to EOMONTH()
includes a time, then the result also includes that time.
EOMONTH(22269.75, 3)
results in float22371.75
EDATE(22269.75, 2)
results in float22331.75
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
<?php
require __DIR__ . '/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Month;
$dateValue = 22269.75;
$adjustment = 3;
$result = Month::lastDay($dateValue, $adjustment);
var_dump($result); // Should be (float) 22371.0 but is (float) 22371.75
$dateValue = 22269.75;
$adjustment = 2;
$result = Month::adjust($dateValue, $adjustment);
var_dump($result); // Should be (float) 22331.0 but is (float) 22331.75
If this is an issue with reading a specific spreadsheet file, then it may be appropriate to provide a sample file that demonstrates the problem; but please keep it as small as possible, and sanitize any confidential information before uploading.
N/A
All
This is:
- [x] a bug report
- [x] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Assigning the parameter $dataSource for a DataSeriesValues to hardcode values '{0,350}'
It can be done directly in Excel ...
Add display on the scatterPlot as a vertical line ...
Receive the error "Cell coordinate string can not be a range of cells"
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
<?php
require __DIR__ . '/vendor/autoload.php';
// Create new Spreadsheet object
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// add code that show the issue here...
$dataSeriesLabels = [
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, '"X&Y"', null, 1),
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, '"Vertical Line"', null, 1),
];
$dataSeriesValues = [
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, $yValueRange, '#,##0', $dataCnt, null, 'circle', null, 5),
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, '{0,350}', '#,##0', 2, null, 'circle', null, 5),
];
$xAxisTickValues = [
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, $xValueRange, '#,##0', $dataCnt),
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, '{50,50}', '#,##0', 2),
];
If this is an issue with reading a specific spreadsheet file, then it may be appropriate to provide a sample file that demonstrates the problem; but please keep it as small as possible, and sanitize any confidential information before uploading.
Testing only in Xlsx
PhpSpreadsheet 1.28.0
PHP 8.1.3
This is:
- [x] a bug report
- [ ] a feature request
- [x] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Prior to version 1.26.0
calculating the value of a formula that contains a reference error (eg. =SUM(B1:#REF!)
) would result in a
[PhpOffice\PhpSpreadsheet\Calculation\Exception]
Worksheet!B4 -> Cell coordinate can not be zero-length string
From 1.26.0
until now (1.28.0
) the result is 0
instead of an exception.
<?php
require __DIR__ . '/vendor/autoload.php';
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
$worksheet->setCellValue('B4', '=SUM(B1:#REF!)');
// Throws Calculation\Exception when < 1.26.0
$value = $worksheet->getCell('B4')->getCalculatedValue();
// Returns 0 in 1.26.0+
\var_dump($value);
I have tested with .xlsx
, don't see why it wouldn't affect all other formats.
PHP 8.1.16
PHPSpreadsheet 1.26.0+ (until at least 1.28.0)
This is:
- [x] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Set default style to alignment to spreadsheet.
Ignoring default style. Its currently ignoring horizontal and vertical alignment. And also ignoring wrap property
It stoped working going from v1.27.0 to v1.28.0
<?php
require __DIR__ . '/vendor/autoload.php';
// Create new Spreadsheet object
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
'wrapText' => true,
],
];
$spreadsheet->getDefaultStyle()->applyFromArray($styleArray);
php 7.4.32
PhpSpreadsheet v1.27.0
This is:
- [x] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
The styles of the two files should be consistent.
Please provide a Minimal, Complete, and Verifiable example of code that exhibits the issue without relying on an external Excel file or a web server:
<?php
require './vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
$path = '/Users/anhoder/Desktop/a.xlsx';
$inputFileType = IOFactory::identify($path);
$objReader = IOFactory::createReader($inputFileType);
$objReader->setReadEmptyCells(false);
$sheet = $objReader->load($path);
$writer = IOFactory::createWriter($sheet, 'Xlsx');
$writer->save('/Users/anhoder/Desktop/b.xlsx');
Example files:
Xlsx
PHP 8.0.28 (cli)
phpoffice/phpspreadsheet: 1.28.0
This is:
- [*] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
The Excel function "NETWORKDAYS" outputs correctly in the Excel XLSX output
When using the function NETWORKDAYS in a cell, it is replaced with NETWORK_xlfn.DAYS
$ws->setCellValue($c.($keyrow+2),
"=NETWORKDAYS(".$c.$keyrow.",".$c.($keyrow+1).")");
Unsure as I only output XLSX format.
1.28.0
-- Note, I fixed this issue for myself (in a decidedly poor way) by modifying Writer/Xlsx/FunctionPrefix.php
I commented out one row in the file:
. '|csch'
# . '|days'
. '|dbcs'
The function addXlfnPrefix is being overly aggressive and while it may be correct to modify the "DAYS" function to be "_xlfn.DAYS" the preg_replace is also doing this to the "NETWORKDAYS" by converting it to "NETWORK_xlfn.DAYS" which it either (1) should not do or (2) should do it correctly.
My workaround is fine for my situation, but this will likely cause others problems as well.
This is:
- [ x] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Output styling should be the same format as the input
Styling is not preserved
<?php
require __DIR__ . '/vendor/autoload.php';
$reader = IOFactory::createReader('Xlsx');
$reader->setIncludeCharts(true);
$spreadsheet = $reader->load('ChartInput.xlsx');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->setIncludeCharts(true);
$writer->save('ChartOutput.xlsx');
?>
### Which versions of PhpSpreadsheet and PHP are affected?
## 1.16.0 - 2020-12-31
php --version
PHP 7.4.3 (cli) (built: Oct 6 2020 15:47:56) ( NTS )
This is:
[PhpOffice\PhpSpreadsheet\Writer\Exception]
Could not close zip file ...report.xlsx. (0)
..phpspreadsheet/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php:375
#0: PhpOffice\PhpSpreadsheet\Writer\Xlsx->save(string)
...cron.php:396
php5.6
php5-zip php5-gd php5-dom install
Tried Composer, it changed system settings and found lots of issues with php.ini. saying modules not found in ext folder but I visually found them.
Do not have enough time to fixing Composer issue.
why don't PhpSpreadsheet consider a version without Composer?
During HTML to Excel conversion, it is sometimes necessary to know what date type should be used :
<table>
<tr>
<!-- boolean data type -->
<td data-type="b">1</td>
<!-- string data type -->
<td data-type="s">12345678987654321</td>
<!-- formula data type -->
<td data-type="f">=CONCAT("TEXT A ","TEXT B")</td>
</tr>
</table>
Currently PhpSpreadsheet buffers the xlsx until it's written out to a stream which will be a problem if the generated dataset is very large.
Apache POI has a streaming implementation (https://poi.apache.org/spreadsheet/) where it solves this by restricting the operations if using it in a streaming mode.
Would it be possible to add something similar to PHPSpreadsheet?
This is:
- [ ] a bug report
- [ ] a feature request
- [ ] **not** a usage question (ask them on https://stackoverflow.com/questions/tagged/phpspreadsheet or https://gitter.im/PHPOffice/PhpSpreadsheet)
Charts to represent custom values passed to $dataValues parameter.
Values are seemingly accepted but not rendered.
This is based on the line graph example: https://github.com/PHPOffice/PhpSpreadsheet/blob/master/samples/Chart/33_Chart_create_line.php
Place null for $dataSources parameter and place an array of values for the $dataValues parameter of DataSeriesValues.
I have asked about this at StackOverflow already thinking it was a usage issue (it may be) and have not received a response. However, I did today see this issue raising the same exact issue. The apparent solution was exactly what I am trying to do (pass an array of values to $dataValues). That user had success apparently. Maybe there is an issue with line graphs? I do not know.
<?php
require __DIR__ . '/vendor/autoload.php';
// Create new Spreadsheet object
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// add code that show the issue here...
$dataSeriesValues = [
// attempting to pass values to dataValues parameter
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, null, null, 4, [15, 73, 61, 32]),
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, null, null, 4, [15, 73, 61, 32]),
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, null, null, 3, [86, 69, 55]),
// original way using the workbook as a data source
//new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$5', null, 4),
//new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', null, 4),
//new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$5', null, 3),
];
xlsx
PHP 7.4
phpspreadsheet 1.28 (just upgraded from 1.23 thinking that may solve it, it did not).