Синтаксический анализ PHPExcel.Файл XLS с предупреждением "числа, сохраненные в виде текста" возвращает значение #
Мой код использует метод getformattedvalue() для извлечения данных в PHP.
Вот проблемная часть .xls с "числами, сохраненными в виде текста" в столбце D:
Excel cells contains next values: D7 -> 0,43; E7 -> =D7*1,2; F7 -> =E7*11,2;
getFormattedValue() returns: 0,43; #VALUE!; #VALUE!;
getCalculatedValue() also returns 0,43; #VALUE!; #VALUE!;
getValue() returns 0,43; D7*1.2; E7*11.2;
Если я исправлю это в excel, как он предлагает, в число. затем getFormattedValue() работает просто отлично. Но я не могу сказать клиенту, что ваш xls неверен...
Итак, вопрос, возможно ли заставить PHPExcel действовать как Excel? Или, может быть, какой-то другой способ заставить это работать.
Спасибо вам за вашу помощь и время!
--- РЕДАКТИРОВАТЬ 1 ---
В основном это комментарий к ответу Марка Бейкера .
Я хотел бы найти решение, которое не включало бы никаких изменений в файлы .xls. Я не знаю, какая это будет структура, где находятся проблемные ячейки и т.д.
Есть ли какой-нибудь способ заставить PHPExcel распознавать эти ячейки? Может быть, как MS Excel это делает? Или узнайте наш способ сделать это.
Я думаю о том, чтобы попытаться разделить значение ячейки само по себе, и если мы получаем 1, так что это числовая ячейка. И\ИЛИ найдите ячейки, которые включены в математические вычисления. Чтобы лучше понять, что я имею в виду - ячейка E7 содержит D7*1,2. Итак, мы можем проверить - является ли D7 числовым? Что-то вроде того.
В настоящее время у меня нет никакого решения этой проблемы... Так что любая помощь была бы очень кстати.
1 answers
Вам потребуется преобразовать эти строковые значения в столбце D в допустимое число (используя десятичную точку, а не запятую), прежде чем получать значения из ячеек в столбцах E и F. Если проблемные ячейки всегда находятся в одном столбце (или, по крайней мере, предсказуемы), вы можете использовать связыватель ячеек для обработки этого преобразования при загрузке книги.
РЕДАКТИРОВАТЬ
Вам нужно будет создать связующее что-то вроде:
class PHPExcel_Cell_AdvancedValueBinder
extends PHPExcel_Cell_DefaultValueBinder
implements PHPExcel_Cell_IValueBinder
{
public function bindValue(PHPExcel_Cell $cell, $value = null)
{
// sanitize UTF-8 strings
if (is_string($value)) {
$value = PHPExcel_Shared_String::SanitizeUTF8($value);
}
// Find out data type
$dataType = parent::dataTypeForValue($value);
if ($dataType === PHPExcel_Cell_DataType::TYPE_STRING &&
!$value instanceof PHPExcel_RichText) {
if (preg_match('/^\d+,\d+$/', $value)) {
list($w, $d) = explode(',', $value);
$value = (float) $w . '.' . $d;
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
return true;
}
}
// Not bound yet? Use parent...
return parent::bindValue($cell, $value);
}
}