使用PHPExcel以文本格式读取数字

使用PHPExcel以文本格式读取数字,php,formatting,phpexcel,Php,Formatting,Phpexcel,我有一个数组,可以存储01、01A、01B、02、2等数字,当我使用PHPExcel获取此值时,它将被删除,例如,在01、02的情况下是“0”。为了解决这个问题,我尝试将这些值存储在excel中的行格式化,并将其设置为文本类型,如下代码所示: $objPHPExcel->setActiveSheetIndexByName('BlocksList'); $objPHPExcel->getActiveSheet()->fromArray($blockNames, n

我有一个数组,可以存储01、01A、01B、02、2等数字,当我使用PHPExcel获取此值时,它将被删除,例如,在01、02的情况下是“0”。为了解决这个问题,我尝试将这些值存储在excel中的行格式化,并将其设置为文本类型,如下代码所示:

    $objPHPExcel->setActiveSheetIndexByName('BlocksList');
    $objPHPExcel->getActiveSheet()->fromArray($blockNames, null, 'A2');
    $latestBLColumn = $objPHPExcel->getActiveSheet()->getHighestDataColumn();
    $column = 'A';
    $row = 1;
    for ($column = 'A'; $column != $latestBLColumn; $column++) {
        $objPHPExcel->getActiveSheet()->getStyle($column.$row)->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_TEXT );
    }
    $objPHPExcel->getActiveSheet()->fromArray($blockNames, null, 'A1');
所以,通过这样做,我得到的数组的数字像01,01A,02,02B。。。我把它放在A2排。我得到了在条件中使用此值的最高列。在这种情况下,我设置了范围A中的行1,直到最高的列被格式化为文本

我的模板已生成,所有数字都是文本格式,但问题是,当我使用“
fromArray()
”方法时,它会在excel中正确获取数组之前转换数组的数字。
你知道如何解决这个问题吗?

使用数字格式会影响数字的显示方式,而不是存储方式

您必须将数字显式存储为字符串,因此不能使用fromArray()。 改为使用setCellValueExplicit()或setCellValueExplicitByColumnAndRow(),传递PHPExcel_Cell_DataType::TYPE_STRING的$pDataType参数

编辑

请注意,您还可以为一系列单元格设置样式,因此无需添加for循环的开销:

$range = 'A'.$row.':'.$latestBLColumn.$row;
$objPHPExcel->getActiveSheet()
    ->getStyle($range)
    ->getNumberFormat()
    ->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_TEXT );
使用单元格活页夹编辑#2

创建自定义单元格值活页夹:

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); 
    } 
} 
为了避免自动加载器出现任何问题,请在/Classes/PHPExcel/Cell目录中创建它。否则,请为该类指定您自己的非PHPExcel名称,并确保独立加载该类

然后,在使用fromArray()调用之前,告诉PHPExcel使用您的值绑定器而不是默认绑定器:

PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_MyValueBinder() );

您可以使用“在值之前或之后添加字符”将值格式化为文本。示例“值后添加字符”


我知道这些都是前一段时间发布的,但我想分享一些对我有用的东西,所以你仍然可以使用
->fromArray
,而不必迭代整个电子表格


如果将值包装在
=“VALUE”
中,它将以文本形式传递,而不是转换,并且在电子表格中不会在其周围加引号,以防需要将整个图纸编号转换为文本,您可以使用
calculateWorksheetDimension()
获取图纸的尺寸(例如:“A1:B200”或“A1:C150”),然后在
getStyle()
中使用它,如下所示:

$objPHPExcel
   ->getActiveSheet()
   ->getCellByColumnAndRow($col, $row)
   ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
//获取图纸尺寸
$sheet_dimension=$spreadsheet->getActiveSheet()->calculateWorksheetDimension();
//将文本格式应用于数字
$spreadsheet->getActiveSheet()->getStyle($sheet\u dimension)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT\u TEXT);

注意:此示例使用,因为它是PHPExcel的下一个版本。

因此,如果我有一个具有1000个值的数组,我将不得不将其每个元素设置为字符串?抱歉,但是是-fromArray()是一个快捷方式,但其灵活性有限,因此它“猜测”数据类型(单元格默认值绑定器处理此问题)…另一种方法是设置一个自定义值绑定器,该绑定器将始终将字符串视为字符串,即使该字符串值是number;然后可以使用fromArray()。您知道如何设置此自定义值绑定器吗?这个主意听起来不错/Tests/29advancedvaluebinder.php演示了如何设置值绑定器。您需要编写自己的值绑定器,但可以使用现有的默认值绑定器或高级值绑定器作为基础。这是一个-这是查看您正在设置的值的代码ng表示单元格,并确定它是数字、字符串、富文本(内联)、布尔值等。bindValue()函数是实际设置单元格值的函数:高级值绑定器集中的等效函数(例如)如果为单元格设置的值是一个包含“TRUE”的字符串,则为布尔类型;并自动设置某些单元格的样式。通常,您应该在答案中添加一些解释或信息,而不仅仅是一个简短的代码片段。这是一个糟糕的解决方案。如果客户需要Excel导出,这对他们来说非常不专业。它可以工作,但非常有用更好的选择是使用strval($var)或(string)$var将整数转换为字符串。
$objPHPExcel
   ->getActiveSheet()
   ->getCellByColumnAndRow($col, $row)
   ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);