2015-03-16 6 views
1

Я разрабатываю импортер на основе библиотеки PHPExcel.Неправильная ссылка на ячейку в PHPExcel

Этот кусок кода сохраняет ячейки для последующего использования.

foreach ($this->importModel->currentAttributeNames as $columnLabel => $attribute) { 
    $cell = $this->_sheet->getCell($columnLabel . $row->getRowIndex()); 
    $this->importModel->importModelAttributes[$attribute]->setDefaultValueCell($cell);   
} 

$this->_sheet содержит текущий лист, который является действительным PHPExcel_Worksheet объектом.

Сохраненные ячейки содержат действительный PHPExcel_Cell объект.

Позже я попытаться использовать его также в foreach цикле:

foreach ($this->importModel->importModelAttributes as $importModelAttribute) { 
    var_dump($importModelAttribute->_defaultValueCell); 

    ... 
} 

$importModelAttribute->_defaultValueCell->getValue() возвращает правильное значение, но getCoordinate() возвращает координаты первой ячейки последней строки с данными в этом листе (A11), тогда как оно должно be B7.

Выполнены некоторые другие расчеты, и они зависят от стиля ячеек (цвет в этом случае), а также возвращает стиль от ячейки A11.

Для тестирования и отладки я также пытался клонировать объекты ячеек, но безуспешно.

ответ

2

Объект коллекции ячеек в PHPExcel хранит одну ячейку (последнюю ссылку) как активную ячейку .... ваш объект $cell является фактически указателем, указывающим на эту активную ячейку.

С практической точки зрения, ваш призыв к setDefaultValueCell($cell); будет хранить указатель ячейки в $defaultValueCell, который будет указывать на правильную ячейку в точке, где вы делаете вызов, но следующая итерация будет регулировать, что указатель на новый $cell значение, потому что tat - новая «активная» ячейка.

Вы можете попробовать «клонировать» с помощью

$cell = clone $this->_sheet->getCell($columnLabel . $row->getRowIndex()); 

но вы, вероятно, лучше всего хранить адрес ячейки/координаты в $defaultValueCell, а затем с помощью

foreach ($this->importModel->importModelAttributes as $importModelAttribute) { 
    $cell = $this->_sheet->getCell($importModelAttribute->_defaultValueCell) 
    ... 
} 

в вашем втором цикле

+0

Спасибо за объяснение. Я на самом деле думал о сохранении числа координат и листов в качестве альтернативы. Если я снова вызову 'getCell ($ координат)', где он будет загружен? Из кеша или будет обработан снова? Другими словами, как это повлияет на производительность? – arogachev

+1

Еще один вызов getCell() перезагрузит эту ячейку из кеша (если она кэширована) и сбросит ее как активную ячейку ... сколько из служебных данных производительности будет зависеть от используемого вами кеширования –

Смежные вопросы