【问题标题】:cell formats in phpexcelphpexcel中的单元格格式
【发布时间】:2010-11-21 17:29:59
【问题描述】:

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

下面是我正在研究的东西的一个sn-p。

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

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

/彼得

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    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() 方法,该方法将返回工作表中所有单元格值的数组。

    【讨论】:

    • 谢谢,所有的好东西。但是 - 应用了这个并试图解析一个 csv 文件,但似乎我所有的单元格都被格式化为“一般”。文件看起来像这样:dl.dropbox.com/u/252696/csv.csv 这是 csv 格式的限制,如果是这样 - 如果 phpexcel 只返回单元格的内容不是更好吗?
    • 如果 PHPExcel 简单地返回“字符串”,它将失去处理 Excel 工作表中数据的所有能力。如果您只是想将 CSV 文件读入数组,最好的选择是 PHP 的内置 csv 处理函数,例如 fgetcsv()
    • 如果您希望 PHPExcel 将来自 CSV 文件的输入视为字符串而不是数字,那么您可以编写一个简单的“读取过滤器”,以确保来自文件的所有输入都被视为字符串。
    【解决方案2】:

    有比那些迭代器更容易的东西。对于做 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),而从中获取数据是一场噩梦。

    【讨论】:

      【解决方案3】:

      提供的解决方案都不适合我(使用 PHPExcel v1.7.5 导入 CSV) 我通过这样的设置值绑定解决了:

      PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder());
      

      PHPExcel_IOFactory::createReader('CSV')之前

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多