PHPExcel解析.XLS文件,其中“数字存储为文本”警告返回#VALUE

时间:2012-11-14 12:42:58

标签: php numbers 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;

如果我按照它的建议将其修复为数字。然后getFormattedValue()工作正常。 但我不能告诉客户你的xls是错的......

所以问题,是否有可能让PHPExcel像Excel一样行事?或者也许还有其他方法可以使这项工作。

感谢您的帮助和时间!

---编辑1 ---

基本上它是对马克贝克的回答的评论。

我想找到一个不包含对.xls文件进行任何更改的解决方案。我不知道它会是什么结构,问题单元格在哪里等等。

有没有办法让PHPExcel识别出这些细胞?也许MS Excel如何做到这一点?或者找出我们的方法来做到这一点。

我想要尝试自己划分单元格值,如果我们得到1那么这是一个数字单元格。 AND \ OR找到数学计算中包含的单元格。为了更好地理解我的意思 - 单元格E7包含D7 * 1,2。那么,我们可以检查 - 是D7数字吗?这样的事情。

目前我没有解决这个问题的方法......所以任何帮助都会很棒。

1 个答案:

答案 0 :(得分:2)

在从E列和F列中的单元格获取值之前,您需要将D列中的字符串值转换为有效数字(使用小数点而不是逗号)。如果有问题的单元格始终位于同一列中(或者至少是可预测的)您可以在加载工作簿时使用单元格绑定器来处理此转换。

修改

你需要创建一个类似于:

的活页夹
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);
    }
}