我正在做一个项目,我需要导出电子表格,手动填充它,然后再次将其导入回系统。我正在使用PHPExcel来完成所有艰苦的工作。
电子表格基本上是一组需要回答的问题。(您可以在此处下载电子表格的示例)。每个问题的答案都在一个数据验证列表中,该列表来自另一个使用命名范围的工作表(答案)。问题和答案都带有唯一的 ID,以便我可以轻松地将结果读回数据库。
questionID 存储在 B 列中,并在我创建电子表格时插入。但是 answerID 是通过查找(在 C 列中)完成的,因为 answerID 会根据选择的答案而改变。每组答案都有两个命名范围 1 用于列表中的答案和一个用于查找。这些命名范围标记为 answers_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 甚至没有在电子表格中读取)。
Mark Baker 让我运行一个公式测试,可以在这里找到它,如果有人能理解它,它会给出以下调试。
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() 结果是:
INDEX: Array
(
[12] => Array
(
[A] =>
[B] => 6
)
[13] => Array
(
[A] =>
[B] => 7
)
[14] => Array
(
[A] =>
[B] => 8
)
)
哪些是正确的值(尽管我不确定是否应该像我的电子表格中那样填充 A 列),即是、否和 N/A...
如果您已经走到了这一步,谢谢,希望您能帮助我或为我指明正确的方向。
非常感激,
亚当。