PHPExcel анализирует файл .XLS с числами, сохраненными в виде текстового предупреждения, возвращает #VALUE

В моем коде используется метод 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 числовым? Что-то такое.

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


person ChAnger    schedule 14.11.2012    source источник


Ответы (1)


Вам нужно будет преобразовать эти строковые значения в столбце 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);
    }
}
person Mark Baker    schedule 18.11.2012
comment
Десятичный разделитель-запятая не проблема. Я старался. И я не возражаю против использования привязки ячеек, но к каким ячейкам? (пожалуйста, прочитайте Редактировать 1). Кроме того, Марк, можешь указать какой-нибудь класс или файл, в котором вычислительная машина распознает ячейки? Я не настолько хорош в php, чтобы найти это к этому времени. И большое спасибо за ответ - person ChAnger; 19.11.2012