Чтение результатов формулы, содержащих именованные диапазоны, с помощью PHPExcel

Я работаю над проектом, в котором мне нужно экспортировать электронную таблицу, заполнить ее вручную, а затем снова импортировать в систему. я использую PHPExcel сделать всю тяжелую работу.

Электронная таблица — это в основном набор вопросов, на которые необходимо ответить. (Вы можете скачать пример таблицы здесь). Ответы на каждый вопрос в Список проверки данных которые приходят с другого листа (ответы) с использованием именованных диапазонов. И вопросы, и ответы поставляются с уникальными идентификаторами, так что я могу легко прочитать результаты обратно в базу данных.

QuestionID хранится в столбце B и вставляется при создании электронной таблицы. Однако answerID выполняется с помощью поиска (в столбце C), поскольку answerID будет меняться в зависимости от выбранного ответа. Каждый набор ответов имеет два именованных диапазона: 1 для ответов в списке и один для поиска. Эти именованные диапазоны помечены answer_questionID и answers_lookup_questionID. Формула, используемая в столбце C для получения значений поиска:

=INDEX(answers_lookup_1, MATCH(E6, answers_1, 0),2)

Я использую INDEX и MATCH вместо VLOOKUP, потому что я не хочу сортировать данные по алфавиту.

Все это прекрасно работает в электронной таблице, когда я пытаюсь прочитать ее, у меня возникает проблема. Когда я пытаюсь прочитать значения обратно, я либо получаю 0 (все они должны быть положительными целыми числами) или #REF!

Вот что я делаю, когда читаю данные обратно в:

$objPHPExcel = new PHPExcel();

// Set a read filter so that we can restrict what we're loading in
class MyReadFilter implements PHPExcel_Reader_IReadFilter {
private $_iStartRow = 0;
private $_iEndRow = 0;
private $_aColumns = array();

public function __construct($iStartRow, $iEndRow, $aColumns) {
$this->_iStartRow   = $iStartRow;
$this->_iEndRow     = $iEndRow;
$this->_aColumns    = $aColumns;
}

public function readCell($iCol, $iRow, $sWorksheetName = '') {
if ($iRow >= $this->_iStartRow && $iRow <= $this->_iEndRow) {
if (in_array($iCol, $this->_aColumns)) {
return true;
}
}
return false;
}
}

$objFilterSubset = new MyReadFilter(5, 500, range('B', 'L'));

// Which type of reader do we need.
if (!extension_loaded('zip')) dl('php_zip.dll');
$objReader = new PHPExcel_Reader_Excel2007();

// Set the read filter so we don't get EVERYTHING
$objReader->setReadFilter($objFilterSubset);

// Load the actual data
$objPHPExcel = $objReader->load($sFilename);

// Store the data in an array
$aSheetNames = $objPHPExcel->getSheetNames();

foreach ($aSheetNames as $iSheetNum => $sSheetName) {
$objPHPExcel->setActiveSheetIndex($iSheetNum);
$aSheetData[$sSheetName] = $objPHPExcel->getActiveSheet()->toArray(null,true,true,false);
}

Таким образом, я получаю хороший большой массив со всеми моими данными, только столбец C неверен.

  • В моей формуле нет ничего плохого, так как она работает в Excel.
  • Я пробовал более простые версии формул, и они работают, т.е. суммируют несколько ячеек вместе.
  • Оба листа присутствуют во время чтения.
  • Все именованные диапазоны устанавливаются нормально во время чтения.
  • Я использую v 1.7.4, но я пробовал все версии до 1.7.9 (1.8.0 даже не читает в электронной таблице).

Марк Бейкер попросил меня провести тест формулы, который можно найти Вот который дает следующую отладку, если кто-то может понять это.

Formula Value is =INDEX(answers_lookup_1, MATCH(E6, answers_1, 0),2)
Expected Value is 7 Parser Stack :-

Array (
[0] => Array
(
[type] => Value
[value] => answers_lookup_1
[reference] =>
)

[1] => Array
(
[type] => Cell Reference
[value] => E6
[reference] => E6
)

[2] => Array
(
[type] => Value
[value] => answers_1
[reference] =>
)

[3] => Array
(
[type] => Value
[value] => 0
[reference] =>
)

[4] => Array
(
[type] => Operand Count for Function MATCH()
[value] => 3
[reference] =>
)

[5] => Array
(
[type] => Function
[value] => MATCH(
[reference] =>
)

[6] => Array
(
[type] => Value
[value] => 2
[reference] =>
)

[7] => Array
(
[type] => Operand Count for Function INDEX()
[value] => 3
[reference] =>
)

[8] => Array
(
[type] => Function
[value] => INDEX(
[reference] =>
)

)

Calculated Value is 0

Evaluation Log:
Array
(
[0] => Questions!C6 -> Evaluating Named Range answers_lookup_1
[1] => Questions!C6 -> Evaluation Result for named range A4:B6 is a matrix with a value of { , ; , 7; , 8 }
[2] => Questions!C6 -> Evaluating Cell E6 in current worksheet
[3] => Questions!C6 -> Evaluation Result for cell Questions!E6 is a string with a value of Yes
[4] => Questions!C6 -> Evaluating Named Range answers_1
[5] => Questions!C6 -> Evaluation Result for named range A4:A6 is a matrix with a value of { ; ;  }
[6] => Questions!C6 -> Evaluating Function MATCH() with 3 arguments
[7] => Questions!C6 -> Evaluating MATCH( Yes, { ; ;  }, 0 )
[8] => Questions!C6 -> Evaluation Result for MATCH() function call is a #N/A error
[9] => Questions!C6 -> Evaluating Function INDEX() with 3 arguments
[10] => Questions!C6 -> Evaluating INDEX( { , ; , 7; , 8 }, #N/A, 2 )
[11] => Questions!C6 -> Evaluation Result for INDEX() function call is a null value
)

Я пробовал несколько вариантов формул и способов чтения данных. Я зацикливался на данных и использовал getCalculatedValue () вместо toArray () и все еще получил те же результаты.

Я могу только думать, что это может быть ошибка в ИНДЕКС функция в functions.php и что формула неправильно интерпретируется при использовании именованных диапазонов. Если я распечатаю переданный массив в INDEX (), результат будет:

INDEX: Array
(
[12] => Array
(
[A] =>
[B] => 6
)
[13] => Array
(
[A] =>
[B] => 7
)
[14] => Array
(
[A] =>
[B] => 8
)
)

которые являются правильными значениями (хотя я не уверен, должен ли столбец A заполняться так, как в моей электронной таблице), т.е. да, нет и нет данных …

Если вы зашли так далеко, спасибо и, надеюсь, вы сможете помочь или указать мне правильное направление.

Очень признателен,

Адам.

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]