我想在不触及PHPExcel库的情况下覆盖PHPExcel_Cell_DefaultValueBinder::dataTypeForValue()方法,以便以后升级库时不会有问题。

事实上,我这样做是为了解决将数字转换为字符串的问题,我只是想知道如何覆盖一个方法,以便我可以继续使用该库而不会出现问题。

#1楼 票数:4 已采纳

您可以创建一个将继承PHPExcel_Cell_DefaultValueBinder的新类,并覆盖函数dataTypeForValue

<?php
class PHPExcel_Cell_MyValueBinder extends PHPExcel_Cell_DefaultValueBinder {

    public static function dataTypeForValue($pValue = null) {
        if (/* your condition */) {
            // if you want to return a value, and i guess it's what you want, you can
            return PHPExcel_Cell_DataType::YOUR_TYPE;
        }
        // you call the fonction PHPExcel_Cell_DefaultValueBinder::dataTypeForValue();
        // so the already existant conditions are still working.
        return parent::dataTypeForValue($pValue);
    }

}
?>

之后,只需使用PHPExcel_Cell_MyValueBinder而不是PHPExcel_Cell_DefaultValueBinder ,在代码顶部使用:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_MyValueBinder());

因此, PHPExcel将使用您自己的ValueBinder执行其余的操作:)

#2楼 票数:4

class PHPExcel_Cell_MyValueBinder 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);
        }

        // Implement your own override logic
        if (is_string($value) && $value[0] == '0') {
            $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
            return true;
        }

        // Not bound yet? Use default value parent...
        return parent::bindValue($cell, $value);
    }
}

#3楼 票数:3

您可以扩展该类并覆盖您希望扩展其功能的方法。 这遵循SOLID编程的开放/封闭原则(打开扩展但关闭以进行修改),并且您不对PHPExcel进行任何更改。 您只需要在扩展类上使用新类。

namespace MyPHPExcel;

class MyDataValueBinder extends \PHPExcel_Cell_DefaultValueBinder 
{
    public static function dataTypeForValue($pValue = null)
    {
      ...method body
    }
}

$returnValue = \MYPHPExcel\MyDataValueBinder::dataTypeForValue( $someValue );

  ask by Periback translate from so

未解决问题?本站智能推荐:

1回复

php覆盖实例变量的=操作[重复]

可能重复: PHP中的运算符重载 我正在尝试创建一个允许在php中使用类型安全变量的库。 我要执行以下操作: 其中$ test =“ 3”; 我想在这里调用__set或其他方法,而不是使$ test为“ 3”。 有可能这样做吗? 提前致谢, 问候,鲍勃
2回复

PHPExcel-自己文件的最佳实践

我目前正在将现有项目从不推荐使用(和旧的)Spreadsheet_Excel_Writer转换为PHPExcel,并且我正在苦苦寻找如何最好地利用它。 我阅读了文档和示例,以便了解PHPExcel的结构。 在当前项目中,我们用来创建扩展Spreadsheet_Excel_Writer
1回复

通过AJAX将数据从PHP类传递到PHPExcel

我遇到了OOP PHP和json数据。 我对OOP并不是全新的,但我无法理解这一点。 如果有人可以请我解释,会很棒! 我在PHP中有以下网格对象: 它由AJAX callgrid.php调用: 我想要的是能够使用PHPExcel将当前的SQL查询(它可以是全部或搜索结果
1回复

PHPExcel:.xls格式的数据验证不起作用

我有两张纸的Excel文件: 工作表 ; 列表 -将在Worksheet表中显示为列表项的项目列表。 请看下面的图片: 我想使用PHPExcel库生成此PHPExcel 。 我已经尝试过但没有得到预期的结果。 看到我下面的代码:
6回复

如何在不安装的情况下使用 PhpSpreadsheet(如 PHPExcel)

根据PhpSpreadsheet Doc ,必须使用composer 安装它。 就我而言,我只有一个没有终端但有 Plesk 的网络空间。 难道反正可以使用PhpSpreadsheet,就像它与PHPExcel ,你只需要将文件放置在任何位置? 我该怎么做才能让它运行? 我没有找到更多信息如何仅使用
2回复

无法覆盖继承的静态const成员

我有两节课。 基类是水果,派生类是苹果。 我使用类型字符串来标识类的类型。但是,当我尝试访问类apple的实例的type()函数以获取其类型字符串的返回时,我得到了基类的类型字符串“ fruit”而不是“苹果”。该如何解决? 这是我的代码: 在文件main.cpp中: 在输
1回复

新的perl对象将覆盖先前对象的数据

当我创建2个单独的Perl对象实例时,第二个实例实例将覆盖第一个实例的数据。 我是OO Perl的新手,所以我认为我在类中处理$ self变量时缺少一些基本知识。 为什么$ ptr2对象的数据会覆盖$ ptr1对象的数据? 从Perl专家那里大概可以很轻松地回答1分钟,但是我对此一直不敢恭
3回复

为什么perl对象实例会相互覆盖

我编写了一些Perl代码,它构成了基础代码中固有的两个类。 我想它会打印出这样的东西 但它实际上是这样打印的: , 但是如果我以这种方式更改调用者,它会打印出我想要的内容。 因此,在$dog被实例化之后为什么$cat对象被覆盖是很奇怪的?