PHPExcel 解析带有"numbers stored as text"警告.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,那就是一个数字单元格。AND \ OR查找数学计算中包含的单元格。为了更好地理解我的意思,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);
}
}

相关内容

最新更新