PHPExcel parsing.XLS文件,带有;“存储为文本的数字”;警告返回#值

PHPExcel parsing.XLS文件,带有;“存储为文本的数字”;警告返回#值,php,numbers,phpexcel,xls,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!; getCalculatedValu

我的代码使用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识别这些细胞?也许Excel女士是怎么做到的?或者找出我们的方法

我想尝试将单元格值除以它自己,如果我们得到1,那就是一个数值单元格。和\或查找包含在数学计算中的单元格。为了更好地理解我的意思-单元格E7包含D7*1,2。所以,我们可以检查-D7是数字吗?差不多吧


现在我还没有解决这个问题的办法。。。因此,任何帮助都将非常有用。

在从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);
    }
}

逗号小数分隔符不是问题。我试过了。我不介意用细胞粘合剂,但用什么细胞?(请阅读编辑1)。另外,马克,你们能指出一些类或文件吗,计算引擎可以识别单元格?我对php不是很在行,到目前为止我还没有发现这一点。非常感谢你的回答