使用PHPExcel将数字读取为文本格式

Per*_*ack 16 php formatting phpexcel

我有一个可以存储数字的数组,如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');
Run Code Online (Sandbox Code Playgroud)

所以,通过这样做,我得到数字,如01,01A,02,02B ......并将其存储在行A2中.我得到最高的列在条件For中使用此值.在这种情况下,我设置A范围内的第1行,直到最高列,形成文本.

我的模板已生成,所有数字都是文本格式,但问题是我认为当我使用" fromArray()"方法时,它会转换数组的数字,然后才能在excel中正确使用它.你知道我怎么能解决这个问题?

Mar*_*ker 29

使用数字格式进行格式化会影响数字的显示方式,而不会影响数字的存储方式.

您必须将数字显式存储为字符串,因此不能使用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 );
Run Code Online (Sandbox Code Playgroud)

编辑#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); 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

要避免自动装带器出现任何问题,请在/ Classes/PHPExcel/Cell目录中创建.否则,为该类提供您自己的非PHPExcel名称,并确保它是独立加载的.

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

PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_MyValueBinder() );
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,但是是的 - fromArray() 是一种快捷方式,但其灵活性有限,因此它“猜测”数据类型(单元格默认值绑定器处理此问题)......替代方法是设置一个始终处理字符串的自定义值绑定器作为字符串,即使该字符串值为数字;那么你可以使用 fromArray()。 (2认同)

Jim*_*aro 8

如果您需要将整个工作表编号转换为 text,您可以使用calculateWorksheetDimension()来获取工作表的尺寸(例如:' A1:B200 ' 或' A1:C150 '),然后在 中使用它getStyle(),如下所示:

// Get sheet dimension
$sheet_dimension = $spreadsheet->getActiveSheet()->calculateWorksheetDimension();

// Apply text format to numbers
$spreadsheet->getActiveSheet()->getStyle($sheet_dimension)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);
Run Code Online (Sandbox Code Playgroud)

注:本例使用PhpSpreadsheet因为它的下一个版本PHPExcel


小智 6

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

如果您将您的值包装在="VALUE"其中,它将作为文本出现,而不是转换它,并且在您的电子表格中它不会有引号


小智 5

$objPHPExcel
   ->getActiveSheet()
   ->getCellByColumnAndRow($col, $row)
   ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
Run Code Online (Sandbox Code Playgroud)

  • 您通常应该在答案中添加一些解释或信息,而不仅仅是一个简短的片段 (4认同)