3

我的代码使用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 是数字吗?类似的东西。

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

4

1 回答 1

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);
    }
}
于 2012-11-18T16:49:07.563 回答