我的代码使用 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数字吗?这样的事情。
目前我没有解决这个问题的方法......所以任何帮助都会很棒。
答案 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);
}
}