【问题标题】:Read xls file using PHPExcel lib and get cell type使用 PHPExcel lib 读取 xls 文件并获取单元格类型
【发布时间】:2013-11-12 20:44:51
【问题描述】:

我使用 PHPExcel 读取 XLS 文件。有单元格日期列。该数据列有两种类型的单元格(日期和文本类型的单元格)。

我需要获取 XLS 文件中单元格的视图值。因此,在获取单元格的值之前,我想确定该单元格是日期单元格还是文本单元格。

如何获取 XLS 文件单元格的视图值。是否有 getCellType()、getViewValueOfCell() 之类的方法或任何其他方法来获取单元格的视图值?

注意:$cell->getType 在 PHPExcel 中不是真正的方法。这个伪方法。

请为下面的单元格读取建议最佳逻辑/方法。

 // read view value form date column
 if($cell->getType == 'Date'){
  $array_data[$rowIndex][$cell->getColumn()] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 'YYYY-MM-DD'); 
 }
 else if($cell->getType == 'Text'){
  $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
 }

这是我所有的 XLS 读取功能

       $objReader = new PHPExcel_Reader_Excel5();
   $objReader->setReadDataOnly(true);
   $objPHPExcel = $objReader->load($file_path);
   $rowIterator = $objPHPExcel->getActiveSheet()->getRowIterator();

   $array_data = array();
   foreach ($rowIterator as $row) {
      $cellIterator = $row->getCellIterator();
      $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
      // if(1 == $row->getRowIndex ()) continue;//skip first row
      $rowIndex = $row->getRowIndex();
      $array_data[$rowIndex] = array('A' => '', 'B' => '', 'C' => '', 'D' => '');

      foreach ($cellIterator as $cell) {
         if ('A' == $cell->getColumn()) {
            $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
         } else if ('B' == $cell->getColumn()) {
            $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
         } else if ('C' == $cell->getColumn()) {
            // read view value form date column
             if($cell->getType == 'Date'){
              $array_data[$rowIndex][$cell->getColumn()] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 'YYYY-MM-DD'); 
             }
             else if($cell->getType == 'Text'){
              $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
             }
         } else if ('D' == $cell->getColumn()) {
            $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
         }
      }
   }

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    单元格的 getDataType() 将返回单元格中包含的值的数据类型

    有效的数据类型在 PHPExcel_Cell_DataType 中定义:

    const TYPE_STRING2  = 'str';
    const TYPE_STRING   = 's';
    const TYPE_FORMULA  = 'f';
    const TYPE_NUMERIC  = 'n';
    const TYPE_BOOL     = 'b';
    const TYPE_NULL     = 'null';
    const TYPE_INLINE   = 'inlineStr';
    const TYPE_ERROR    = 'e';
    

    请注意,日期或时间没有数据类型:日期/时间是 MS Excel 中的浮点数据类型。

    要确定单元格是否包含日期/时间值,您需要检查数字格式掩码。为了简化这一点,PHPExcel_Shared_Date 类中提供了以下方法,用于将数字格式掩码标识为与日期/时间相关的掩码

    isDateTime()

    /**
     * Is a given cell a date/time?
     *
     * @param    PHPExcel_Cell  $pCell
     * @return   boolean
     */
    

    isDateTimeFormat()

    /**
     * Is a given number format a date/time?
     *
     * @param    PHPExcel_Style_NumberFormat    $pFormat
     * @return   boolean
     */
    

    isDateTimeFormatCode()

    /**
     * Is a given number format code a date/time?
     *
     * @param    string $pFormatCode
     * @return   boolean
     */
    

    API 文档应该已经为您确定了这些

    【讨论】:

    • 我目前正在试验 PHPExcel v1.8.1,即使对于包含日期的单元格,PHPExcel_Shared_Date::isDateTime() 也会返回 false。不要依赖这个函数。
    • @Pontiac_CZ - 您没有(出于某种原因)加载 readDataOnly 设置为 true 的文件是吗?只要可以访问用于区分日期/时间值与浮点数的格式掩码,该函数就可以很好地工作...如果您不允许 PHPExcel 加载这些格式掩码,那么它将失败
    • @Pontiac_CZ 而不是简单地发布警告以在阅读本文的人中传播 FUD,你为什么不提出一个错误,通过问题的工作演示,然后它甚至可能得到修复.. . 肯定解决问题,而不是简单地抱怨它有利于每个人
    • 你说得对,我正在使用 setReadDataOnly()。我现在看到用户文档中有关于此的注释。我以前读过它,但当你不需要它时,你会忽略它。 :-)
    • PHPExcel_Shared_Date::isDateTime() 在没有格式掩码的单元格上使用时应该会产生某种警告甚至异常。我会在他们的 Github 上发布一个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2017-08-25
    • 2011-11-02
    相关资源
    最近更新 更多