Я работаю над проектом, в котором мне нужно экспортировать электронную таблицу, заполнить ее вручную, а затем снова импортировать в систему. я использую 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 неверен.
Марк Бейкер попросил меня провести тест формулы, который можно найти Вот который дает следующую отладку, если кто-то может понять это.
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 заполняться так, как в моей электронной таблице), т.е. да, нет и нет данных …
Если вы зашли так далеко, спасибо и, надеюсь, вы сможете помочь или указать мне правильное направление.
Очень признателен,
Адам.
Задача ещё не решена.
Других решений пока нет …