Синтаксический анализ 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 числовым? Что-то вроде того.

В настоящее время у меня нет никакого решения этой проблемы... Так что любая помощь была бы очень кстати.

Author: pnuts, 2012-11-14

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);
    }
}
 2
Author: Mark Baker, 2012-11-18 23:09:07