使用PHPExcel读取包含命名范围的公式结果

使用PHPExcel读取包含命名范围的公式结果,php,phpexcel,phpexcelreader,Php,Phpexcel,Phpexcelreader,我正在做一个项目,需要导出一个电子表格,手动填充,然后再次导入到系统中。我用来做所有的艰苦工作 电子表格基本上是一组需要回答的问题。(). 每个问题的答案都在数据验证列表中,该列表来自使用命名范围的另一张表(答案)。问题和答案都带有唯一的ID,这样我就可以轻松地将结果读回数据库 questionID存储在B列中,并在我创建电子表格时插入。然而,应答ID是通过查找(在C列中)完成的,因为应答ID将根据选择的答案而改变。每组答案都有两个命名范围,一个用于列表中的答案,另一个用于查找。这些命名范围被标

我正在做一个项目,需要导出一个电子表格,手动填充,然后再次导入到系统中。我用来做所有的艰苦工作

电子表格基本上是一组需要回答的问题。(). 每个问题的答案都在数据验证列表中,该列表来自使用命名范围的另一张表(答案)。问题和答案都带有唯一的ID,这样我就可以轻松地将结果读回数据库

questionID存储在B列中,并在我创建电子表格时插入。然而,应答ID是通过查找(在C列中)完成的,因为应答ID将根据选择的答案而改变。每组答案都有两个命名范围,一个用于列表中的答案,另一个用于查找。这些命名范围被标记为answers\u questionID和answers\u lookup\u questionID。C列中用于获取查找值的公式为:

=索引(答案查找1,匹配(E6,答案1,0),2)

我使用索引和匹配而不是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);
}
我尝试了多种不同的公式和读取数据的方法。我对数据进行了循环,使用getCalculatedValue()而不是toArray(),仍然得到了相同的结果

我只能认为这可能是Functions.php中的INDEX函数中的一个bug,并且在使用命名范围读取公式时没有正确解释。如果我将传递的数组打印到INDEX(),结果是:

INDEX: Array
(
    [12] => Array
    (
        [A] =>
        [B] => 6
    )
    [13] => Array
    (
        [A] =>
        [B] => 7
    )
    [14] => Array
    (
        [A] =>
        [B] => 8
    )
)
哪些是正确的值(尽管我不确定A列是否应该像我的电子表格中那样填充),即是、否和不适用

如果你已经走了这么远,谢谢,希望你能帮助我,或者给我指出正确的方向

非常感谢


Adam。

看起来函数索引无法将单元格引用作为第二个参数处理

@@ -604,10 +604,13 @@ class PHPExcel_Calculation_LookupRef
         }

         if (!is_array($arrayValues)) {
             return PHPExcel_Calculation_Functions::REF();
         }
+        
+        $lrow = PHPExcel_Calculation_Functions::flattenSingleValue($rowNum); 
+        $rowNum = $lrow;

         $rowKeys = array_keys($arrayValues);
         $columnKeys = @array_keys($arrayValues[$rowKeys[0]]);

         if ($columnNum > count($columnKeys)) {
@@ -604,10 +604,13 @@ class PHPExcel_Calculation_LookupRef
         }

         if (!is_array($arrayValues)) {
             return PHPExcel_Calculation_Functions::REF();
         }
+        
+        $lrow = PHPExcel_Calculation_Functions::flattenSingleValue($rowNum); 
+        $rowNum = $lrow;

         $rowKeys = array_keys($arrayValues);
         $columnKeys = @array_keys($arrayValues[$rowKeys[0]]);

         if ($columnNum > count($columnKeys)) {