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

2022-08-30 20:23:41

我有一个数组可以存储数字,例如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行。我得到最高的列在条件 For 中使用此值。在这种情况下,我将范围 A 中的 Row 1 设置为最高列,以设置为文本格式。

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


答案 1

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

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

答案 2

如果您需要将整个工作表编号转换为文本,则可以使用 来获取工作表的尺寸(例如:“A1:B200”或“A1:C150”),然后在 中使用它,如下所示:calculateWorksheetDimension()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);

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


推荐