我有一个可以存储数字的数组,例如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,11A,02,02B等数字......我将它存储在行A2中。我得到最高的列在条件For中使用此值。在这种情况下,我设置A范围内的第1行,直到最高列,形成文本。
生成了我的模板,并且所有数字都是文本格式,但问题是我认为当我使用“fromArray()
”方法时,它会在我正确对齐之前转换数组的数字在excel中。
你知道我怎么能解决这个问题吗?
答案 0 :(得分:26)
使用数字格式进行格式化会影响数字显示的方式,而不会影响存储的方式。
您必须将数字存储显式为字符串,因此您无法使用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() );
答案 1 :(得分:2)
我知道这些都是前一段时间发布的,但我想分享一些对我有用的内容,因此您仍然可以使用->fromArray
而不必遍历整个电子表格。
如果您将值包装在="VALUE"
中,它将以文本形式出现,而不是将其转换,并且在电子表格中不会有引号
答案 2 :(得分:1)
$objPHPExcel
->getActiveSheet()
->getCellByColumnAndRow($col, $row)
->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
答案 3 :(得分:1)
如果您需要将整个工作表编号转换为文本,则可以使用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);
注意:该示例使用PhpSpreadsheet,因为它是 PHPExcel 的下一版本。
答案 4 :(得分:0)
您可以将值格式化为文本,并在值之前或之后添加字符。示例在值字符“;”之后添加
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $row,$user->msisdn.';' );