Consistent `stringFromColumnIndex()` and `columnIndexFromString()`
Column indexes are always based on 1 everywhere in PhpSpreadsheet. This is consistent with rows starting at 1, as well as Excel function `COLUMN()`. It should also make it easier to reason about columns and rows and remove any doubts whether a specific method is expecting 0 based or 1 based indexes. Fixes #273 Fixes https://github.com/PHPOffice/PHPExcel/issues/307 Fixes https://github.com/PHPOffice/PHPExcel/issues/476
This commit is contained in:
parent
e0150fd43e
commit
8d76020590
|
@ -29,6 +29,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
### BREAKING CHANGE
|
### BREAKING CHANGE
|
||||||
|
|
||||||
|
- Extracted coordinate method to dedicate class [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
||||||
|
- Column indexes are based on 1, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
||||||
- Standardization of array keys used for style, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
- Standardization of array keys used for style, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
||||||
- Easier usage of PDF writers, and other custom readers and writers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
- Easier usage of PDF writers, and other custom readers and writers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
||||||
- Easier usage of chart renderers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
- Easier usage of chart renderers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md).
|
||||||
|
|
|
@ -261,8 +261,7 @@ the cell's `getFormattedValue()` method.
|
||||||
|
|
||||||
``` php
|
``` php
|
||||||
// Get the value fom cell A6
|
// Get the value fom cell A6
|
||||||
$cellValue = $spreadsheet->getActiveSheet()->getCell('A6')
|
$cellValue = $spreadsheet->getActiveSheet()->getCell('A6')->getFormattedValue();
|
||||||
->getFormattedValue();
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Setting a cell value by column and row
|
## Setting a cell value by column and row
|
||||||
|
@ -281,13 +280,12 @@ than from `1`.
|
||||||
## Retrieving a cell value by column and row
|
## Retrieving a cell value by column and row
|
||||||
|
|
||||||
To retrieve the value of a cell, the cell should first be retrieved from
|
To retrieve the value of a cell, the cell should first be retrieved from
|
||||||
the worksheet using the getCellByColumnAndRow method. A cell’s value can
|
the worksheet using the `getCellByColumnAndRow()` method. A cell’s value can
|
||||||
be read again using the following line of code:
|
be read again using the following line of code:
|
||||||
|
|
||||||
``` php
|
``` php
|
||||||
// Get the value fom cell B5
|
// Get the value fom cell B5
|
||||||
$cellValue = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(1, 5)
|
$cellValue = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(2, 5)->getValue();
|
||||||
->getValue();
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If you need the calculated value of a cell, use the following code. This
|
If you need the calculated value of a cell, use the following code. This
|
||||||
|
@ -295,8 +293,7 @@ is further explained in .
|
||||||
|
|
||||||
``` php
|
``` php
|
||||||
// Get the value fom cell A4
|
// Get the value fom cell A4
|
||||||
$cellValue = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(0, 4)
|
$cellValue = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(1, 4)->getCalculatedValue();
|
||||||
->getCalculatedValue();
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Retrieving a range of cell values to an array
|
## Retrieving a range of cell values to an array
|
||||||
|
@ -374,8 +371,7 @@ One can use the possibility to access cell values by column and row
|
||||||
index like (0,1) instead of 'A1' for reading and writing cell values in
|
index like (0,1) instead of 'A1' for reading and writing cell values in
|
||||||
loops.
|
loops.
|
||||||
|
|
||||||
Note: In PhpSpreadsheet column index is 0-based while row index is
|
Note: In PhpSpreadsheet column index and row index are 1-based. That means `'A1'` ~ `[1, 1]`
|
||||||
1-based. That means 'A1' \~ (0,1)
|
|
||||||
|
|
||||||
Below is an example where we read all the values in a worksheet and
|
Below is an example where we read all the values in a worksheet and
|
||||||
display them in a table.
|
display them in a table.
|
||||||
|
@ -394,11 +390,9 @@ $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Cell::columnIndexFromString
|
||||||
echo '<table>' . "\n";
|
echo '<table>' . "\n";
|
||||||
for ($row = 1; $row <= $highestRow; ++$row) {
|
for ($row = 1; $row <= $highestRow; ++$row) {
|
||||||
echo '<tr>' . PHP_EOL;
|
echo '<tr>' . PHP_EOL;
|
||||||
for ($col = 0; $col <= $highestColumnIndex; ++$col) {
|
for ($col = 1; $col <= $highestColumnIndex; ++$col) {
|
||||||
echo '<td>' .
|
$value = $worksheet->getCellByColumnAndRow($col, $row)->getValue();
|
||||||
$worksheet->getCellByColumnAndRow($col, $row)
|
echo '<td>' . $value . '</td>' . PHP_EOL;
|
||||||
->getValue() .
|
|
||||||
'</td>' . PHP_EOL;
|
|
||||||
}
|
}
|
||||||
echo '</tr>' . PHP_EOL;
|
echo '</tr>' . PHP_EOL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,3 +363,66 @@ $style = [
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Dedicated class to manipulate coordinates
|
||||||
|
|
||||||
|
Methods to manipulate coordinates that used to exists in `PHPExcel_Cell` were extracted
|
||||||
|
to a dedicated new class `\PhpOffice\PhpSpreadsheet\Cell\Coordinate`. The methods are:
|
||||||
|
|
||||||
|
- `absoluteCoordinate()`
|
||||||
|
- `absoluteReference()`
|
||||||
|
- `buildRange()`
|
||||||
|
- `columnIndexFromString()`
|
||||||
|
- `coordinateFromString()`
|
||||||
|
- `extractAllCellReferencesInRange()`
|
||||||
|
- `getRangeBoundaries()`
|
||||||
|
- `mergeRangesInCollection()`
|
||||||
|
- `rangeBoundaries()`
|
||||||
|
- `rangeDimension()`
|
||||||
|
- `splitRange()`
|
||||||
|
- `stringFromColumnIndex()`
|
||||||
|
|
||||||
|
### Column index based on 1
|
||||||
|
|
||||||
|
Column indexes are now based on 1. So column `A` is the index `1`. This is consistent
|
||||||
|
with rows starting at 1 and Excel function `COLUMN()` that returns `1` for column `A`.
|
||||||
|
So the code must be adapted with something like:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Before
|
||||||
|
$cell = $worksheet->getCellByColumnAndRow($column, $row);
|
||||||
|
|
||||||
|
for ($column = 0; $column < $max; $column++) {
|
||||||
|
$worksheet->setCellValueByColumnAndRow($column, $row, 'value ' . $column);
|
||||||
|
}
|
||||||
|
|
||||||
|
// After
|
||||||
|
$cell = $worksheet->getCellByColumnAndRow($column + 1, $row);
|
||||||
|
|
||||||
|
for ($column = 1; $column <= $max; $column++) {
|
||||||
|
$worksheet->setCellValueByColumnAndRow($column, $row, 'value ' . $column);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
All the following methods are affected:
|
||||||
|
|
||||||
|
- `PHPExcel_Worksheet::cellExistsByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::freezePaneByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::getCellByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::getColumnDimensionByColumn()`
|
||||||
|
- `PHPExcel_Worksheet::getCommentByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::getStyleByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::insertNewColumnBeforeByIndex()`
|
||||||
|
- `PHPExcel_Worksheet::mergeCellsByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::protectCellsByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::removeColumnByIndex()`
|
||||||
|
- `PHPExcel_Worksheet::setAutoFilterByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::setBreakByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::setCellValueByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::setCellValueExplicitByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::setSelectedCellByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::stringFromColumnIndex()`
|
||||||
|
- `PHPExcel_Worksheet::unmergeCellsByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet::unprotectCellsByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet_PageSetup::addPrintAreaByColumnAndRow()`
|
||||||
|
- `PHPExcel_Worksheet_PageSetup::setPrintAreaByColumnAndRow()`
|
||||||
|
|
|
@ -20,7 +20,7 @@ for ($i = 0; $i < 10; ++$i) {
|
||||||
|
|
||||||
$helper->log('Add data (begin)');
|
$helper->log('Add data (begin)');
|
||||||
$t = microtime(true);
|
$t = microtime(true);
|
||||||
for ($col = 0; $col < 50; ++$col) {
|
for ($col = 1; $col <= 50; ++$col) {
|
||||||
for ($row = 0; $row < 100; ++$row) {
|
for ($row = 0; $row < 100; ++$row) {
|
||||||
$str = ($row + $col);
|
$str = ($row + $col);
|
||||||
$style = $styles[$row % 10];
|
$style = $styles[$row % 10];
|
||||||
|
|
|
@ -3496,7 +3496,7 @@ class Calculation
|
||||||
$oCol[] = Coordinate::columnIndexFromString($oCR[0]) - 1;
|
$oCol[] = Coordinate::columnIndexFromString($oCR[0]) - 1;
|
||||||
$oRow[] = $oCR[1];
|
$oRow[] = $oCR[1];
|
||||||
}
|
}
|
||||||
$cellRef = Coordinate::stringFromColumnIndex(min($oCol)) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol)) . max($oRow);
|
$cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow);
|
||||||
if ($pCellParent !== null) {
|
if ($pCellParent !== null) {
|
||||||
$cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($sheet1), false);
|
$cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($sheet1), false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3569,7 +3569,7 @@ class Calculation
|
||||||
$cellIntersect[$row] = array_intersect_key($operand1[$row], $operand2[$row]);
|
$cellIntersect[$row] = array_intersect_key($operand1[$row], $operand2[$row]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$cellRef = Coordinate::stringFromColumnIndex(min($oCol)) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol)) . max($oRow);
|
$cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow);
|
||||||
$this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($cellIntersect));
|
$this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($cellIntersect));
|
||||||
$stack->push('Value', $cellIntersect, $cellRef);
|
$stack->push('Value', $cellIntersect, $cellRef);
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ class LookupRef
|
||||||
}
|
}
|
||||||
if ((!is_bool($referenceStyle)) || $referenceStyle) {
|
if ((!is_bool($referenceStyle)) || $referenceStyle) {
|
||||||
$rowRelative = $columnRelative = '$';
|
$rowRelative = $columnRelative = '$';
|
||||||
$column = Coordinate::stringFromColumnIndex($column - 1);
|
$column = Coordinate::stringFromColumnIndex($column);
|
||||||
if (($relativity == 2) || ($relativity == 4)) {
|
if (($relativity == 2) || ($relativity == 4)) {
|
||||||
$columnRelative = '';
|
$columnRelative = '';
|
||||||
}
|
}
|
||||||
|
@ -399,7 +399,7 @@ class LookupRef
|
||||||
} else {
|
} else {
|
||||||
$endCellColumn += $columns;
|
$endCellColumn += $columns;
|
||||||
}
|
}
|
||||||
$startCellColumn = Coordinate::stringFromColumnIndex($startCellColumn);
|
$startCellColumn = Coordinate::stringFromColumnIndex($startCellColumn + 1);
|
||||||
|
|
||||||
if (($height != null) && (!is_object($height))) {
|
if (($height != null) && (!is_object($height))) {
|
||||||
$endCellRow = $startCellRow + $height - 1;
|
$endCellRow = $startCellRow + $height - 1;
|
||||||
|
@ -410,7 +410,7 @@ class LookupRef
|
||||||
if (($endCellRow <= 0) || ($endCellColumn < 0)) {
|
if (($endCellRow <= 0) || ($endCellColumn < 0)) {
|
||||||
return Functions::REF();
|
return Functions::REF();
|
||||||
}
|
}
|
||||||
$endCellColumn = Coordinate::stringFromColumnIndex($endCellColumn);
|
$endCellColumn = Coordinate::stringFromColumnIndex($endCellColumn + 1);
|
||||||
|
|
||||||
$cellAddress = $startCellColumn . $startCellRow;
|
$cellAddress = $startCellColumn . $startCellRow;
|
||||||
if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) {
|
if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) {
|
||||||
|
|
|
@ -4,6 +4,12 @@ namespace PhpOffice\PhpSpreadsheet\Cell;
|
||||||
|
|
||||||
use PhpOffice\PhpSpreadsheet\Exception;
|
use PhpOffice\PhpSpreadsheet\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to manipulate cell coordinates.
|
||||||
|
*
|
||||||
|
* Columns indexes and rows are always based on 1, **not** on 0. This match the behavior
|
||||||
|
* that Excel users are used to, and also match the Excel functions `COLUMN()` and `ROW()`.
|
||||||
|
*/
|
||||||
abstract class Coordinate
|
abstract class Coordinate
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -240,7 +246,7 @@ abstract class Coordinate
|
||||||
*
|
*
|
||||||
* @param string $pString eg 'A'
|
* @param string $pString eg 'A'
|
||||||
*
|
*
|
||||||
* @return int Column index (base 1 !!!)
|
* @return int Column index (A = 1)
|
||||||
*/
|
*/
|
||||||
public static function columnIndexFromString($pString)
|
public static function columnIndexFromString($pString)
|
||||||
{
|
{
|
||||||
|
@ -284,9 +290,9 @@ abstract class Coordinate
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String from columnindex.
|
* String from column index.
|
||||||
*
|
*
|
||||||
* @param int $columnIndex Column index (A = 0)
|
* @param int $columnIndex Column index (A = 1)
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
|
@ -295,7 +301,7 @@ abstract class Coordinate
|
||||||
static $indexCache = [];
|
static $indexCache = [];
|
||||||
|
|
||||||
if (!isset($indexCache[$columnIndex])) {
|
if (!isset($indexCache[$columnIndex])) {
|
||||||
$indexValue = $columnIndex + 1;
|
$indexValue = $columnIndex;
|
||||||
$base26 = null;
|
$base26 = null;
|
||||||
do {
|
do {
|
||||||
$characterValue = ($indexValue % 26) ?: 26;
|
$characterValue = ($indexValue % 26) ?: 26;
|
||||||
|
|
|
@ -248,7 +248,7 @@ class Cells
|
||||||
$columnList[] = Coordinate::columnIndexFromString($c);
|
$columnList[] = Coordinate::columnIndexFromString($c);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Coordinate::stringFromColumnIndex(max($columnList) - 1);
|
return Coordinate::stringFromColumnIndex(max($columnList) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -251,7 +251,7 @@ class Csv extends BaseReader
|
||||||
$worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1);
|
$worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
$worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']);
|
$worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex'] + 1);
|
||||||
$worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1;
|
$worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1;
|
||||||
|
|
||||||
// Close file
|
// Close file
|
||||||
|
|
|
@ -138,7 +138,7 @@ class Gnumeric extends BaseReader
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
|
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1);
|
||||||
$worksheetInfo[] = $tmpInfo;
|
$worksheetInfo[] = $tmpInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -394,7 +394,7 @@ class Gnumeric extends BaseReader
|
||||||
$maxCol = $column;
|
$maxCol = $column;
|
||||||
}
|
}
|
||||||
|
|
||||||
$column = Coordinate::stringFromColumnIndex($column);
|
$column = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if ($this->getReadFilter() !== null) {
|
if ($this->getReadFilter() !== null) {
|
||||||
|
@ -472,11 +472,11 @@ class Gnumeric extends BaseReader
|
||||||
$styleAttributes = $styleRegion->attributes();
|
$styleAttributes = $styleRegion->attributes();
|
||||||
if (($styleAttributes['startRow'] <= $maxRow) &&
|
if (($styleAttributes['startRow'] <= $maxRow) &&
|
||||||
($styleAttributes['startCol'] <= $maxCol)) {
|
($styleAttributes['startCol'] <= $maxCol)) {
|
||||||
$startColumn = Coordinate::stringFromColumnIndex((int) $styleAttributes['startCol']);
|
$startColumn = Coordinate::stringFromColumnIndex((int) $styleAttributes['startCol'] + 1);
|
||||||
$startRow = $styleAttributes['startRow'] + 1;
|
$startRow = $styleAttributes['startRow'] + 1;
|
||||||
|
|
||||||
$endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol'];
|
$endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol'];
|
||||||
$endColumn = Coordinate::stringFromColumnIndex($endColumn);
|
$endColumn = Coordinate::stringFromColumnIndex($endColumn + 1);
|
||||||
$endRow = ($styleAttributes['endRow'] > $maxRow) ? $maxRow : $styleAttributes['endRow'];
|
$endRow = ($styleAttributes['endRow'] > $maxRow) ? $maxRow : $styleAttributes['endRow'];
|
||||||
$endRow += 1;
|
$endRow += 1;
|
||||||
$cellRange = $startColumn . $startRow . ':' . $endColumn . $endRow;
|
$cellRange = $startColumn . $startRow . ':' . $endColumn . $endRow;
|
||||||
|
@ -718,19 +718,19 @@ class Gnumeric extends BaseReader
|
||||||
$hidden = ((isset($columnAttributes['Hidden'])) && ($columnAttributes['Hidden'] == '1')) ? true : false;
|
$hidden = ((isset($columnAttributes['Hidden'])) && ($columnAttributes['Hidden'] == '1')) ? true : false;
|
||||||
$columnCount = (isset($columnAttributes['Count'])) ? $columnAttributes['Count'] : 1;
|
$columnCount = (isset($columnAttributes['Count'])) ? $columnAttributes['Count'] : 1;
|
||||||
while ($c < $column) {
|
while ($c < $column) {
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setWidth($defaultWidth);
|
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setWidth($defaultWidth);
|
||||||
++$c;
|
++$c;
|
||||||
}
|
}
|
||||||
while (($c < ($column + $columnCount)) && ($c <= $maxCol)) {
|
while (($c < ($column + $columnCount)) && ($c <= $maxCol)) {
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setWidth($columnWidth);
|
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setWidth($columnWidth);
|
||||||
if ($hidden) {
|
if ($hidden) {
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setVisible(false);
|
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setVisible(false);
|
||||||
}
|
}
|
||||||
++$c;
|
++$c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while ($c <= $maxCol) {
|
while ($c <= $maxCol) {
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setWidth($defaultWidth);
|
$spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setWidth($defaultWidth);
|
||||||
++$c;
|
++$c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@ class Ods extends BaseReader
|
||||||
|
|
||||||
$tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells);
|
$tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells);
|
||||||
$tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;
|
$tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;
|
||||||
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
|
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1);
|
||||||
$worksheetInfo[] = $tmpInfo;
|
$worksheetInfo[] = $tmpInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -707,7 +707,7 @@ class Ods extends BaseReader
|
||||||
$columnIndex += (int) $cellData->getAttributeNS($tableNs, 'number-columns-spanned');
|
$columnIndex += (int) $cellData->getAttributeNS($tableNs, 'number-columns-spanned');
|
||||||
$columnIndex -= 2;
|
$columnIndex -= 2;
|
||||||
|
|
||||||
$columnTo = Coordinate::stringFromColumnIndex($columnIndex);
|
$columnTo = Coordinate::stringFromColumnIndex($columnIndex + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
$rowTo = $rowID;
|
$rowTo = $rowID;
|
||||||
|
|
|
@ -161,7 +161,7 @@ class Slk extends BaseReader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']);
|
$worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex'] + 1);
|
||||||
$worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1;
|
$worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1;
|
||||||
|
|
||||||
// Close file
|
// Close file
|
||||||
|
@ -337,7 +337,7 @@ class Slk extends BaseReader
|
||||||
if ($columnReference[0] == '[') {
|
if ($columnReference[0] == '[') {
|
||||||
$columnReference = $column + trim($columnReference, '[]');
|
$columnReference = $column + trim($columnReference, '[]');
|
||||||
}
|
}
|
||||||
$A1CellReference = Coordinate::stringFromColumnIndex($columnReference - 1) . $rowReference;
|
$A1CellReference = Coordinate::stringFromColumnIndex($columnReference) . $rowReference;
|
||||||
|
|
||||||
$value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));
|
$value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));
|
||||||
}
|
}
|
||||||
|
@ -351,7 +351,7 @@ class Slk extends BaseReader
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$columnLetter = Coordinate::stringFromColumnIndex($column - 1);
|
$columnLetter = Coordinate::stringFromColumnIndex($column);
|
||||||
$cellData = Calculation::unwrapResult($cellData);
|
$cellData = Calculation::unwrapResult($cellData);
|
||||||
|
|
||||||
// Set cell value
|
// Set cell value
|
||||||
|
@ -419,22 +419,22 @@ class Slk extends BaseReader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (($formatStyle > '') && ($column > '') && ($row > '')) {
|
if (($formatStyle > '') && ($column > '') && ($row > '')) {
|
||||||
$columnLetter = Coordinate::stringFromColumnIndex($column - 1);
|
$columnLetter = Coordinate::stringFromColumnIndex($column);
|
||||||
if (isset($this->formats[$formatStyle])) {
|
if (isset($this->formats[$formatStyle])) {
|
||||||
$spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($this->formats[$formatStyle]);
|
$spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($this->formats[$formatStyle]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((!empty($styleData)) && ($column > '') && ($row > '')) {
|
if ((!empty($styleData)) && ($column > '') && ($row > '')) {
|
||||||
$columnLetter = Coordinate::stringFromColumnIndex($column - 1);
|
$columnLetter = Coordinate::stringFromColumnIndex($column);
|
||||||
$spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($styleData);
|
$spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($styleData);
|
||||||
}
|
}
|
||||||
if ($columnWidth > '') {
|
if ($columnWidth > '') {
|
||||||
if ($startCol == $endCol) {
|
if ($startCol == $endCol) {
|
||||||
$startCol = Coordinate::stringFromColumnIndex($startCol - 1);
|
$startCol = Coordinate::stringFromColumnIndex($startCol);
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth);
|
$spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth);
|
||||||
} else {
|
} else {
|
||||||
$startCol = Coordinate::stringFromColumnIndex($startCol - 1);
|
$startCol = Coordinate::stringFromColumnIndex($startCol);
|
||||||
$endCol = Coordinate::stringFromColumnIndex($endCol - 1);
|
$endCol = Coordinate::stringFromColumnIndex($endCol);
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth);
|
$spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth);
|
||||||
do {
|
do {
|
||||||
$spreadsheet->getActiveSheet()->getColumnDimension(++$startCol)->setWidth($columnWidth);
|
$spreadsheet->getActiveSheet()->getColumnDimension(++$startCol)->setWidth($columnWidth);
|
||||||
|
|
|
@ -602,7 +602,7 @@ class Xls extends BaseReader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
|
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1);
|
||||||
$tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
|
$tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
|
||||||
|
|
||||||
$worksheetInfo[] = $tmpInfo;
|
$worksheetInfo[] = $tmpInfo;
|
||||||
|
@ -3222,7 +3222,7 @@ class Xls extends BaseReader
|
||||||
$cl = self::getUInt2d($recordData, 2 + 6 * $i + 4);
|
$cl = self::getUInt2d($recordData, 2 + 6 * $i + 4);
|
||||||
|
|
||||||
// not sure why two column indexes are necessary?
|
// not sure why two column indexes are necessary?
|
||||||
$this->phpSheet->setBreakByColumnAndRow($cf, $r, Worksheet::BREAK_ROW);
|
$this->phpSheet->setBreakByColumnAndRow($cf + 1, $r, Worksheet::BREAK_ROW);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3249,7 +3249,7 @@ class Xls extends BaseReader
|
||||||
$rl = self::getUInt2d($recordData, 2 + 6 * $i + 4);
|
$rl = self::getUInt2d($recordData, 2 + 6 * $i + 4);
|
||||||
|
|
||||||
// not sure why two row indexes are necessary?
|
// not sure why two row indexes are necessary?
|
||||||
$this->phpSheet->setBreakByColumnAndRow($c, $rf, Worksheet::BREAK_COLUMN);
|
$this->phpSheet->setBreakByColumnAndRow($c + 1, $rf, Worksheet::BREAK_COLUMN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3593,10 +3593,10 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
if (!$this->readDataOnly) {
|
if (!$this->readDataOnly) {
|
||||||
// offset: 0; size: 2; index to first column in range
|
// offset: 0; size: 2; index to first column in range
|
||||||
$fc = self::getUInt2d($recordData, 0); // first column index
|
$firstColumnIndex = self::getUInt2d($recordData, 0);
|
||||||
|
|
||||||
// offset: 2; size: 2; index to last column in range
|
// offset: 2; size: 2; index to last column in range
|
||||||
$lc = self::getUInt2d($recordData, 2); // first column index
|
$lastColumnIndex = self::getUInt2d($recordData, 2);
|
||||||
|
|
||||||
// offset: 4; size: 2; width of the column in 1/256 of the width of the zero character
|
// offset: 4; size: 2; width of the column in 1/256 of the width of the zero character
|
||||||
$width = self::getUInt2d($recordData, 4);
|
$width = self::getUInt2d($recordData, 4);
|
||||||
|
@ -3616,8 +3616,8 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 10; size: 2; not used
|
// offset: 10; size: 2; not used
|
||||||
|
|
||||||
for ($i = $fc; $i <= $lc; ++$i) {
|
for ($i = $firstColumnIndex + 1; $i <= $lastColumnIndex + 1; ++$i) {
|
||||||
if ($lc == 255 || $lc == 256) {
|
if ($lastColumnIndex == 255 || $lastColumnIndex == 256) {
|
||||||
$this->phpSheet->getDefaultColumnDimension()->setWidth($width / 256);
|
$this->phpSheet->getDefaultColumnDimension()->setWidth($width / 256);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -3723,7 +3723,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; index to column
|
// offset: 2; size: 2; index to column
|
||||||
$column = self::getUInt2d($recordData, 2);
|
$column = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($column);
|
$columnString = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
||||||
|
@ -3767,7 +3767,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; index to column
|
// offset: 2; size: 2; index to column
|
||||||
$column = self::getUInt2d($recordData, 2);
|
$column = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($column);
|
$columnString = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
$emptyCell = true;
|
$emptyCell = true;
|
||||||
// Read cell?
|
// Read cell?
|
||||||
|
@ -3859,7 +3859,7 @@ class Xls extends BaseReader
|
||||||
// offset within record data
|
// offset within record data
|
||||||
$offset = 4;
|
$offset = 4;
|
||||||
|
|
||||||
for ($i = 0; $i < $columns; ++$i) {
|
for ($i = 1; $i <= $columns; ++$i) {
|
||||||
$columnString = Coordinate::stringFromColumnIndex($colFirst + $i);
|
$columnString = Coordinate::stringFromColumnIndex($colFirst + $i);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
|
@ -3904,7 +3904,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size 2; index to column
|
// offset: 2; size 2; index to column
|
||||||
$column = self::getUInt2d($recordData, 2);
|
$column = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($column);
|
$columnString = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
||||||
|
@ -3945,7 +3945,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; col index
|
// offset: 2; size: 2; col index
|
||||||
$column = self::getUInt2d($recordData, 2);
|
$column = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($column);
|
$columnString = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
// offset: 20: size: variable; formula structure
|
// offset: 20: size: variable; formula structure
|
||||||
$formulaStructure = substr($recordData, 20);
|
$formulaStructure = substr($recordData, 20);
|
||||||
|
@ -3969,7 +3969,7 @@ class Xls extends BaseReader
|
||||||
// get the base cell, grab tExp token
|
// get the base cell, grab tExp token
|
||||||
$baseRow = self::getUInt2d($formulaStructure, 3);
|
$baseRow = self::getUInt2d($formulaStructure, 3);
|
||||||
$baseCol = self::getUInt2d($formulaStructure, 5);
|
$baseCol = self::getUInt2d($formulaStructure, 5);
|
||||||
$this->baseCell = Coordinate::stringFromColumnIndex($baseCol) . ($baseRow + 1);
|
$this->baseCell = Coordinate::stringFromColumnIndex($baseCol + 1) . ($baseRow + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
|
@ -4129,7 +4129,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; column index
|
// offset: 2; size: 2; column index
|
||||||
$column = self::getUInt2d($recordData, 2);
|
$column = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($column);
|
$columnString = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
||||||
|
@ -4193,7 +4193,7 @@ class Xls extends BaseReader
|
||||||
// add style information
|
// add style information
|
||||||
if (!$this->readDataOnly && $this->readEmptyCells) {
|
if (!$this->readDataOnly && $this->readEmptyCells) {
|
||||||
for ($i = 0; $i < $length / 2 - 3; ++$i) {
|
for ($i = 0; $i < $length / 2 - 3; ++$i) {
|
||||||
$columnString = Coordinate::stringFromColumnIndex($fc + $i);
|
$columnString = Coordinate::stringFromColumnIndex($fc + $i + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
||||||
|
@ -4229,7 +4229,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; index to column
|
// offset: 2; size: 2; index to column
|
||||||
$column = self::getUInt2d($recordData, 2);
|
$column = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($column);
|
$columnString = Coordinate::stringFromColumnIndex($column + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
||||||
|
@ -4273,7 +4273,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; col index
|
// offset: 2; size: 2; col index
|
||||||
$col = self::getUInt2d($recordData, 2);
|
$col = self::getUInt2d($recordData, 2);
|
||||||
$columnString = Coordinate::stringFromColumnIndex($col);
|
$columnString = Coordinate::stringFromColumnIndex($col + 1);
|
||||||
|
|
||||||
// Read cell?
|
// Read cell?
|
||||||
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {
|
||||||
|
@ -4490,7 +4490,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
if ($this->frozen) {
|
if ($this->frozen) {
|
||||||
// frozen panes
|
// frozen panes
|
||||||
$this->phpSheet->freezePane(Coordinate::stringFromColumnIndex($px) . ($py + 1));
|
$this->phpSheet->freezePane(Coordinate::stringFromColumnIndex($px + 1) . ($py + 1));
|
||||||
}
|
}
|
||||||
// unfrozen panes; split windows; not supported by PhpSpreadsheet core
|
// unfrozen panes; split windows; not supported by PhpSpreadsheet core
|
||||||
}
|
}
|
||||||
|
@ -7103,7 +7103,7 @@ class Xls extends BaseReader
|
||||||
|
|
||||||
// offset: 2; size: 2; index to column or column offset + relative flags
|
// offset: 2; size: 2; index to column or column offset + relative flags
|
||||||
// bit: 7-0; mask 0x00FF; column index
|
// bit: 7-0; mask 0x00FF; column index
|
||||||
$column = Coordinate::stringFromColumnIndex(0x00FF & self::getUInt2d($cellAddressStructure, 2));
|
$column = Coordinate::stringFromColumnIndex((0x00FF & self::getUInt2d($cellAddressStructure, 2)) + 1);
|
||||||
|
|
||||||
// bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)
|
// bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)
|
||||||
if (!(0x4000 & self::getUInt2d($cellAddressStructure, 2))) {
|
if (!(0x4000 & self::getUInt2d($cellAddressStructure, 2))) {
|
||||||
|
@ -7142,7 +7142,7 @@ class Xls extends BaseReader
|
||||||
// bit: 7-0; mask 0x00FF; column index
|
// bit: 7-0; mask 0x00FF; column index
|
||||||
$colIndex = 0x00FF & self::getUInt2d($cellAddressStructure, 2);
|
$colIndex = 0x00FF & self::getUInt2d($cellAddressStructure, 2);
|
||||||
|
|
||||||
$column = Coordinate::stringFromColumnIndex($colIndex);
|
$column = Coordinate::stringFromColumnIndex($colIndex + 1);
|
||||||
$column = '$' . $column;
|
$column = '$' . $column;
|
||||||
} else {
|
} else {
|
||||||
// offset: 2; size: 2; index to column or column offset + relative flags
|
// offset: 2; size: 2; index to column or column offset + relative flags
|
||||||
|
@ -7151,7 +7151,7 @@ class Xls extends BaseReader
|
||||||
$colIndex = $baseCol + $relativeColIndex;
|
$colIndex = $baseCol + $relativeColIndex;
|
||||||
$colIndex = ($colIndex < 256) ? $colIndex : $colIndex - 256;
|
$colIndex = ($colIndex < 256) ? $colIndex : $colIndex - 256;
|
||||||
$colIndex = ($colIndex >= 0) ? $colIndex : $colIndex + 256;
|
$colIndex = ($colIndex >= 0) ? $colIndex : $colIndex + 256;
|
||||||
$column = Coordinate::stringFromColumnIndex($colIndex);
|
$column = Coordinate::stringFromColumnIndex($colIndex + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)
|
// bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)
|
||||||
|
@ -7196,8 +7196,8 @@ class Xls extends BaseReader
|
||||||
}
|
}
|
||||||
|
|
||||||
// column index to letter
|
// column index to letter
|
||||||
$fc = Coordinate::stringFromColumnIndex($fc);
|
$fc = Coordinate::stringFromColumnIndex($fc + 1);
|
||||||
$lc = Coordinate::stringFromColumnIndex($lc);
|
$lc = Coordinate::stringFromColumnIndex($lc + 1);
|
||||||
|
|
||||||
if ($fr == $lr and $fc == $lc) {
|
if ($fr == $lr and $fc == $lc) {
|
||||||
return "$fc$fr";
|
return "$fc$fr";
|
||||||
|
@ -7237,8 +7237,8 @@ class Xls extends BaseReader
|
||||||
}
|
}
|
||||||
|
|
||||||
// column index to letter
|
// column index to letter
|
||||||
$fc = Coordinate::stringFromColumnIndex($fc);
|
$fc = Coordinate::stringFromColumnIndex($fc + 1);
|
||||||
$lc = Coordinate::stringFromColumnIndex($lc);
|
$lc = Coordinate::stringFromColumnIndex($lc + 1);
|
||||||
|
|
||||||
if ($fr == $lr and $fc == $lc) {
|
if ($fr == $lr and $fc == $lc) {
|
||||||
return "$fc$fr";
|
return "$fc$fr";
|
||||||
|
@ -7270,7 +7270,7 @@ class Xls extends BaseReader
|
||||||
// offset: 4; size: 2; index to first column or column offset + relative flags
|
// offset: 4; size: 2; index to first column or column offset + relative flags
|
||||||
|
|
||||||
// bit: 7-0; mask 0x00FF; column index
|
// bit: 7-0; mask 0x00FF; column index
|
||||||
$fc = Coordinate::stringFromColumnIndex(0x00FF & self::getUInt2d($subData, 4));
|
$fc = Coordinate::stringFromColumnIndex((0x00FF & self::getUInt2d($subData, 4)) + 1);
|
||||||
|
|
||||||
// bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)
|
// bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)
|
||||||
if (!(0x4000 & self::getUInt2d($subData, 4))) {
|
if (!(0x4000 & self::getUInt2d($subData, 4))) {
|
||||||
|
@ -7285,7 +7285,7 @@ class Xls extends BaseReader
|
||||||
// offset: 6; size: 2; index to last column or column offset + relative flags
|
// offset: 6; size: 2; index to last column or column offset + relative flags
|
||||||
|
|
||||||
// bit: 7-0; mask 0x00FF; column index
|
// bit: 7-0; mask 0x00FF; column index
|
||||||
$lc = Coordinate::stringFromColumnIndex(0x00FF & self::getUInt2d($subData, 6));
|
$lc = Coordinate::stringFromColumnIndex((0x00FF & self::getUInt2d($subData, 6)) + 1);
|
||||||
|
|
||||||
// bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)
|
// bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)
|
||||||
if (!(0x4000 & self::getUInt2d($subData, 6))) {
|
if (!(0x4000 & self::getUInt2d($subData, 6))) {
|
||||||
|
@ -7330,7 +7330,7 @@ class Xls extends BaseReader
|
||||||
// offset: 4; size: 2; first column with relative/absolute flags
|
// offset: 4; size: 2; first column with relative/absolute flags
|
||||||
// bit: 7-0; mask 0x00FF; column index
|
// bit: 7-0; mask 0x00FF; column index
|
||||||
$fcIndex = 0x00FF & self::getUInt2d($subData, 4);
|
$fcIndex = 0x00FF & self::getUInt2d($subData, 4);
|
||||||
$fc = Coordinate::stringFromColumnIndex($fcIndex);
|
$fc = Coordinate::stringFromColumnIndex($fcIndex + 1);
|
||||||
$fc = '$' . $fc;
|
$fc = '$' . $fc;
|
||||||
} else {
|
} else {
|
||||||
// column offset
|
// column offset
|
||||||
|
@ -7340,7 +7340,7 @@ class Xls extends BaseReader
|
||||||
$fcIndex = $baseCol + $relativeFcIndex;
|
$fcIndex = $baseCol + $relativeFcIndex;
|
||||||
$fcIndex = ($fcIndex < 256) ? $fcIndex : $fcIndex - 256;
|
$fcIndex = ($fcIndex < 256) ? $fcIndex : $fcIndex - 256;
|
||||||
$fcIndex = ($fcIndex >= 0) ? $fcIndex : $fcIndex + 256;
|
$fcIndex = ($fcIndex >= 0) ? $fcIndex : $fcIndex + 256;
|
||||||
$fc = Coordinate::stringFromColumnIndex($fcIndex);
|
$fc = Coordinate::stringFromColumnIndex($fcIndex + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)
|
// bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)
|
||||||
|
@ -7360,7 +7360,7 @@ class Xls extends BaseReader
|
||||||
// offset: 6; size: 2; last column with relative/absolute flags
|
// offset: 6; size: 2; last column with relative/absolute flags
|
||||||
// bit: 7-0; mask 0x00FF; column index
|
// bit: 7-0; mask 0x00FF; column index
|
||||||
$lcIndex = 0x00FF & self::getUInt2d($subData, 6);
|
$lcIndex = 0x00FF & self::getUInt2d($subData, 6);
|
||||||
$lc = Coordinate::stringFromColumnIndex($lcIndex);
|
$lc = Coordinate::stringFromColumnIndex($lcIndex + 1);
|
||||||
$lc = '$' . $lc;
|
$lc = '$' . $lc;
|
||||||
} else {
|
} else {
|
||||||
// column offset
|
// column offset
|
||||||
|
@ -7370,7 +7370,7 @@ class Xls extends BaseReader
|
||||||
$lcIndex = $baseCol + $relativeLcIndex;
|
$lcIndex = $baseCol + $relativeLcIndex;
|
||||||
$lcIndex = ($lcIndex < 256) ? $lcIndex : $lcIndex - 256;
|
$lcIndex = ($lcIndex < 256) ? $lcIndex : $lcIndex - 256;
|
||||||
$lcIndex = ($lcIndex >= 0) ? $lcIndex : $lcIndex + 256;
|
$lcIndex = ($lcIndex >= 0) ? $lcIndex : $lcIndex + 256;
|
||||||
$lc = Coordinate::stringFromColumnIndex($lcIndex);
|
$lc = Coordinate::stringFromColumnIndex($lcIndex + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)
|
// bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)
|
||||||
|
|
|
@ -598,7 +598,7 @@ class Escher
|
||||||
$endOffsetY = Xls::getUInt2d($recordData, 16);
|
$endOffsetY = Xls::getUInt2d($recordData, 16);
|
||||||
|
|
||||||
// set the start coordinates
|
// set the start coordinates
|
||||||
$this->object->setStartCoordinates(Coordinate::stringFromColumnIndex($c1) . ($r1 + 1));
|
$this->object->setStartCoordinates(Coordinate::stringFromColumnIndex($c1 + 1) . ($r1 + 1));
|
||||||
|
|
||||||
// set the start offsetX
|
// set the start offsetX
|
||||||
$this->object->setStartOffsetX($startOffsetX);
|
$this->object->setStartOffsetX($startOffsetX);
|
||||||
|
@ -607,7 +607,7 @@ class Escher
|
||||||
$this->object->setStartOffsetY($startOffsetY);
|
$this->object->setStartOffsetY($startOffsetY);
|
||||||
|
|
||||||
// set the end coordinates
|
// set the end coordinates
|
||||||
$this->object->setEndCoordinates(Coordinate::stringFromColumnIndex($c2) . ($r2 + 1));
|
$this->object->setEndCoordinates(Coordinate::stringFromColumnIndex($c2 + 1) . ($r2 + 1));
|
||||||
|
|
||||||
// set the end offsetX
|
// set the end offsetX
|
||||||
$this->object->setEndOffsetX($endOffsetX);
|
$this->object->setEndOffsetX($endOffsetX);
|
||||||
|
|
|
@ -230,7 +230,7 @@ class Xlsx extends BaseReader
|
||||||
$xml->close();
|
$xml->close();
|
||||||
|
|
||||||
$tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;
|
$tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;
|
||||||
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
|
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1);
|
||||||
|
|
||||||
$worksheetInfo[] = $tmpInfo;
|
$worksheetInfo[] = $tmpInfo;
|
||||||
}
|
}
|
||||||
|
@ -734,7 +734,7 @@ class Xlsx extends BaseReader
|
||||||
$ySplit = 1 + (int) ($xmlSheet->sheetViews->sheetView->pane['ySplit']);
|
$ySplit = 1 + (int) ($xmlSheet->sheetViews->sheetView->pane['ySplit']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$docSheet->freezePaneByColumnAndRow($xSplit, $ySplit);
|
$docSheet->freezePaneByColumnAndRow($xSplit + 1, $ySplit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -798,7 +798,7 @@ class Xlsx extends BaseReader
|
||||||
|
|
||||||
if (isset($xmlSheet->cols) && !$this->readDataOnly) {
|
if (isset($xmlSheet->cols) && !$this->readDataOnly) {
|
||||||
foreach ($xmlSheet->cols->col as $col) {
|
foreach ($xmlSheet->cols->col as $col) {
|
||||||
for ($i = (int) ($col['min']) - 1; $i < (int) ($col['max']); ++$i) {
|
for ($i = (int) ($col['min']); $i <= (int) ($col['max']); ++$i) {
|
||||||
if ($col['style'] && !$this->readDataOnly) {
|
if ($col['style'] && !$this->readDataOnly) {
|
||||||
$docSheet->getColumnDimension(Coordinate::stringFromColumnIndex($i))->setXfIndex((int) ($col['style']));
|
$docSheet->getColumnDimension(Coordinate::stringFromColumnIndex($i))->setXfIndex((int) ($col['style']));
|
||||||
}
|
}
|
||||||
|
@ -854,7 +854,7 @@ class Xlsx extends BaseReader
|
||||||
$docSheet->getRowDimension((int) ($row['r']))->setXfIndex((int) ($row['s']));
|
$docSheet->getRowDimension((int) ($row['r']))->setXfIndex((int) ($row['s']));
|
||||||
}
|
}
|
||||||
|
|
||||||
$rowIndex = 0; // Start form zero because Cell::stringFromColumnIndex start from A default, actually is 1
|
$rowIndex = 1;
|
||||||
foreach ($row->c as $c) {
|
foreach ($row->c as $c) {
|
||||||
$r = (string) $c['r'];
|
$r = (string) $c['r'];
|
||||||
if ($r == '') {
|
if ($r == '') {
|
||||||
|
@ -1214,7 +1214,7 @@ class Xlsx extends BaseReader
|
||||||
if ($xmlSheet && $xmlSheet->colBreaks && $xmlSheet->colBreaks->brk && !$this->readDataOnly) {
|
if ($xmlSheet && $xmlSheet->colBreaks && $xmlSheet->colBreaks->brk && !$this->readDataOnly) {
|
||||||
foreach ($xmlSheet->colBreaks->brk as $brk) {
|
foreach ($xmlSheet->colBreaks->brk as $brk) {
|
||||||
if ($brk['man']) {
|
if ($brk['man']) {
|
||||||
$docSheet->setBreak(Coordinate::stringFromColumnIndex((string) $brk['id']) . '1', Worksheet::BREAK_COLUMN);
|
$docSheet->setBreak(Coordinate::stringFromColumnIndex((string) $brk['id'] + 1) . '1', Worksheet::BREAK_COLUMN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1568,7 +1568,7 @@ class Xlsx extends BaseReader
|
||||||
)],
|
)],
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
$objDrawing->setCoordinates(Coordinate::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1));
|
$objDrawing->setCoordinates(Coordinate::stringFromColumnIndex(((string) $oneCellAnchor->from->col) + 1) . ($oneCellAnchor->from->row + 1));
|
||||||
$objDrawing->setOffsetX(Drawing::EMUToPixels($oneCellAnchor->from->colOff));
|
$objDrawing->setOffsetX(Drawing::EMUToPixels($oneCellAnchor->from->colOff));
|
||||||
$objDrawing->setOffsetY(Drawing::EMUToPixels($oneCellAnchor->from->rowOff));
|
$objDrawing->setOffsetY(Drawing::EMUToPixels($oneCellAnchor->from->rowOff));
|
||||||
$objDrawing->setResizeProportional(false);
|
$objDrawing->setResizeProportional(false);
|
||||||
|
@ -1590,7 +1590,7 @@ class Xlsx extends BaseReader
|
||||||
$objDrawing->setWorksheet($docSheet);
|
$objDrawing->setWorksheet($docSheet);
|
||||||
} else {
|
} else {
|
||||||
// ? Can charts be positioned with a oneCellAnchor ?
|
// ? Can charts be positioned with a oneCellAnchor ?
|
||||||
$coordinates = Coordinate::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1);
|
$coordinates = Coordinate::stringFromColumnIndex(((string) $oneCellAnchor->from->col) + 1) . ($oneCellAnchor->from->row + 1);
|
||||||
$offsetX = Drawing::EMUToPixels($oneCellAnchor->from->colOff);
|
$offsetX = Drawing::EMUToPixels($oneCellAnchor->from->colOff);
|
||||||
$offsetY = Drawing::EMUToPixels($oneCellAnchor->from->rowOff);
|
$offsetY = Drawing::EMUToPixels($oneCellAnchor->from->rowOff);
|
||||||
$width = Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), 'cx'));
|
$width = Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), 'cx'));
|
||||||
|
@ -1615,7 +1615,7 @@ class Xlsx extends BaseReader
|
||||||
)],
|
)],
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
$objDrawing->setCoordinates(Coordinate::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1));
|
$objDrawing->setCoordinates(Coordinate::stringFromColumnIndex(((string) $twoCellAnchor->from->col) + 1) . ($twoCellAnchor->from->row + 1));
|
||||||
$objDrawing->setOffsetX(Drawing::EMUToPixels($twoCellAnchor->from->colOff));
|
$objDrawing->setOffsetX(Drawing::EMUToPixels($twoCellAnchor->from->colOff));
|
||||||
$objDrawing->setOffsetY(Drawing::EMUToPixels($twoCellAnchor->from->rowOff));
|
$objDrawing->setOffsetY(Drawing::EMUToPixels($twoCellAnchor->from->rowOff));
|
||||||
$objDrawing->setResizeProportional(false);
|
$objDrawing->setResizeProportional(false);
|
||||||
|
@ -1637,10 +1637,10 @@ class Xlsx extends BaseReader
|
||||||
}
|
}
|
||||||
$objDrawing->setWorksheet($docSheet);
|
$objDrawing->setWorksheet($docSheet);
|
||||||
} elseif (($this->includeCharts) && ($twoCellAnchor->graphicFrame)) {
|
} elseif (($this->includeCharts) && ($twoCellAnchor->graphicFrame)) {
|
||||||
$fromCoordinate = Coordinate::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1);
|
$fromCoordinate = Coordinate::stringFromColumnIndex(((string) $twoCellAnchor->from->col) + 1) . ($twoCellAnchor->from->row + 1);
|
||||||
$fromOffsetX = Drawing::EMUToPixels($twoCellAnchor->from->colOff);
|
$fromOffsetX = Drawing::EMUToPixels($twoCellAnchor->from->colOff);
|
||||||
$fromOffsetY = Drawing::EMUToPixels($twoCellAnchor->from->rowOff);
|
$fromOffsetY = Drawing::EMUToPixels($twoCellAnchor->from->rowOff);
|
||||||
$toCoordinate = Coordinate::stringFromColumnIndex((string) $twoCellAnchor->to->col) . ($twoCellAnchor->to->row + 1);
|
$toCoordinate = Coordinate::stringFromColumnIndex(((string) $twoCellAnchor->to->col) + 1) . ($twoCellAnchor->to->row + 1);
|
||||||
$toOffsetX = Drawing::EMUToPixels($twoCellAnchor->to->colOff);
|
$toOffsetX = Drawing::EMUToPixels($twoCellAnchor->to->colOff);
|
||||||
$toOffsetY = Drawing::EMUToPixels($twoCellAnchor->to->rowOff);
|
$toOffsetY = Drawing::EMUToPixels($twoCellAnchor->to->rowOff);
|
||||||
$graphic = $twoCellAnchor->graphicFrame->children('http://schemas.openxmlformats.org/drawingml/2006/main')->graphic;
|
$graphic = $twoCellAnchor->graphicFrame->children('http://schemas.openxmlformats.org/drawingml/2006/main')->graphic;
|
||||||
|
|
|
@ -207,7 +207,7 @@ class Xml extends BaseReader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
|
$tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1);
|
||||||
$tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
|
$tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
|
||||||
|
|
||||||
$worksheetInfo[] = $tmpInfo;
|
$worksheetInfo[] = $tmpInfo;
|
||||||
|
@ -587,7 +587,7 @@ class Xml extends BaseReader
|
||||||
foreach ($worksheet->Table->Column as $columnData) {
|
foreach ($worksheet->Table->Column as $columnData) {
|
||||||
$columnData_ss = $columnData->attributes($namespaces['ss']);
|
$columnData_ss = $columnData->attributes($namespaces['ss']);
|
||||||
if (isset($columnData_ss['Index'])) {
|
if (isset($columnData_ss['Index'])) {
|
||||||
$columnID = Coordinate::stringFromColumnIndex($columnData_ss['Index'] - 1);
|
$columnID = Coordinate::stringFromColumnIndex((int) $columnData_ss['Index']);
|
||||||
}
|
}
|
||||||
if (isset($columnData_ss['Width'])) {
|
if (isset($columnData_ss['Width'])) {
|
||||||
$columnWidth = $columnData_ss['Width'];
|
$columnWidth = $columnData_ss['Width'];
|
||||||
|
@ -611,7 +611,7 @@ class Xml extends BaseReader
|
||||||
foreach ($rowData->Cell as $cell) {
|
foreach ($rowData->Cell as $cell) {
|
||||||
$cell_ss = $cell->attributes($namespaces['ss']);
|
$cell_ss = $cell->attributes($namespaces['ss']);
|
||||||
if (isset($cell_ss['Index'])) {
|
if (isset($cell_ss['Index'])) {
|
||||||
$columnID = Coordinate::stringFromColumnIndex($cell_ss['Index'] - 1);
|
$columnID = Coordinate::stringFromColumnIndex((int) $cell_ss['Index']);
|
||||||
}
|
}
|
||||||
$cellRange = $columnID . $rowID;
|
$cellRange = $columnID . $rowID;
|
||||||
|
|
||||||
|
@ -631,7 +631,7 @@ class Xml extends BaseReader
|
||||||
$columnTo = $columnID;
|
$columnTo = $columnID;
|
||||||
if (isset($cell_ss['MergeAcross'])) {
|
if (isset($cell_ss['MergeAcross'])) {
|
||||||
$additionalMergedCells += (int) $cell_ss['MergeAcross'];
|
$additionalMergedCells += (int) $cell_ss['MergeAcross'];
|
||||||
$columnTo = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($columnID) + $cell_ss['MergeAcross'] - 1);
|
$columnTo = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($columnID) + $cell_ss['MergeAcross']);
|
||||||
}
|
}
|
||||||
$rowTo = $rowID;
|
$rowTo = $rowID;
|
||||||
if (isset($cell_ss['MergeDown'])) {
|
if (isset($cell_ss['MergeDown'])) {
|
||||||
|
@ -739,7 +739,7 @@ class Xml extends BaseReader
|
||||||
if ($columnReference[0] == '[') {
|
if ($columnReference[0] == '[') {
|
||||||
$columnReference = $columnNumber + trim($columnReference, '[]');
|
$columnReference = $columnNumber + trim($columnReference, '[]');
|
||||||
}
|
}
|
||||||
$A1CellReference = Coordinate::stringFromColumnIndex($columnReference - 1) . $rowReference;
|
$A1CellReference = Coordinate::stringFromColumnIndex($columnReference) . $rowReference;
|
||||||
$value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));
|
$value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,8 +372,6 @@ class ReferenceHelper
|
||||||
$allCoordinates = $pSheet->getCoordinates();
|
$allCoordinates = $pSheet->getCoordinates();
|
||||||
|
|
||||||
// Get coordinate of $pBefore
|
// Get coordinate of $pBefore
|
||||||
$beforeColumn = 'A';
|
|
||||||
$beforeRow = 1;
|
|
||||||
list($beforeColumn, $beforeRow) = Coordinate::coordinateFromString($pBefore);
|
list($beforeColumn, $beforeRow) = Coordinate::coordinateFromString($pBefore);
|
||||||
$beforeColumnIndex = Coordinate::columnIndexFromString($beforeColumn);
|
$beforeColumnIndex = Coordinate::columnIndexFromString($beforeColumn);
|
||||||
|
|
||||||
|
@ -385,7 +383,7 @@ class ReferenceHelper
|
||||||
if ($pNumCols < 0 && $beforeColumnIndex - 2 + $pNumCols > 0) {
|
if ($pNumCols < 0 && $beforeColumnIndex - 2 + $pNumCols > 0) {
|
||||||
for ($i = 1; $i <= $highestRow - 1; ++$i) {
|
for ($i = 1; $i <= $highestRow - 1; ++$i) {
|
||||||
for ($j = $beforeColumnIndex - 1 + $pNumCols; $j <= $beforeColumnIndex - 2; ++$j) {
|
for ($j = $beforeColumnIndex - 1 + $pNumCols; $j <= $beforeColumnIndex - 2; ++$j) {
|
||||||
$coordinate = Coordinate::stringFromColumnIndex($j) . $i;
|
$coordinate = Coordinate::stringFromColumnIndex($j + 1) . $i;
|
||||||
$pSheet->removeConditionalStyles($coordinate);
|
$pSheet->removeConditionalStyles($coordinate);
|
||||||
if ($pSheet->cellExists($coordinate)) {
|
if ($pSheet->cellExists($coordinate)) {
|
||||||
$pSheet->getCell($coordinate)->setValueExplicit('', DataType::TYPE_NULL);
|
$pSheet->getCell($coordinate)->setValueExplicit('', DataType::TYPE_NULL);
|
||||||
|
@ -399,7 +397,7 @@ class ReferenceHelper
|
||||||
if ($pNumRows < 0 && $beforeRow - 1 + $pNumRows > 0) {
|
if ($pNumRows < 0 && $beforeRow - 1 + $pNumRows > 0) {
|
||||||
for ($i = $beforeColumnIndex - 1; $i <= Coordinate::columnIndexFromString($highestColumn) - 1; ++$i) {
|
for ($i = $beforeColumnIndex - 1; $i <= Coordinate::columnIndexFromString($highestColumn) - 1; ++$i) {
|
||||||
for ($j = $beforeRow + $pNumRows; $j <= $beforeRow - 1; ++$j) {
|
for ($j = $beforeRow + $pNumRows; $j <= $beforeRow - 1; ++$j) {
|
||||||
$coordinate = Coordinate::stringFromColumnIndex($i) . $j;
|
$coordinate = Coordinate::stringFromColumnIndex($i + 1) . $j;
|
||||||
$pSheet->removeConditionalStyles($coordinate);
|
$pSheet->removeConditionalStyles($coordinate);
|
||||||
if ($pSheet->cellExists($coordinate)) {
|
if ($pSheet->cellExists($coordinate)) {
|
||||||
$pSheet->getCell($coordinate)->setValueExplicit('', DataType::TYPE_NULL);
|
$pSheet->getCell($coordinate)->setValueExplicit('', DataType::TYPE_NULL);
|
||||||
|
@ -423,7 +421,7 @@ class ReferenceHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
// New coordinate
|
// New coordinate
|
||||||
$newCoordinate = Coordinate::stringFromColumnIndex($cellIndex - 1 + $pNumCols) . ($cell->getRow() + $pNumRows);
|
$newCoordinate = Coordinate::stringFromColumnIndex($cellIndex + $pNumCols) . ($cell->getRow() + $pNumRows);
|
||||||
|
|
||||||
// Should the cell be updated? Move value and cellXf index from one cell to another.
|
// Should the cell be updated? Move value and cellXf index from one cell to another.
|
||||||
if (($cellIndex >= $beforeColumnIndex) && ($cell->getRow() >= $beforeRow)) {
|
if (($cellIndex >= $beforeColumnIndex) && ($cell->getRow() >= $beforeRow)) {
|
||||||
|
@ -459,12 +457,12 @@ class ReferenceHelper
|
||||||
if ($pNumCols > 0 && $beforeColumnIndex - 2 > 0) {
|
if ($pNumCols > 0 && $beforeColumnIndex - 2 > 0) {
|
||||||
for ($i = $beforeRow; $i <= $highestRow - 1; ++$i) {
|
for ($i = $beforeRow; $i <= $highestRow - 1; ++$i) {
|
||||||
// Style
|
// Style
|
||||||
$coordinate = Coordinate::stringFromColumnIndex($beforeColumnIndex - 2) . $i;
|
$coordinate = Coordinate::stringFromColumnIndex($beforeColumnIndex - 1) . $i;
|
||||||
if ($pSheet->cellExists($coordinate)) {
|
if ($pSheet->cellExists($coordinate)) {
|
||||||
$xfIndex = $pSheet->getCell($coordinate)->getXfIndex();
|
$xfIndex = $pSheet->getCell($coordinate)->getXfIndex();
|
||||||
$conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ?
|
$conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ?
|
||||||
$pSheet->getConditionalStyles($coordinate) : false;
|
$pSheet->getConditionalStyles($coordinate) : false;
|
||||||
for ($j = $beforeColumnIndex - 1; $j <= $beforeColumnIndex - 2 + $pNumCols; ++$j) {
|
for ($j = $beforeColumnIndex; $j <= $beforeColumnIndex - 1 + $pNumCols; ++$j) {
|
||||||
$pSheet->getCellByColumnAndRow($j, $i)->setXfIndex($xfIndex);
|
$pSheet->getCellByColumnAndRow($j, $i)->setXfIndex($xfIndex);
|
||||||
if ($conditionalStyles) {
|
if ($conditionalStyles) {
|
||||||
$cloned = [];
|
$cloned = [];
|
||||||
|
@ -479,7 +477,7 @@ class ReferenceHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($pNumRows > 0 && $beforeRow - 1 > 0) {
|
if ($pNumRows > 0 && $beforeRow - 1 > 0) {
|
||||||
for ($i = $beforeColumnIndex - 1; $i <= Coordinate::columnIndexFromString($highestColumn) - 1; ++$i) {
|
for ($i = $beforeColumnIndex; $i <= Coordinate::columnIndexFromString($highestColumn); ++$i) {
|
||||||
// Style
|
// Style
|
||||||
$coordinate = Coordinate::stringFromColumnIndex($i) . ($beforeRow - 1);
|
$coordinate = Coordinate::stringFromColumnIndex($i) . ($beforeRow - 1);
|
||||||
if ($pSheet->cellExists($coordinate)) {
|
if ($pSheet->cellExists($coordinate)) {
|
||||||
|
@ -541,8 +539,8 @@ class ReferenceHelper
|
||||||
$deleteColumn = $columnIndex + $pNumCols - 1;
|
$deleteColumn = $columnIndex + $pNumCols - 1;
|
||||||
$deleteCount = abs($pNumCols);
|
$deleteCount = abs($pNumCols);
|
||||||
for ($i = 1; $i <= $deleteCount; ++$i) {
|
for ($i = 1; $i <= $deleteCount; ++$i) {
|
||||||
if (isset($autoFilterColumns[Coordinate::stringFromColumnIndex($deleteColumn)])) {
|
if (isset($autoFilterColumns[Coordinate::stringFromColumnIndex($deleteColumn + 1)])) {
|
||||||
$autoFilter->clearColumn(Coordinate::stringFromColumnIndex($deleteColumn));
|
$autoFilter->clearColumn(Coordinate::stringFromColumnIndex($deleteColumn + 1));
|
||||||
}
|
}
|
||||||
++$deleteColumn;
|
++$deleteColumn;
|
||||||
}
|
}
|
||||||
|
@ -551,25 +549,20 @@ class ReferenceHelper
|
||||||
|
|
||||||
// Shuffle columns in autofilter range
|
// Shuffle columns in autofilter range
|
||||||
if ($pNumCols > 0) {
|
if ($pNumCols > 0) {
|
||||||
// For insert, we shuffle from end to beginning to avoid overwriting
|
|
||||||
$startColID = Coordinate::stringFromColumnIndex($startCol - 1);
|
|
||||||
$toColID = Coordinate::stringFromColumnIndex($startCol + $pNumCols - 1);
|
|
||||||
$endColID = Coordinate::stringFromColumnIndex($rangeEnd[0]);
|
|
||||||
|
|
||||||
$startColRef = $startCol;
|
$startColRef = $startCol;
|
||||||
$endColRef = $rangeEnd[0];
|
$endColRef = $rangeEnd[0];
|
||||||
$toColRef = $rangeEnd[0] + $pNumCols;
|
$toColRef = $rangeEnd[0] + $pNumCols;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
$autoFilter->shiftColumn(Coordinate::stringFromColumnIndex($endColRef - 1), Coordinate::stringFromColumnIndex($toColRef - 1));
|
$autoFilter->shiftColumn(Coordinate::stringFromColumnIndex($endColRef), Coordinate::stringFromColumnIndex($toColRef));
|
||||||
--$endColRef;
|
--$endColRef;
|
||||||
--$toColRef;
|
--$toColRef;
|
||||||
} while ($startColRef <= $endColRef);
|
} while ($startColRef <= $endColRef);
|
||||||
} else {
|
} else {
|
||||||
// For delete, we shuffle from beginning to end to avoid overwriting
|
// For delete, we shuffle from beginning to end to avoid overwriting
|
||||||
$startColID = Coordinate::stringFromColumnIndex($startCol - 1);
|
$startColID = Coordinate::stringFromColumnIndex($startCol);
|
||||||
$toColID = Coordinate::stringFromColumnIndex($startCol + $pNumCols - 1);
|
$toColID = Coordinate::stringFromColumnIndex($startCol + $pNumCols);
|
||||||
$endColID = Coordinate::stringFromColumnIndex($rangeEnd[0]);
|
$endColID = Coordinate::stringFromColumnIndex($rangeEnd[0] + 1);
|
||||||
do {
|
do {
|
||||||
$autoFilter->shiftColumn($startColID, $toColID);
|
$autoFilter->shiftColumn($startColID, $toColID);
|
||||||
++$startColID;
|
++$startColID;
|
||||||
|
@ -881,7 +874,7 @@ class ReferenceHelper
|
||||||
|
|
||||||
// Create new column reference
|
// Create new column reference
|
||||||
if ($updateColumn) {
|
if ($updateColumn) {
|
||||||
$newColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($newColumn) - 1 + $pNumCols);
|
$newColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($newColumn) + $pNumCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create new row reference
|
// Create new row reference
|
||||||
|
|
|
@ -111,8 +111,8 @@ class Xls
|
||||||
$distanceX = 0;
|
$distanceX = 0;
|
||||||
|
|
||||||
// add the widths of the spanning columns
|
// add the widths of the spanning columns
|
||||||
$startColumnIndex = Coordinate::columnIndexFromString($startColumn) - 1; // 1-based
|
$startColumnIndex = Coordinate::columnIndexFromString($startColumn);
|
||||||
$endColumnIndex = Coordinate::columnIndexFromString($endColumn) - 1; // 1-based
|
$endColumnIndex = Coordinate::columnIndexFromString($endColumn);
|
||||||
for ($i = $startColumnIndex; $i <= $endColumnIndex; ++$i) {
|
for ($i = $startColumnIndex; $i <= $endColumnIndex; ++$i) {
|
||||||
$distanceX += self::sizeCol($sheet, Coordinate::stringFromColumnIndex($i));
|
$distanceX += self::sizeCol($sheet, Coordinate::stringFromColumnIndex($i));
|
||||||
}
|
}
|
||||||
|
@ -212,7 +212,7 @@ class Xls
|
||||||
public static function oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height)
|
public static function oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height)
|
||||||
{
|
{
|
||||||
list($column, $row) = Coordinate::coordinateFromString($coordinates);
|
list($column, $row) = Coordinate::coordinateFromString($coordinates);
|
||||||
$col_start = Coordinate::columnIndexFromString($column) - 1;
|
$col_start = Coordinate::columnIndexFromString($column);
|
||||||
$row_start = $row - 1;
|
$row_start = $row - 1;
|
||||||
|
|
||||||
$x1 = $offsetX;
|
$x1 = $offsetX;
|
||||||
|
|
|
@ -210,8 +210,8 @@ class Style extends Supervisor
|
||||||
$rangeEnd = Coordinate::coordinateFromString($rangeB);
|
$rangeEnd = Coordinate::coordinateFromString($rangeB);
|
||||||
|
|
||||||
// Translate column into index
|
// Translate column into index
|
||||||
$rangeStart[0] = Coordinate::columnIndexFromString($rangeStart[0]) - 1;
|
$rangeStart[0] = Coordinate::columnIndexFromString($rangeStart[0]);
|
||||||
$rangeEnd[0] = Coordinate::columnIndexFromString($rangeEnd[0]) - 1;
|
$rangeEnd[0] = Coordinate::columnIndexFromString($rangeEnd[0]);
|
||||||
|
|
||||||
// Make sure we can loop upwards on rows and columns
|
// Make sure we can loop upwards on rows and columns
|
||||||
if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {
|
if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {
|
||||||
|
|
|
@ -202,7 +202,7 @@ class AutoFilter
|
||||||
public function getColumnByOffset($pColumnOffset)
|
public function getColumnByOffset($pColumnOffset)
|
||||||
{
|
{
|
||||||
list($rangeStart, $rangeEnd) = Coordinate::rangeBoundaries($this->range);
|
list($rangeStart, $rangeEnd) = Coordinate::rangeBoundaries($this->range);
|
||||||
$pColumn = Coordinate::stringFromColumnIndex($rangeStart[0] + $pColumnOffset - 1);
|
$pColumn = Coordinate::stringFromColumnIndex($rangeStart[0] + $pColumnOffset);
|
||||||
|
|
||||||
return $this->getColumn($pColumn);
|
return $this->getColumn($pColumn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,14 +11,7 @@ abstract class CellIterator implements \Iterator
|
||||||
*
|
*
|
||||||
* @var Worksheet
|
* @var Worksheet
|
||||||
*/
|
*/
|
||||||
protected $subject;
|
protected $worksheet;
|
||||||
|
|
||||||
/**
|
|
||||||
* Current iterator position.
|
|
||||||
*
|
|
||||||
* @var mixed
|
|
||||||
*/
|
|
||||||
protected $position;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iterate only existing cells.
|
* Iterate only existing cells.
|
||||||
|
@ -32,7 +25,7 @@ abstract class CellIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
unset($this->subject);
|
unset($this->worksheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,26 +7,33 @@ use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
|
||||||
|
|
||||||
class ColumnCellIterator extends CellIterator
|
class ColumnCellIterator extends CellIterator
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Current iterator position.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $currentRow;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Column index.
|
* Column index.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $columnIndex;
|
private $columnIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start position.
|
* Start position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
protected $startRow = 1;
|
private $startRow = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End position.
|
* End position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
protected $endRow = 1;
|
private $endRow = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new row iterator.
|
* Create a new row iterator.
|
||||||
|
@ -39,8 +46,8 @@ class ColumnCellIterator extends CellIterator
|
||||||
public function __construct(Worksheet $subject = null, $columnIndex = 'A', $startRow = 1, $endRow = null)
|
public function __construct(Worksheet $subject = null, $columnIndex = 'A', $startRow = 1, $endRow = null)
|
||||||
{
|
{
|
||||||
// Set subject
|
// Set subject
|
||||||
$this->subject = $subject;
|
$this->worksheet = $subject;
|
||||||
$this->columnIndex = Coordinate::columnIndexFromString($columnIndex) - 1;
|
$this->columnIndex = Coordinate::columnIndexFromString($columnIndex);
|
||||||
$this->resetEnd($endRow);
|
$this->resetEnd($endRow);
|
||||||
$this->resetStart($startRow);
|
$this->resetStart($startRow);
|
||||||
}
|
}
|
||||||
|
@ -50,7 +57,7 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
unset($this->subject);
|
unset($this->worksheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,7 +89,7 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function resetEnd($endRow = null)
|
public function resetEnd($endRow = null)
|
||||||
{
|
{
|
||||||
$this->endRow = ($endRow) ? $endRow : $this->subject->getHighestRow();
|
$this->endRow = ($endRow) ? $endRow : $this->worksheet->getHighestRow();
|
||||||
$this->adjustForExistingOnlyRange();
|
$this->adjustForExistingOnlyRange();
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -101,10 +108,10 @@ class ColumnCellIterator extends CellIterator
|
||||||
{
|
{
|
||||||
if (($row < $this->startRow) || ($row > $this->endRow)) {
|
if (($row < $this->startRow) || ($row > $this->endRow)) {
|
||||||
throw new PhpSpreadsheetException("Row $row is out of range ({$this->startRow} - {$this->endRow})");
|
throw new PhpSpreadsheetException("Row $row is out of range ({$this->startRow} - {$this->endRow})");
|
||||||
} elseif ($this->onlyExistingCells && !($this->subject->cellExistsByColumnAndRow($this->columnIndex, $row))) {
|
} elseif ($this->onlyExistingCells && !($this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $row))) {
|
||||||
throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist');
|
throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist');
|
||||||
}
|
}
|
||||||
$this->position = $row;
|
$this->currentRow = $row;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -114,7 +121,7 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function rewind()
|
public function rewind()
|
||||||
{
|
{
|
||||||
$this->position = $this->startRow;
|
$this->currentRow = $this->startRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,7 +131,7 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function current()
|
public function current()
|
||||||
{
|
{
|
||||||
return $this->subject->getCellByColumnAndRow($this->columnIndex, $this->position);
|
return $this->worksheet->getCellByColumnAndRow($this->columnIndex, $this->currentRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -134,7 +141,7 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function key()
|
public function key()
|
||||||
{
|
{
|
||||||
return $this->position;
|
return $this->currentRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -143,10 +150,10 @@ class ColumnCellIterator extends CellIterator
|
||||||
public function next()
|
public function next()
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
++$this->position;
|
++$this->currentRow;
|
||||||
} while (($this->onlyExistingCells) &&
|
} while (($this->onlyExistingCells) &&
|
||||||
(!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->position)) &&
|
(!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->currentRow)) &&
|
||||||
($this->position <= $this->endRow));
|
($this->currentRow <= $this->endRow));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -154,15 +161,15 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function prev()
|
public function prev()
|
||||||
{
|
{
|
||||||
if ($this->position <= $this->startRow) {
|
if ($this->currentRow <= $this->startRow) {
|
||||||
throw new PhpSpreadsheetException("Row is already at the beginning of range ({$this->startRow} - {$this->endRow})");
|
throw new PhpSpreadsheetException("Row is already at the beginning of range ({$this->startRow} - {$this->endRow})");
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
--$this->position;
|
--$this->currentRow;
|
||||||
} while (($this->onlyExistingCells) &&
|
} while (($this->onlyExistingCells) &&
|
||||||
(!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->position)) &&
|
(!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->currentRow)) &&
|
||||||
($this->position >= $this->startRow));
|
($this->currentRow >= $this->startRow));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -172,7 +179,7 @@ class ColumnCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function valid()
|
public function valid()
|
||||||
{
|
{
|
||||||
return $this->position <= $this->endRow;
|
return $this->currentRow <= $this->endRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -183,14 +190,14 @@ class ColumnCellIterator extends CellIterator
|
||||||
protected function adjustForExistingOnlyRange()
|
protected function adjustForExistingOnlyRange()
|
||||||
{
|
{
|
||||||
if ($this->onlyExistingCells) {
|
if ($this->onlyExistingCells) {
|
||||||
while ((!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->startRow)) &&
|
while ((!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->startRow)) &&
|
||||||
($this->startRow <= $this->endRow)) {
|
($this->startRow <= $this->endRow)) {
|
||||||
++$this->startRow;
|
++$this->startRow;
|
||||||
}
|
}
|
||||||
if ($this->startRow > $this->endRow) {
|
if ($this->startRow > $this->endRow) {
|
||||||
throw new PhpSpreadsheetException('No cells exist within the specified range');
|
throw new PhpSpreadsheetException('No cells exist within the specified range');
|
||||||
}
|
}
|
||||||
while ((!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->endRow)) &&
|
while ((!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->endRow)) &&
|
||||||
($this->endRow >= $this->startRow)) {
|
($this->endRow >= $this->startRow)) {
|
||||||
--$this->endRow;
|
--$this->endRow;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,40 +13,40 @@ class ColumnIterator implements \Iterator
|
||||||
*
|
*
|
||||||
* @var Worksheet
|
* @var Worksheet
|
||||||
*/
|
*/
|
||||||
private $subject;
|
private $worksheet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current iterator position.
|
* Current iterator position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $position = 0;
|
private $currentColumnIndex = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start position.
|
* Start position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $startColumn = 0;
|
private $startColumnIndex = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End position.
|
* End position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $endColumn = 0;
|
private $endColumnIndex = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new column iterator.
|
* Create a new column iterator.
|
||||||
*
|
*
|
||||||
* @param Worksheet $subject The worksheet to iterate over
|
* @param Worksheet $worksheet The worksheet to iterate over
|
||||||
* @param string $startColumn The column address at which to start iterating
|
* @param string $startColumn The column address at which to start iterating
|
||||||
* @param string $endColumn Optionally, the column address at which to stop iterating
|
* @param string $endColumn Optionally, the column address at which to stop iterating
|
||||||
*/
|
*/
|
||||||
public function __construct(Worksheet $subject, $startColumn = 'A', $endColumn = null)
|
public function __construct(Worksheet $worksheet, $startColumn = 'A', $endColumn = null)
|
||||||
{
|
{
|
||||||
// Set subject
|
// Set subject
|
||||||
$this->subject = $subject;
|
$this->worksheet = $worksheet;
|
||||||
$this->resetEnd($endColumn);
|
$this->resetEnd($endColumn);
|
||||||
$this->resetStart($startColumn);
|
$this->resetStart($startColumn);
|
||||||
}
|
}
|
||||||
|
@ -56,13 +56,13 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
unset($this->subject);
|
unset($this->worksheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (Re)Set the start column and the current column pointer.
|
* (Re)Set the start column and the current column pointer.
|
||||||
*
|
*
|
||||||
* @param int $startColumn The column address at which to start iterating
|
* @param string $startColumn The column address at which to start iterating
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
|
@ -70,14 +70,14 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function resetStart($startColumn = 'A')
|
public function resetStart($startColumn = 'A')
|
||||||
{
|
{
|
||||||
$startColumnIndex = Coordinate::columnIndexFromString($startColumn) - 1;
|
$startColumnIndex = Coordinate::columnIndexFromString($startColumn);
|
||||||
if ($startColumnIndex > Coordinate::columnIndexFromString($this->subject->getHighestColumn()) - 1) {
|
if ($startColumnIndex > Coordinate::columnIndexFromString($this->worksheet->getHighestColumn())) {
|
||||||
throw new Exception("Start column ({$startColumn}) is beyond highest column ({$this->subject->getHighestColumn()})");
|
throw new Exception("Start column ({$startColumn}) is beyond highest column ({$this->worksheet->getHighestColumn()})");
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->startColumn = $startColumnIndex;
|
$this->startColumnIndex = $startColumnIndex;
|
||||||
if ($this->endColumn < $this->startColumn) {
|
if ($this->endColumnIndex < $this->startColumnIndex) {
|
||||||
$this->endColumn = $this->startColumn;
|
$this->endColumnIndex = $this->startColumnIndex;
|
||||||
}
|
}
|
||||||
$this->seek($startColumn);
|
$this->seek($startColumn);
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function resetEnd($endColumn = null)
|
public function resetEnd($endColumn = null)
|
||||||
{
|
{
|
||||||
$endColumn = ($endColumn) ? $endColumn : $this->subject->getHighestColumn();
|
$endColumn = $endColumn ? $endColumn : $this->worksheet->getHighestColumn();
|
||||||
$this->endColumn = Coordinate::columnIndexFromString($endColumn) - 1;
|
$this->endColumnIndex = Coordinate::columnIndexFromString($endColumn);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -110,11 +110,11 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function seek($column = 'A')
|
public function seek($column = 'A')
|
||||||
{
|
{
|
||||||
$column = Coordinate::columnIndexFromString($column) - 1;
|
$column = Coordinate::columnIndexFromString($column);
|
||||||
if (($column < $this->startColumn) || ($column > $this->endColumn)) {
|
if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) {
|
||||||
throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumn} - {$this->endColumn})");
|
throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})");
|
||||||
}
|
}
|
||||||
$this->position = $column;
|
$this->currentColumnIndex = $column;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function rewind()
|
public function rewind()
|
||||||
{
|
{
|
||||||
$this->position = $this->startColumn;
|
$this->currentColumnIndex = $this->startColumnIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -134,7 +134,7 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function current()
|
public function current()
|
||||||
{
|
{
|
||||||
return new Column($this->subject, Coordinate::stringFromColumnIndex($this->position));
|
return new Column($this->worksheet, Coordinate::stringFromColumnIndex($this->currentColumnIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -144,7 +144,7 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function key()
|
public function key()
|
||||||
{
|
{
|
||||||
return Coordinate::stringFromColumnIndex($this->position);
|
return Coordinate::stringFromColumnIndex($this->currentColumnIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -152,7 +152,7 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function next()
|
public function next()
|
||||||
{
|
{
|
||||||
++$this->position;
|
++$this->currentColumnIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -162,10 +162,10 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function prev()
|
public function prev()
|
||||||
{
|
{
|
||||||
if ($this->position <= $this->startColumn) {
|
if ($this->currentColumnIndex <= $this->startColumnIndex) {
|
||||||
throw new PhpSpreadsheetException('Column is already at the beginning of range (' . Coordinate::stringFromColumnIndex($this->endColumn) . ' - ' . Coordinate::stringFromColumnIndex($this->endColumn) . ')');
|
throw new PhpSpreadsheetException('Column is already at the beginning of range (' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ' - ' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ')');
|
||||||
}
|
}
|
||||||
--$this->position;
|
--$this->currentColumnIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -175,6 +175,6 @@ class ColumnIterator implements \Iterator
|
||||||
*/
|
*/
|
||||||
public function valid()
|
public function valid()
|
||||||
{
|
{
|
||||||
return $this->position <= $this->endColumn;
|
return $this->currentColumnIndex <= $this->endColumnIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -749,7 +749,7 @@ class PageSetup
|
||||||
* @param int $index Identifier for a specific print area range allowing several ranges to be set
|
* @param int $index Identifier for a specific print area range allowing several ranges to be set
|
||||||
* When the method is "O"verwrite, then a positive integer index will overwrite that indexed
|
* When the method is "O"verwrite, then a positive integer index will overwrite that indexed
|
||||||
* entry in the print areas list; a negative index value will identify which entry to
|
* entry in the print areas list; a negative index value will identify which entry to
|
||||||
* overwrite working bacward through the print area to the list, with the last entry as -1.
|
* overwrite working backward through the print area to the list, with the last entry as -1.
|
||||||
* Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.
|
* Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.
|
||||||
* When the method is "I"nsert, then a positive index will insert after that indexed entry in
|
* When the method is "I"nsert, then a positive index will insert after that indexed entry in
|
||||||
* the print areas list, while a negative index will insert before the indexed entry.
|
* the print areas list, while a negative index will insert before the indexed entry.
|
||||||
|
|
|
@ -7,39 +7,46 @@ use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
|
||||||
|
|
||||||
class RowCellIterator extends CellIterator
|
class RowCellIterator extends CellIterator
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Current iterator position.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $currentColumnIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Row index.
|
* Row index.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
protected $rowIndex;
|
private $rowIndex = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start position.
|
* Start position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
protected $startColumn = 0;
|
private $startColumnIndex = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End position.
|
* End position.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
protected $endColumn = 0;
|
private $endColumnIndex = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new column iterator.
|
* Create a new column iterator.
|
||||||
*
|
*
|
||||||
* @param Worksheet $subject The worksheet to iterate over
|
* @param Worksheet $worksheet The worksheet to iterate over
|
||||||
* @param int $rowIndex The row that we want to iterate
|
* @param int $rowIndex The row that we want to iterate
|
||||||
* @param string $startColumn The column address at which to start iterating
|
* @param string $startColumn The column address at which to start iterating
|
||||||
* @param string $endColumn Optionally, the column address at which to stop iterating
|
* @param string $endColumn Optionally, the column address at which to stop iterating
|
||||||
*/
|
*/
|
||||||
public function __construct(Worksheet $subject = null, $rowIndex = 1, $startColumn = 'A', $endColumn = null)
|
public function __construct(Worksheet $worksheet = null, $rowIndex = 1, $startColumn = 'A', $endColumn = null)
|
||||||
{
|
{
|
||||||
// Set subject and row index
|
// Set subject and row index
|
||||||
$this->subject = $subject;
|
$this->worksheet = $worksheet;
|
||||||
$this->rowIndex = $rowIndex;
|
$this->rowIndex = $rowIndex;
|
||||||
$this->resetEnd($endColumn);
|
$this->resetEnd($endColumn);
|
||||||
$this->resetStart($startColumn);
|
$this->resetStart($startColumn);
|
||||||
|
@ -50,13 +57,13 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
unset($this->subject);
|
unset($this->worksheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (Re)Set the start column and the current column pointer.
|
* (Re)Set the start column and the current column pointer.
|
||||||
*
|
*
|
||||||
* @param int $startColumn The column address at which to start iterating
|
* @param string $startColumn The column address at which to start iterating
|
||||||
*
|
*
|
||||||
* @throws PhpSpreadsheetException
|
* @throws PhpSpreadsheetException
|
||||||
*
|
*
|
||||||
|
@ -64,10 +71,9 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function resetStart($startColumn = 'A')
|
public function resetStart($startColumn = 'A')
|
||||||
{
|
{
|
||||||
$startColumnIndex = Coordinate::columnIndexFromString($startColumn) - 1;
|
$this->startColumnIndex = Coordinate::columnIndexFromString($startColumn);
|
||||||
$this->startColumn = $startColumnIndex;
|
|
||||||
$this->adjustForExistingOnlyRange();
|
$this->adjustForExistingOnlyRange();
|
||||||
$this->seek(Coordinate::stringFromColumnIndex($this->startColumn));
|
$this->seek(Coordinate::stringFromColumnIndex($this->startColumnIndex));
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -83,8 +89,8 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function resetEnd($endColumn = null)
|
public function resetEnd($endColumn = null)
|
||||||
{
|
{
|
||||||
$endColumn = ($endColumn) ? $endColumn : $this->subject->getHighestColumn();
|
$endColumn = $endColumn ? $endColumn : $this->worksheet->getHighestColumn();
|
||||||
$this->endColumn = Coordinate::columnIndexFromString($endColumn) - 1;
|
$this->endColumnIndex = Coordinate::columnIndexFromString($endColumn);
|
||||||
$this->adjustForExistingOnlyRange();
|
$this->adjustForExistingOnlyRange();
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -101,13 +107,13 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function seek($column = 'A')
|
public function seek($column = 'A')
|
||||||
{
|
{
|
||||||
$column = Coordinate::columnIndexFromString($column) - 1;
|
$column = Coordinate::columnIndexFromString($column);
|
||||||
if (($column < $this->startColumn) || ($column > $this->endColumn)) {
|
if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) {
|
||||||
throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumn} - {$this->endColumn})");
|
throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})");
|
||||||
} elseif ($this->onlyExistingCells && !($this->subject->cellExistsByColumnAndRow($column, $this->rowIndex))) {
|
} elseif ($this->onlyExistingCells && !($this->worksheet->cellExistsByColumnAndRow($column, $this->rowIndex))) {
|
||||||
throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist');
|
throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist');
|
||||||
}
|
}
|
||||||
$this->position = $column;
|
$this->currentColumnIndex = $column;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -117,7 +123,7 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function rewind()
|
public function rewind()
|
||||||
{
|
{
|
||||||
$this->position = $this->startColumn;
|
$this->currentColumnIndex = $this->startColumnIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -127,7 +133,7 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function current()
|
public function current()
|
||||||
{
|
{
|
||||||
return $this->subject->getCellByColumnAndRow($this->position, $this->rowIndex);
|
return $this->worksheet->getCellByColumnAndRow($this->currentColumnIndex, $this->rowIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -137,7 +143,7 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function key()
|
public function key()
|
||||||
{
|
{
|
||||||
return Coordinate::stringFromColumnIndex($this->position);
|
return Coordinate::stringFromColumnIndex($this->currentColumnIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -146,8 +152,8 @@ class RowCellIterator extends CellIterator
|
||||||
public function next()
|
public function next()
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
++$this->position;
|
++$this->currentColumnIndex;
|
||||||
} while (($this->onlyExistingCells) && (!$this->subject->cellExistsByColumnAndRow($this->position, $this->rowIndex)) && ($this->position <= $this->endColumn));
|
} while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex <= $this->endColumnIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -157,12 +163,12 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function prev()
|
public function prev()
|
||||||
{
|
{
|
||||||
if ($this->position <= $this->startColumn) {
|
if ($this->currentColumnIndex <= $this->startColumnIndex) {
|
||||||
throw new PhpSpreadsheetException('Column is already at the beginning of range (' . Coordinate::stringFromColumnIndex($this->endColumn) . ' - ' . Coordinate::stringFromColumnIndex($this->endColumn) . ')');
|
throw new PhpSpreadsheetException('Column is already at the beginning of range (' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ' - ' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ')');
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
--$this->position;
|
--$this->currentColumnIndex;
|
||||||
} while (($this->onlyExistingCells) && (!$this->subject->cellExistsByColumnAndRow($this->position, $this->rowIndex)) && ($this->position >= $this->startColumn));
|
} while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex >= $this->startColumnIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -172,7 +178,7 @@ class RowCellIterator extends CellIterator
|
||||||
*/
|
*/
|
||||||
public function valid()
|
public function valid()
|
||||||
{
|
{
|
||||||
return $this->position <= $this->endColumn;
|
return $this->currentColumnIndex <= $this->endColumnIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -183,16 +189,16 @@ class RowCellIterator extends CellIterator
|
||||||
protected function adjustForExistingOnlyRange()
|
protected function adjustForExistingOnlyRange()
|
||||||
{
|
{
|
||||||
if ($this->onlyExistingCells) {
|
if ($this->onlyExistingCells) {
|
||||||
while ((!$this->subject->cellExistsByColumnAndRow($this->startColumn, $this->rowIndex)) && ($this->startColumn <= $this->endColumn)) {
|
while ((!$this->worksheet->cellExistsByColumnAndRow($this->startColumnIndex, $this->rowIndex)) && ($this->startColumnIndex <= $this->endColumnIndex)) {
|
||||||
++$this->startColumn;
|
++$this->startColumnIndex;
|
||||||
}
|
}
|
||||||
if ($this->startColumn > $this->endColumn) {
|
if ($this->startColumnIndex > $this->endColumnIndex) {
|
||||||
throw new PhpSpreadsheetException('No cells exist within the specified range');
|
throw new PhpSpreadsheetException('No cells exist within the specified range');
|
||||||
}
|
}
|
||||||
while ((!$this->subject->cellExistsByColumnAndRow($this->endColumn, $this->rowIndex)) && ($this->endColumn >= $this->startColumn)) {
|
while ((!$this->worksheet->cellExistsByColumnAndRow($this->endColumnIndex, $this->rowIndex)) && ($this->endColumnIndex >= $this->startColumnIndex)) {
|
||||||
--$this->endColumn;
|
--$this->endColumnIndex;
|
||||||
}
|
}
|
||||||
if ($this->endColumn < $this->startColumn) {
|
if ($this->endColumnIndex < $this->startColumnIndex) {
|
||||||
throw new PhpSpreadsheetException('No cells exist within the specified range');
|
throw new PhpSpreadsheetException('No cells exist within the specified range');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1123,15 +1123,15 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Set a cell value by using numeric cell coordinates.
|
* Set a cell value by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
* @param mixed $pValue Value of the cell
|
* @param mixed $value Value of the cell
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function setCellValueByColumnAndRow($pColumn, $pRow, $pValue)
|
public function setCellValueByColumnAndRow($columnIndex, $row, $value)
|
||||||
{
|
{
|
||||||
$this->getCellByColumnAndRow($pColumn, $pRow)->setValue($pValue);
|
$this->getCellByColumnAndRow($columnIndex, $row)->setValue($value);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -1156,16 +1156,16 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Set a cell value by using numeric cell coordinates.
|
* Set a cell value by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
* @param mixed $pValue Value of the cell
|
* @param mixed $value Value of the cell
|
||||||
* @param string $pDataType Explicit data type, see DataType::TYPE_*
|
* @param string $dataType Explicit data type, see DataType::TYPE_*
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function setCellValueExplicitByColumnAndRow($pColumn, $pRow, $pValue, $pDataType)
|
public function setCellValueExplicitByColumnAndRow($columnIndex, $row, $value, $dataType)
|
||||||
{
|
{
|
||||||
$this->getCellByColumnAndRow($pColumn, $pRow)->setValueExplicit($pValue, $pDataType);
|
$this->getCellByColumnAndRow($columnIndex, $row)->setValueExplicit($value, $dataType);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -1222,17 +1222,17 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Get cell at a specific coordinate by using numeric cell coordinates.
|
* Get cell at a specific coordinate by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param string $pColumn Numeric column coordinate of the cell
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param string $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
* @param bool $createIfNotExists Flag indicating whether a new cell should be created if it doesn't
|
* @param bool $createIfNotExists Flag indicating whether a new cell should be created if it doesn't
|
||||||
* already exist, or a null should be returned instead
|
* already exist, or a null should be returned instead
|
||||||
*
|
*
|
||||||
* @return null|Cell Cell that was found/created or null
|
* @return null|Cell Cell that was found/created or null
|
||||||
*/
|
*/
|
||||||
public function getCellByColumnAndRow($pColumn, $pRow, $createIfNotExists = true)
|
public function getCellByColumnAndRow($columnIndex, $row, $createIfNotExists = true)
|
||||||
{
|
{
|
||||||
$columnLetter = Coordinate::stringFromColumnIndex($pColumn);
|
$columnLetter = Coordinate::stringFromColumnIndex($columnIndex);
|
||||||
$coordinate = $columnLetter . $pRow;
|
$coordinate = $columnLetter . $row;
|
||||||
|
|
||||||
if ($this->cellCollection->has($coordinate)) {
|
if ($this->cellCollection->has($coordinate)) {
|
||||||
return $this->cellCollection->get($coordinate);
|
return $this->cellCollection->get($coordinate);
|
||||||
|
@ -1330,14 +1330,14 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Cell at a specific coordinate by using numeric cell coordinates exists?
|
* Cell at a specific coordinate by using numeric cell coordinates exists?
|
||||||
*
|
*
|
||||||
* @param string $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param string $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function cellExistsByColumnAndRow($pColumn, $pRow)
|
public function cellExistsByColumnAndRow($columnIndex, $row)
|
||||||
{
|
{
|
||||||
return $this->cellExists(Coordinate::stringFromColumnIndex($pColumn) . $pRow);
|
return $this->cellExists(Coordinate::stringFromColumnIndex($columnIndex) . $row);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1397,13 +1397,13 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Get column dimension at a specific column by using numeric cell coordinates.
|
* Get column dimension at a specific column by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
*
|
*
|
||||||
* @return ColumnDimension
|
* @return ColumnDimension
|
||||||
*/
|
*/
|
||||||
public function getColumnDimensionByColumn($pColumn)
|
public function getColumnDimensionByColumn($columnIndex)
|
||||||
{
|
{
|
||||||
return $this->getColumnDimension(Coordinate::stringFromColumnIndex($pColumn));
|
return $this->getColumnDimension(Coordinate::stringFromColumnIndex($columnIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1511,24 +1511,24 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Get style for cell by using numeric cell coordinates.
|
* Get style for cell by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex1 Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row1 Numeric row coordinate of the cell
|
||||||
* @param int pColumn2 Numeric column coordinate of the range cell (A = 0)
|
* @param int $columnIndex2 Numeric column coordinate of the range cell
|
||||||
* @param int pRow2 Numeric row coordinate of the range cell
|
* @param int $row2 Numeric row coordinate of the range cell
|
||||||
* @param null|mixed $pColumn2
|
* @param null|int $columnIndex2
|
||||||
* @param null|mixed $pRow2
|
* @param null|int $row2
|
||||||
*
|
*
|
||||||
* @return Style
|
* @return Style
|
||||||
*/
|
*/
|
||||||
public function getStyleByColumnAndRow($pColumn, $pRow, $pColumn2 = null, $pRow2 = null)
|
public function getStyleByColumnAndRow($columnIndex1, $row1, $columnIndex2 = null, $row2 = null)
|
||||||
{
|
{
|
||||||
if ($pColumn2 !== null && $pRow2 !== null) {
|
if ($columnIndex2 !== null && $row2 !== null) {
|
||||||
$cellRange = Coordinate::stringFromColumnIndex($pColumn) . $pRow . ':' . Coordinate::stringFromColumnIndex($pColumn2) . $pRow2;
|
$cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2;
|
||||||
|
|
||||||
return $this->getStyle($cellRange);
|
return $this->getStyle($cellRange);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->getStyle(Coordinate::stringFromColumnIndex($pColumn) . $pRow);
|
return $this->getStyle(Coordinate::stringFromColumnIndex($columnIndex1) . $row1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1569,7 +1569,7 @@ class Worksheet implements IComparable
|
||||||
// Loop through cells and apply styles
|
// Loop through cells and apply styles
|
||||||
for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {
|
for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {
|
||||||
for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {
|
for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {
|
||||||
$this->getCell(Coordinate::stringFromColumnIndex($col - 1) . $row)->setXfIndex($xfIndex);
|
$this->getCell(Coordinate::stringFromColumnIndex($col) . $row)->setXfIndex($xfIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1609,7 +1609,7 @@ class Worksheet implements IComparable
|
||||||
// Loop through cells and apply styles
|
// Loop through cells and apply styles
|
||||||
for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {
|
for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {
|
||||||
for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {
|
for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {
|
||||||
$this->setConditionalStyles(Coordinate::stringFromColumnIndex($col - 1) . $row, $pCellStyle);
|
$this->setConditionalStyles(Coordinate::stringFromColumnIndex($col) . $row, $pCellStyle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1649,15 +1649,15 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Set break on a cell by using numeric cell coordinates.
|
* Set break on a cell by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
* @param int $pBreak Break type (type of Worksheet::BREAK_*)
|
* @param int $break Break type (type of Worksheet::BREAK_*)
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function setBreakByColumnAndRow($pColumn, $pRow, $pBreak)
|
public function setBreakByColumnAndRow($columnIndex, $row, $break)
|
||||||
{
|
{
|
||||||
return $this->setBreak(Coordinate::stringFromColumnIndex($pColumn) . $pRow, $pBreak);
|
return $this->setBreak(Coordinate::stringFromColumnIndex($columnIndex) . $row, $break);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1715,18 +1715,18 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Set merge on a cell range by using numeric cell coordinates.
|
* Set merge on a cell range by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn1 Numeric column coordinate of the first cell (A = 0)
|
* @param int $columnIndex1 Numeric column coordinate of the first cell
|
||||||
* @param int $pRow1 Numeric row coordinate of the first cell
|
* @param int $row1 Numeric row coordinate of the first cell
|
||||||
* @param int $pColumn2 Numeric column coordinate of the last cell (A = 0)
|
* @param int $columnIndex2 Numeric column coordinate of the last cell
|
||||||
* @param int $pRow2 Numeric row coordinate of the last cell
|
* @param int $row2 Numeric row coordinate of the last cell
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function mergeCellsByColumnAndRow($pColumn1, $pRow1, $pColumn2, $pRow2)
|
public function mergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2)
|
||||||
{
|
{
|
||||||
$cellRange = Coordinate::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . Coordinate::stringFromColumnIndex($pColumn2) . $pRow2;
|
$cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2;
|
||||||
|
|
||||||
return $this->mergeCells($cellRange);
|
return $this->mergeCells($cellRange);
|
||||||
}
|
}
|
||||||
|
@ -1761,18 +1761,18 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Remove merge on a cell range by using numeric cell coordinates.
|
* Remove merge on a cell range by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn1 Numeric column coordinate of the first cell (A = 0)
|
* @param int $columnIndex1 Numeric column coordinate of the first cell
|
||||||
* @param int $pRow1 Numeric row coordinate of the first cell
|
* @param int $row1 Numeric row coordinate of the first cell
|
||||||
* @param int $pColumn2 Numeric column coordinate of the last cell (A = 0)
|
* @param int $columnIndex2 Numeric column coordinate of the last cell
|
||||||
* @param int $pRow2 Numeric row coordinate of the last cell
|
* @param int $row2 Numeric row coordinate of the last cell
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function unmergeCellsByColumnAndRow($pColumn1, $pRow1, $pColumn2, $pRow2)
|
public function unmergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2)
|
||||||
{
|
{
|
||||||
$cellRange = Coordinate::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . Coordinate::stringFromColumnIndex($pColumn2) . $pRow2;
|
$cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2;
|
||||||
|
|
||||||
return $this->unmergeCells($cellRange);
|
return $this->unmergeCells($cellRange);
|
||||||
}
|
}
|
||||||
|
@ -1828,22 +1828,22 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Set protection on a cell range by using numeric cell coordinates.
|
* Set protection on a cell range by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn1 Numeric column coordinate of the first cell (A = 0)
|
* @param int $columnIndex1 Numeric column coordinate of the first cell
|
||||||
* @param int $pRow1 Numeric row coordinate of the first cell
|
* @param int $row1 Numeric row coordinate of the first cell
|
||||||
* @param int $pColumn2 Numeric column coordinate of the last cell (A = 0)
|
* @param int $columnIndex2 Numeric column coordinate of the last cell
|
||||||
* @param int $pRow2 Numeric row coordinate of the last cell
|
* @param int $row2 Numeric row coordinate of the last cell
|
||||||
* @param string $pPassword Password to unlock the protection
|
* @param string $password Password to unlock the protection
|
||||||
* @param bool $pAlreadyHashed If the password has already been hashed, set this to true
|
* @param bool $alreadyHashed If the password has already been hashed, set this to true
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function protectCellsByColumnAndRow($pColumn1, $pRow1, $pColumn2, $pRow2, $pPassword, $pAlreadyHashed = false)
|
public function protectCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2, $password, $alreadyHashed = false)
|
||||||
{
|
{
|
||||||
$cellRange = Coordinate::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . Coordinate::stringFromColumnIndex($pColumn2) . $pRow2;
|
$cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2;
|
||||||
|
|
||||||
return $this->protectCells($cellRange, $pPassword, $pAlreadyHashed);
|
return $this->protectCells($cellRange, $password, $alreadyHashed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1872,18 +1872,18 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Remove protection on a cell range by using numeric cell coordinates.
|
* Remove protection on a cell range by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn1 Numeric column coordinate of the first cell (A = 0)
|
* @param int $columnIndex1 Numeric column coordinate of the first cell
|
||||||
* @param int $pRow1 Numeric row coordinate of the first cell
|
* @param int $row1 Numeric row coordinate of the first cell
|
||||||
* @param int $pColumn2 Numeric column coordinate of the last cell (A = 0)
|
* @param int $columnIndex2 Numeric column coordinate of the last cell
|
||||||
* @param int $pRow2 Numeric row coordinate of the last cell
|
* @param int $row2 Numeric row coordinate of the last cell
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function unprotectCellsByColumnAndRow($pColumn1, $pRow1, $pColumn2, $pRow2)
|
public function unprotectCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2)
|
||||||
{
|
{
|
||||||
$cellRange = Coordinate::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . Coordinate::stringFromColumnIndex($pColumn2) . $pRow2;
|
$cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2;
|
||||||
|
|
||||||
return $this->unprotectCells($cellRange);
|
return $this->unprotectCells($cellRange);
|
||||||
}
|
}
|
||||||
|
@ -1932,21 +1932,21 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Set Autofilter Range by using numeric cell coordinates.
|
* Set Autofilter Range by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn1 Numeric column coordinate of the first cell (A = 0)
|
* @param int $columnIndex1 Numeric column coordinate of the first cell
|
||||||
* @param int $pRow1 Numeric row coordinate of the first cell
|
* @param int $row1 Numeric row coordinate of the first cell
|
||||||
* @param int $pColumn2 Numeric column coordinate of the second cell (A = 0)
|
* @param int $columnIndex2 Numeric column coordinate of the second cell
|
||||||
* @param int $pRow2 Numeric row coordinate of the second cell
|
* @param int $row2 Numeric row coordinate of the second cell
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function setAutoFilterByColumnAndRow($pColumn1, $pRow1, $pColumn2, $pRow2)
|
public function setAutoFilterByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2)
|
||||||
{
|
{
|
||||||
return $this->setAutoFilter(
|
return $this->setAutoFilter(
|
||||||
Coordinate::stringFromColumnIndex($pColumn1) . $pRow1
|
Coordinate::stringFromColumnIndex($columnIndex1) . $row1
|
||||||
. ':' .
|
. ':' .
|
||||||
Coordinate::stringFromColumnIndex($pColumn2) . $pRow2
|
Coordinate::stringFromColumnIndex($columnIndex2) . $row2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2002,16 +2002,16 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Freeze Pane by using numeric cell coordinates.
|
* Freeze Pane by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function freezePaneByColumnAndRow($pColumn, $pRow)
|
public function freezePaneByColumnAndRow($columnIndex, $row)
|
||||||
{
|
{
|
||||||
return $this->freezePane(Coordinate::stringFromColumnIndex($pColumn) . $pRow);
|
return $this->freezePane(Coordinate::stringFromColumnIndex($columnIndex) . $row);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2071,20 +2071,20 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Insert a new column, updating all possible related data.
|
* Insert a new column, updating all possible related data.
|
||||||
*
|
*
|
||||||
* @param int $pBefore Insert before this one (numeric column coordinate of the cell, A = 0)
|
* @param int $beforeColumnIndex Insert before this one (numeric column coordinate of the cell)
|
||||||
* @param int $pNumCols Number of columns to insert
|
* @param int $pNumCols Number of columns to insert
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function insertNewColumnBeforeByIndex($pBefore, $pNumCols = 1)
|
public function insertNewColumnBeforeByIndex($beforeColumnIndex, $pNumCols = 1)
|
||||||
{
|
{
|
||||||
if ($pBefore >= 0) {
|
if ($beforeColumnIndex >= 1) {
|
||||||
return $this->insertNewColumnBefore(Coordinate::stringFromColumnIndex($pBefore), $pNumCols);
|
return $this->insertNewColumnBefore(Coordinate::stringFromColumnIndex($beforeColumnIndex), $pNumCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception('Columns can only be inserted before at least column A (0).');
|
throw new Exception('Columns can only be inserted before at least column A (1).');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2128,12 +2128,12 @@ class Worksheet implements IComparable
|
||||||
{
|
{
|
||||||
if (!is_numeric($pColumn)) {
|
if (!is_numeric($pColumn)) {
|
||||||
$highestColumn = $this->getHighestDataColumn();
|
$highestColumn = $this->getHighestDataColumn();
|
||||||
$pColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($pColumn) - 1 + $pNumCols);
|
$pColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($pColumn) + $pNumCols);
|
||||||
$objReferenceHelper = ReferenceHelper::getInstance();
|
$objReferenceHelper = ReferenceHelper::getInstance();
|
||||||
$objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this);
|
$objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this);
|
||||||
for ($c = 0; $c < $pNumCols; ++$c) {
|
for ($c = 0; $c < $pNumCols; ++$c) {
|
||||||
$this->getCellCollection()->removeColumn($highestColumn);
|
$this->getCellCollection()->removeColumn($highestColumn);
|
||||||
$highestColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($highestColumn) - 2);
|
$highestColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($highestColumn) - 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Exception('Column references should not be numeric.');
|
throw new Exception('Column references should not be numeric.');
|
||||||
|
@ -2145,20 +2145,20 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Remove a column, updating all possible related data.
|
* Remove a column, updating all possible related data.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Remove starting with this one (numeric column coordinate of the cell A = 0)
|
* @param int $columnIndex Remove starting with this one (numeric column coordinate of the cell)
|
||||||
* @param int $pNumCols Number of columns to remove
|
* @param int $numColumns Number of columns to remove
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function removeColumnByIndex($pColumn, $pNumCols = 1)
|
public function removeColumnByIndex($columnIndex, $numColumns = 1)
|
||||||
{
|
{
|
||||||
if ($pColumn >= 0) {
|
if ($columnIndex >= 1) {
|
||||||
return $this->removeColumn(Coordinate::stringFromColumnIndex($pColumn), $pNumCols);
|
return $this->removeColumn(Coordinate::stringFromColumnIndex($columnIndex), $numColumns);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception('Columns to be deleted should at least start from column 0');
|
throw new Exception('Columns to be deleted should at least start from column A (1)');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2343,14 +2343,14 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Get comment for cell by using numeric cell coordinates.
|
* Get comment for cell by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
*
|
*
|
||||||
* @return Comment
|
* @return Comment
|
||||||
*/
|
*/
|
||||||
public function getCommentByColumnAndRow($pColumn, $pRow)
|
public function getCommentByColumnAndRow($columnIndex, $row)
|
||||||
{
|
{
|
||||||
return $this->getComment(Coordinate::stringFromColumnIndex($pColumn) . $pRow);
|
return $this->getComment(Coordinate::stringFromColumnIndex($columnIndex) . $row);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2425,16 +2425,16 @@ class Worksheet implements IComparable
|
||||||
/**
|
/**
|
||||||
* Selected cell by using numeric cell coordinates.
|
* Selected cell by using numeric cell coordinates.
|
||||||
*
|
*
|
||||||
* @param int $pColumn Numeric column coordinate of the cell (A = 0)
|
* @param int $columnIndex Numeric column coordinate of the cell
|
||||||
* @param int $pRow Numeric row coordinate of the cell
|
* @param int $row Numeric row coordinate of the cell
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
public function setSelectedCellByColumnAndRow($pColumn, $pRow)
|
public function setSelectedCellByColumnAndRow($columnIndex, $row)
|
||||||
{
|
{
|
||||||
return $this->setSelectedCells(Coordinate::stringFromColumnIndex($pColumn) . $pRow);
|
return $this->setSelectedCells(Coordinate::stringFromColumnIndex($columnIndex) . $row);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2524,9 +2524,9 @@ class Worksheet implements IComparable
|
||||||
$returnValue = [];
|
$returnValue = [];
|
||||||
// Identify the range that we need to extract from the worksheet
|
// Identify the range that we need to extract from the worksheet
|
||||||
list($rangeStart, $rangeEnd) = Coordinate::rangeBoundaries($pRange);
|
list($rangeStart, $rangeEnd) = Coordinate::rangeBoundaries($pRange);
|
||||||
$minCol = Coordinate::stringFromColumnIndex($rangeStart[0] - 1);
|
$minCol = Coordinate::stringFromColumnIndex($rangeStart[0]);
|
||||||
$minRow = $rangeStart[1];
|
$minRow = $rangeStart[1];
|
||||||
$maxCol = Coordinate::stringFromColumnIndex($rangeEnd[0] - 1);
|
$maxCol = Coordinate::stringFromColumnIndex($rangeEnd[0]);
|
||||||
$maxRow = $rangeEnd[1];
|
$maxRow = $rangeEnd[1];
|
||||||
|
|
||||||
++$maxCol;
|
++$maxCol;
|
||||||
|
@ -2653,7 +2653,7 @@ class Worksheet implements IComparable
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run PhpSpreadsheet garabage collector.
|
* Run PhpSpreadsheet garbage collector.
|
||||||
*
|
*
|
||||||
* @return Worksheet
|
* @return Worksheet
|
||||||
*/
|
*/
|
||||||
|
@ -2678,10 +2678,10 @@ class Worksheet implements IComparable
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cache values
|
// Cache values
|
||||||
if ($highestColumn < 0) {
|
if ($highestColumn < 1) {
|
||||||
$this->cachedHighestColumn = 'A';
|
$this->cachedHighestColumn = 'A';
|
||||||
} else {
|
} else {
|
||||||
$this->cachedHighestColumn = Coordinate::stringFromColumnIndex(--$highestColumn);
|
$this->cachedHighestColumn = Coordinate::stringFromColumnIndex($highestColumn);
|
||||||
}
|
}
|
||||||
$this->cachedHighestRow = $highestRow;
|
$this->cachedHighestRow = $highestRow;
|
||||||
|
|
||||||
|
|
|
@ -434,9 +434,9 @@ class Html extends BaseWriter
|
||||||
// Get worksheet dimension
|
// Get worksheet dimension
|
||||||
$dimension = explode(':', $sheet->calculateWorksheetDimension());
|
$dimension = explode(':', $sheet->calculateWorksheetDimension());
|
||||||
$dimension[0] = Coordinate::coordinateFromString($dimension[0]);
|
$dimension[0] = Coordinate::coordinateFromString($dimension[0]);
|
||||||
$dimension[0][0] = Coordinate::columnIndexFromString($dimension[0][0]) - 1;
|
$dimension[0][0] = Coordinate::columnIndexFromString($dimension[0][0]);
|
||||||
$dimension[1] = Coordinate::coordinateFromString($dimension[1]);
|
$dimension[1] = Coordinate::coordinateFromString($dimension[1]);
|
||||||
$dimension[1][0] = Coordinate::columnIndexFromString($dimension[1][0]) - 1;
|
$dimension[1][0] = Coordinate::columnIndexFromString($dimension[1][0]);
|
||||||
|
|
||||||
// row min,max
|
// row min,max
|
||||||
$rowMin = $dimension[0][1];
|
$rowMin = $dimension[0][1];
|
||||||
|
@ -476,14 +476,15 @@ class Html extends BaseWriter
|
||||||
// Start a new rowData
|
// Start a new rowData
|
||||||
$rowData = [];
|
$rowData = [];
|
||||||
// Loop through columns
|
// Loop through columns
|
||||||
$column = $dimension[0][0] - 1;
|
$column = $dimension[0][0];
|
||||||
while ($column++ < $dimension[1][0]) {
|
while ($column <= $dimension[1][0]) {
|
||||||
// Cell exists?
|
// Cell exists?
|
||||||
if ($sheet->cellExistsByColumnAndRow($column, $row)) {
|
if ($sheet->cellExistsByColumnAndRow($column, $row)) {
|
||||||
$rowData[$column] = Coordinate::stringFromColumnIndex($column) . $row;
|
$rowData[$column] = Coordinate::stringFromColumnIndex($column) . $row;
|
||||||
} else {
|
} else {
|
||||||
$rowData[$column] = '';
|
$rowData[$column] = '';
|
||||||
}
|
}
|
||||||
|
++$column;
|
||||||
}
|
}
|
||||||
$html .= $this->generateRow($sheet, $rowData, $row - 1, $cellType);
|
$html .= $this->generateRow($sheet, $rowData, $row - 1, $cellType);
|
||||||
}
|
}
|
||||||
|
@ -1210,7 +1211,7 @@ class Html extends BaseWriter
|
||||||
$colNum = 0;
|
$colNum = 0;
|
||||||
foreach ($pValues as $cellAddress) {
|
foreach ($pValues as $cellAddress) {
|
||||||
$cell = ($cellAddress > '') ? $pSheet->getCell($cellAddress) : '';
|
$cell = ($cellAddress > '') ? $pSheet->getCell($cellAddress) : '';
|
||||||
$coordinate = Coordinate::stringFromColumnIndex($colNum) . ($pRow + 1);
|
$coordinate = Coordinate::stringFromColumnIndex($colNum + 1) . ($pRow + 1);
|
||||||
if (!$this->useInlineCss) {
|
if (!$this->useInlineCss) {
|
||||||
$cssClass = 'column' . $colNum;
|
$cssClass = 'column' . $colNum;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1340,7 +1341,7 @@ class Html extends BaseWriter
|
||||||
|
|
||||||
// Also apply style from last cell in merge to fix borders -
|
// Also apply style from last cell in merge to fix borders -
|
||||||
// relies on !important for non-none border declarations in createCSSStyleBorder
|
// relies on !important for non-none border declarations in createCSSStyleBorder
|
||||||
$endCellCoord = Coordinate::stringFromColumnIndex($colNum + $colSpan - 1) . ($pRow + $rowSpan);
|
$endCellCoord = Coordinate::stringFromColumnIndex($colNum + $colSpan) . ($pRow + $rowSpan);
|
||||||
if (!$this->useInlineCss) {
|
if (!$this->useInlineCss) {
|
||||||
$cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex();
|
$cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex();
|
||||||
}
|
}
|
||||||
|
|
|
@ -334,7 +334,7 @@ class Xls extends BaseWriter
|
||||||
// create an Drawing Object for the dropdown
|
// create an Drawing Object for the dropdown
|
||||||
$oDrawing = new BaseDrawing();
|
$oDrawing = new BaseDrawing();
|
||||||
// get the coordinates of drawing
|
// get the coordinates of drawing
|
||||||
$cDrawing = Coordinate::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1];
|
$cDrawing = Coordinate::stringFromColumnIndex($iInc) . $rangeBounds[0][1];
|
||||||
$oDrawing->setCoordinates($cDrawing);
|
$oDrawing->setCoordinates($cDrawing);
|
||||||
$oDrawing->setWorksheet($sheet);
|
$oDrawing->setWorksheet($sheet);
|
||||||
|
|
||||||
|
@ -363,7 +363,7 @@ class Xls extends BaseWriter
|
||||||
$spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint
|
$spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint
|
||||||
|
|
||||||
// set coordinates and offsets, client anchor
|
// set coordinates and offsets, client anchor
|
||||||
$endCoordinates = Coordinate::stringFromColumnIndex($iInc - 1);
|
$endCoordinates = Coordinate::stringFromColumnIndex($iInc);
|
||||||
$endCoordinates .= $rangeBounds[0][1] + 1;
|
$endCoordinates .= $rangeBounds[0][1] + 1;
|
||||||
|
|
||||||
$spContainer->setStartCoordinates($cDrawing);
|
$spContainer->setStartCoordinates($cDrawing);
|
||||||
|
|
|
@ -310,7 +310,7 @@ class Worksheet extends BIFFwriter
|
||||||
|
|
||||||
$width = $defaultWidth;
|
$width = $defaultWidth;
|
||||||
|
|
||||||
$columnLetter = Coordinate::stringFromColumnIndex($i);
|
$columnLetter = Coordinate::stringFromColumnIndex($i + 1);
|
||||||
if (isset($columnDimensions[$columnLetter])) {
|
if (isset($columnDimensions[$columnLetter])) {
|
||||||
$columnDimension = $columnDimensions[$columnLetter];
|
$columnDimension = $columnDimensions[$columnLetter];
|
||||||
if ($columnDimension->getWidth() >= 0) {
|
if ($columnDimension->getWidth() >= 0) {
|
||||||
|
@ -2288,7 +2288,7 @@ class Worksheet extends BIFFwriter
|
||||||
$row_end = $row_start; // Row containing bottom right corner of object
|
$row_end = $row_start; // Row containing bottom right corner of object
|
||||||
|
|
||||||
// Zero the specified offset if greater than the cell dimensions
|
// Zero the specified offset if greater than the cell dimensions
|
||||||
if ($x1 >= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start))) {
|
if ($x1 >= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start + 1))) {
|
||||||
$x1 = 0;
|
$x1 = 0;
|
||||||
}
|
}
|
||||||
if ($y1 >= Xls::sizeRow($this->phpSheet, $row_start + 1)) {
|
if ($y1 >= Xls::sizeRow($this->phpSheet, $row_start + 1)) {
|
||||||
|
@ -2299,8 +2299,8 @@ class Worksheet extends BIFFwriter
|
||||||
$height = $height + $y1 - 1;
|
$height = $height + $y1 - 1;
|
||||||
|
|
||||||
// Subtract the underlying cell widths to find the end cell of the image
|
// Subtract the underlying cell widths to find the end cell of the image
|
||||||
while ($width >= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end))) {
|
while ($width >= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1))) {
|
||||||
$width -= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end));
|
$width -= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1));
|
||||||
++$col_end;
|
++$col_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2313,10 +2313,10 @@ class Worksheet extends BIFFwriter
|
||||||
// Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell
|
// Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell
|
||||||
// with zero eight or width.
|
// with zero eight or width.
|
||||||
//
|
//
|
||||||
if (Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start)) == 0) {
|
if (Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start + 1)) == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end)) == 0) {
|
if (Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1)) == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Xls::sizeRow($this->phpSheet, $row_start + 1) == 0) {
|
if (Xls::sizeRow($this->phpSheet, $row_start + 1) == 0) {
|
||||||
|
@ -2327,9 +2327,9 @@ class Worksheet extends BIFFwriter
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert the pixel values to the percentage value expected by Excel
|
// Convert the pixel values to the percentage value expected by Excel
|
||||||
$x1 = $x1 / Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start)) * 1024;
|
$x1 = $x1 / Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start + 1)) * 1024;
|
||||||
$y1 = $y1 / Xls::sizeRow($this->phpSheet, $row_start + 1) * 256;
|
$y1 = $y1 / Xls::sizeRow($this->phpSheet, $row_start + 1) * 256;
|
||||||
$x2 = $width / Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end)) * 1024; // Distance to right side of object
|
$x2 = $width / Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1)) * 1024; // Distance to right side of object
|
||||||
$y2 = $height / Xls::sizeRow($this->phpSheet, $row_end + 1) * 256; // Distance to bottom of object
|
$y2 = $height / Xls::sizeRow($this->phpSheet, $row_end + 1) * 256; // Distance to bottom of object
|
||||||
|
|
||||||
$this->writeObjPicture($col_start, $x1, $row_start, $y1, $col_end, $x2, $row_end, $y2);
|
$this->writeObjPicture($col_start, $x1, $row_start, $y1, $col_end, $x2, $row_end, $y2);
|
||||||
|
|
|
@ -12,11 +12,15 @@ class CoordinateTest extends TestCase
|
||||||
* @dataProvider providerColumnString
|
* @dataProvider providerColumnString
|
||||||
*
|
*
|
||||||
* @param mixed $expectedResult
|
* @param mixed $expectedResult
|
||||||
|
* @param mixed $string
|
||||||
*/
|
*/
|
||||||
public function testColumnIndexFromString($expectedResult, ...$args)
|
public function testColumnIndexFromString($expectedResult, $string)
|
||||||
{
|
{
|
||||||
$result = Coordinate::columnIndexFromString(...$args);
|
$columnIndex = Coordinate::columnIndexFromString($string);
|
||||||
self::assertEquals($expectedResult, $result);
|
self::assertEquals($expectedResult, $columnIndex);
|
||||||
|
|
||||||
|
$stringBack = Coordinate::stringFromColumnIndex($columnIndex);
|
||||||
|
self::assertEquals($stringBack, $string, 'should be able to get the original input with opposite method');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function providerColumnString()
|
public function providerColumnString()
|
||||||
|
@ -58,11 +62,15 @@ class CoordinateTest extends TestCase
|
||||||
* @dataProvider providerColumnIndex
|
* @dataProvider providerColumnIndex
|
||||||
*
|
*
|
||||||
* @param mixed $expectedResult
|
* @param mixed $expectedResult
|
||||||
|
* @param int $columnIndex
|
||||||
*/
|
*/
|
||||||
public function testStringFromColumnIndex($expectedResult, ...$args)
|
public function testStringFromColumnIndex($expectedResult, $columnIndex)
|
||||||
{
|
{
|
||||||
$result = Coordinate::stringFromColumnIndex(...$args);
|
$string = Coordinate::stringFromColumnIndex($columnIndex);
|
||||||
self::assertEquals($expectedResult, $result);
|
self::assertEquals($expectedResult, $string);
|
||||||
|
|
||||||
|
$columnIndexBack = Coordinate::columnIndexFromString($string);
|
||||||
|
self::assertEquals($columnIndexBack, $columnIndex, 'should be able to get the original input with opposite method');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function providerColumnIndex()
|
public function providerColumnIndex()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Sample;
|
namespace PhpOffice\PhpSpreadsheetTests\Helper;
|
||||||
|
|
||||||
use PhpOffice\PhpSpreadsheet\Helper\Sample;
|
use PhpOffice\PhpSpreadsheet\Helper\Sample;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
|
@ -3,50 +3,50 @@
|
||||||
return [
|
return [
|
||||||
[
|
[
|
||||||
'A',
|
'A',
|
||||||
0,
|
1,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'Z',
|
'Z',
|
||||||
25,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'AA',
|
|
||||||
26,
|
26,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'AB',
|
'AA',
|
||||||
27,
|
27,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'AZ',
|
'AB',
|
||||||
51,
|
28,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'BA',
|
'AZ',
|
||||||
52,
|
52,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'BZ',
|
'BA',
|
||||||
77,
|
53,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'CA',
|
'BZ',
|
||||||
78,
|
78,
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'CA',
|
||||||
|
79,
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'IV',
|
'IV',
|
||||||
255,
|
256,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'ZZ',
|
'ZZ',
|
||||||
701,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'AAA',
|
|
||||||
702,
|
702,
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'AAA',
|
||||||
|
703,
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'BAA',
|
'BAA',
|
||||||
1378,
|
1379,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in New Issue