Мне нужна ваша помощь, чтобы решить одну проблему.
Я пытался найти ответ, но не нашел ни одного.
Я использую 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
}
Есть ли правильный способ решить эту проблему? Спасибо.
По умолчанию итератор ячейки будет перебирать только те ячейки, которые действительно существуют.
$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());
}
}
Других решений пока нет …