7

我正在尝试使用 phpexcel 读取一些 excel 文件,到目前为止效果还不错。不过,phpexcel 有点太聪明了,它会从我的单元格中删除前导零。我想我需要告诉它将单元格视为文本字符串,而不是一般或数字。但我失败了。我什至在 stackoverflow 上找到了关于此的线程,但建议的解决方案根本行不通。

下面是我正在做的事情的一个片段。

foreach(@$objWorksheet->getRowIterator() as $row){
    $cellIterator = $row->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(false);
    foreach($cellIterator as $cell){
        #$objWorksheet->getStyle($cell->getCoordinate())->getNumberFormat()->setFormatCode('@');
        $cells[] = $cell->getValue();
    }
}

任何的想法?我不想限制自己只阅读数字内容,因为我无法控制用户上传的内容。将所有内容都视为字符串将是完美的。

/彼得

4

3 回答 3

3

getValue() 方法完全可以做它应该做的事情,而不是试图变得聪明。它返回存储在单元格中的实际值。如果该单元格包含整数,则返回整数;如果单元格包含浮点数,则返回浮点数;如果它包含一个字符串,它返回一个字符串。聪明的做法是将该值作为格式化字符串返回(如果合适,可以使用前导零),然后您需要使用一种完全不同的方法,并将单元格格式应用于返回的值。

foreach($cellIterator as $cell){ 
   $cells[] = PHPExcel_Style_NumberFormat::toFormattedString( $cell->getValue(),
              $objPHPExcel->getCellXfByIndex( $cell->getXfIndex() )->getNumberFormat()->getFormatCode()
   );
}

或者如果单元格包含公式:

foreach($cellIterator as $cell){ 
   $cells[] = PHPExcel_Style_NumberFormat::toFormattedString( $cell->getCalculatedValue(),
              $objPHPExcel->getCellXfByIndex( $cell->getXfIndex() )->getNumberFormat()->getFormatCode()
   );
}

并且请不要使用@ 来尝试抑制错误。PHPExcel 抛出异常,你真的应该想捕获这些。

但是,对于您正在做的事情,您可能会考虑工作表的 toArray() 方法,该方法将返回工作表中所有单元格值的数组。

于 2010-11-21T17:39:22.393 回答
1

有比那些迭代器更容易的东西。对于做 foreach 也可以使用 toArray 方法,例如:

$active_sheet = $objPHPExcel -> getActiveSheet();
foreach($active_sheet -> toArray() as $row_n => $row){
 foreach($row as $cell_n => $cell){
  // operations here
 }
}

对我来说工作得很好,而且似乎比迭代器更快,就像马克贝克伤心一样。

在处理 CVS 时,我发现了一个主要问题:用户必须从 Excel 中导出数据,而这个过程对于大多数人来说可能会造成混淆。这就是为什么我寻找直接从 Excel 导入的解决方案。

使用这些迭代器对我来说很奇怪,我真的没有深入了解它。在使用迭代器访问数据时,它返回的序列化对象很少(在我的例子中是从 2 到 4),并且从中获取数据是一场噩梦。

于 2011-09-22T15:25:44.923 回答
1

没有提供的解决方案对我有用(使用 PHPExcel v1.7.5 导入 CSV)我通过设置值绑定器解决了这样的问题:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder());

PHPExcel_IOFactory::createReader('CSV')

于 2012-08-13T11:45:18.063 回答