diff --git a/docs/topics/accessing-cells.md b/docs/topics/accessing-cells.md index a777afc1..7330a719 100644 --- a/docs/topics/accessing-cells.md +++ b/docs/topics/accessing-cells.md @@ -110,6 +110,11 @@ values beginning with `=` will be converted to a formula. Strings that aren't numeric, or that don't begin with a leading `=` will be treated as genuine string values. +Note that a numeric string that begins with a leading zero (that isn't +immediately followed by a decimal separator) will not be converted to a +numeric, so values like phone numbers (e.g. `01615991375``will remain as +strings). + This "conversion" is handled by a cell "value binder", and you can write custom "value binders" to change the behaviour of these "conversions". The standard PhpSpreadsheet package also provides an "advanced value @@ -138,8 +143,10 @@ Formats handled by the advanced value binder include: - When strings contain a newline character (`\n`), then the cell styling is set to wrap. -You can read more about value binders later in this section of the -documentation. +Basically, it attempts to mimic the behaviour of the MS Excel GUI. + +You can read more about value binders [later in this section of the +documentation](#using-value-binders-to-facilitate-data-entry). ### Setting a formula in a Cell @@ -551,8 +558,13 @@ $spreadsheet->getActiveSheet()->setCellValue('A5', 'Date/time value:'); $spreadsheet->getActiveSheet()->setCellValue('B5', '21 December 1983'); ``` -**Creating your own value binder is easy.** When advanced value binding -is required, you can implement the -`\PhpOffice\PhpSpreadsheet\Cell\IValueBinder` interface or extend the +Alternatively, a `\PhpOffice\PhpSpreadsheet\Cell\StringValueBinder` class is available +if you want to preserve all string content as strings. This might be appropriate if you +were loading a file containing values that could be interpreted as numbers (e.g. numbers +with leading zeroes such as phone numbers), but that should be retained as strings. + +**Creating your own value binder is relatively straightforward.** When more specialised +value binding is required, you can implement the +`\PhpOffice\PhpSpreadsheet\Cell\IValueBinder` interface or extend the existing `\PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder` or `\PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder` classes. diff --git a/src/PhpSpreadsheet/Cell/DefaultValueBinder.php b/src/PhpSpreadsheet/Cell/DefaultValueBinder.php index 6fae5e76..bfb8bfb2 100644 --- a/src/PhpSpreadsheet/Cell/DefaultValueBinder.php +++ b/src/PhpSpreadsheet/Cell/DefaultValueBinder.php @@ -57,11 +57,11 @@ class DefaultValueBinder implements IValueBinder return DataType::TYPE_STRING; } elseif ($value instanceof RichText) { return DataType::TYPE_INLINE; - } elseif (is_string($value) && $value[0] === '=' && strlen($value) > 1) { + } elseif (is_string($value) && strlen($value) > 1 && $value[0] === '=') { return DataType::TYPE_FORMULA; } elseif (preg_match('/^[\+\-]?(\d+\\.?\d*|\d*\\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $value)) { $tValue = ltrim($value, '+-'); - if (is_string($value) && $tValue[0] === '0' && strlen($tValue) > 1 && $tValue[1] !== '.') { + if (is_string($value) && strlen($tValue) > 1 && $tValue[0] === '0' && $tValue[1] !== '.') { return DataType::TYPE_STRING; } elseif ((strpos($value, '.') === false) && ($value > PHP_INT_MAX)) { return DataType::TYPE_STRING;