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
}
有沒有辦法解決這個問題的正確方法?謝謝。
謝謝你,馬克。此方法可行,但現在ReadFilter不起作用 - 讀取所有列,但我只想讀取3列...您能幫忙嗎? – xormax666 2015-03-13 09:37:54
讀取過濾器不讀取定義範圍之外的那些列的單元格.....如果您嘗試爲未讀取的列獲取值,您將獲得NULL,因爲單元格不存在....但單元格迭代器不知道是否應該存在一列,因爲是否有過濾器......它將只迭代存在的單元格,或迭代所有單元格 – 2015-03-13 09:40:54
如果構建單元格數組作爲關聯數組,列ID作爲索引;然後用你的託運人的列表做一個array_intersect_keys,那麼你將只有數組中的那些列 – 2015-03-13 09:45:15