【问题标题】:PHPExcel - Set cells as string while uploading from ArrayPHPExcel - 从数组上传时将单元格设置为字符串
【发布时间】:2015-11-13 15:29:30
【问题描述】:
$objPHPExcel->getActiveSheet()->fromArray($dataArray,null,"A2")

我有上面的代码行。问题是,我不擅长迭代,我希望将所有单元格值设置为 STRING,以避免自动修改前导零的文本。

附:此外,将感谢为选择性列设置为 STRING 的代码。

谢谢!

【问题讨论】:

    标签: php arrays multidimensional-array phpexcel phpexcelreader


    【解决方案1】:

    当您单独设置单元格值时,您可以选择显式设置数据类型,但是当您使用fromArray() 方法时,您没有此选项。

    但是,默认情况下,PHP 使用默认值绑定器从传递的值中识别数据类型,并相应地设置单元格数据类型。此默认行为在 /PHPExcel/Cell/DefaultValueBinder.php 类中定义。

    因此,您可以创建自己的值绑定器,如 PHPExcel Documentation 中所述,它将每个值设置为字符串数据类型。

    类似:

    class PHPExcel_Cell_MyColumnValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
    {
        protected $stringColumns = [];
    
        public function __construct(array $stringColumnList = []) {
            // Accept a list of columns that will always be set as strings
            $this->stringColumns = $stringColumnList;
        }
    
        public function bindValue(PHPExcel_Cell $cell, $value = null)
        {
            // If the cell is one of our columns to set as a string...
            if (in_array($cell->getColumn(), $this->stringColumns)) {
                // ... then we cast it to a string and explicitly set it as a string
                $cell->setValueExplicit((string) $value, PHPExcel_Cell_DataType::TYPE_STRING);
                return true;
            }
            // Otherwise, use the default behaviour
            return parent::bindValue($cell, $value);
        }
    }
    
    // Instantiate our custom binder, with a list of columns, and tell PHPExcel to use it
    PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_MyColumnValueBinder(['A', 'B', 'C', 'E', 'F']));
    
    $objPHPExcel = new PHPExcel();
    $objPHPExcel->getActiveSheet()->fromArray($dataArray,null,"A2");
    

    【讨论】:

    • 对于我们中的一些想要使用 fromArray() 快速转储数据但又需要前导零才能正常工作的人来说,这是一个完美的解决方案。就我而言,我们有产品编号和 UPC 编号。除了这个,所有其他解决方案都不适合我。虽然,我可以循环我的数据并设置每个单元格,但这看起来超级笨重。如果这样做,您可以省略自定义格式,如 ('000000000000'),并省略 setQuotePrefix(true) 方法。注意:我有“PHPExcel_Cell_CustomDataBinderForStrings”类,必须做“new PHPExcel_Cell_CustomDataBinderForStrings(...”
    • 抱歉,您正在创建一个新的活页夹 PHPExcel_Cell_MyColumnValueBinder,但之后,您将实例化默认的 PHPExcel_Cell_DefaultValueBinder。我错过了什么吗?
    • @morgar - 你是对的......令人惊讶的是,在这篇文章出现的 18 个月里没有人注意到这个错误
    • 谢谢马克,有了这个解决方案,它工作得很好,解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多