2015-03-13 51 views
2

我需要你的幫助來解決一個問題。如何在不跳過值的情況下讀取PHPExcel中的空單元格?

我試圖找到答案,但我沒有找到答案。 我使用PHPExcel 1.8.0從excel文件讀取數據。我正在使用ReadFilter來讀取特定的列。

主要PHP代碼。

 $price = UPLOAD_DIR . $price; 

     $file_type = PHPExcel_IOFactory::identify($price); 

     $filter = new ShipperReadFilter(); 

     $filter->getShipperSettings($shipper);   

     $reader = PHPExcel_IOFactory::createReader($file_type)->setReadDataOnly(true)->setReadFilter($filter)->load($price); 

     $worksheet = $reader->getActiveSheet(); 

     $col_number = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestDataColumn()); 

     $data = array(); 

     foreach ($worksheet->getRowIterator($filter->getStartRow()) as $row) { 

      $cellIterator = $row->getCellIterator(); 

      $item = array(); 

      foreach ($cellIterator as $cell) { 
       // May be PROBLEM is Here? 
       array_push($item, $cell->getCalculatedValue()); 
      } 

      array_push($data, $item); 
     }   

     var_dump($data); 

ReadFilter代碼。

class ShipperReadFilter implements PHPExcel_Reader_IReadFilter { 

public $valid_columns = array(); 

public $start_row; 

public function setValidColumns ($columns) { 
    $this->valid_columns = $columns; 
} 

public function getShipperSettings ($shipper) { 

    switch ($shipper) { 

     // Shipper 1 
     case 1 : 
      $this->setValidColumns(array('A', 'D', 'F')); 
      $this->start_row = 4; 
      break; 

     // Shipper 2 
     case 2 : 
      $this->setValidColumns(array('A', 'R', 'T')); 
      $this->start_row = 7; 
      break; 

     // Shipper 3 
     case 3 : 
      $this->setValidColumns(array('H', 'I', 'J')); 
      $this->start_row = 14; 
      break; 
    } 
} 

public function getStartRow() { 
    return $this->start_row; 
} 

public function readCell($column, $row, $worksheetName = '') { 

    if (in_array($column, $this->valid_columns)) { 
     return true; 
    } 
    return false; 
} 
} 

結果

array(3501) { 
    [0]=> array(2) { 
     [0]=> string(11) "01-00018239" 
     [1]=> float(2493) 
} 

但我需要這個

array(3501) { 
[0]=> array(3) { 
    [0]=> string(11) "01-00018239" 
    [1]=> float(2493) 
    [2]=> null // or '', or 0 
} 

有沒有辦法解決這個問題的正確方法?謝謝。

回答

2

默認情況下,電池迭代器將只遍歷實際存在

$cellIterator = $row->getCellIterator(); 
$cellIterator->setIterateOnlyExistingCells(false); 

$item = array(); 
foreach ($cellIterator as $cell) { 
    array_push($item, $cell->getCalculatedValue()); 
} 

然而細胞,如果你正在做的是建築計算值的數組的每一行,那麼你可能會發現,使用工作表的rangeToArray()方法更高效。

編輯

爲了讓只有符合讀過濾列清單細胞:

foreach ($cellIterator as $cell) { 
    $item[$cell->getColumn()] = $cell->getCalculatedValue(); 
} 
$item = array_intersect_key($item, array_flip($filter->valid_columns)); 

foreach ($cellIterator as $cell) { 
    if(in_array($cell->getColumn(), $filter->valid_columns)) { 
     array_push($item, $cell->getCalculatedValue()); 
    } 
} 
+0

謝謝你,馬克。此方法可行,但現在ReadFilter不起作用 - 讀取所有列,但我只想讀取3列...您能幫忙嗎? – xormax666 2015-03-13 09:37:54

+0

讀取過濾器不讀取定義範圍之外的那些列的單元格.....如果您嘗試爲未讀取的列獲取值,您將獲得NULL,因爲單元格不存在....但單元格迭代器不知道是否應該存在一列,因爲是否有過濾器......它將只迭代存在的單元格,或迭代所有單元格 – 2015-03-13 09:40:54

+0

如果構建單元格數組作爲關聯數組,列ID作爲索引;然後用你的託運人的列表做一個array_intersect_keys,那麼你將只有數組中的那些列 – 2015-03-13 09:45:15

相關問題