0

我正在处理来自 gdocs 的相对较大的电子表格,并通过 zend 库访问它们。我在任何给定时间只需要某些列,因此为了节省内存,使用基于列表的提要仅检索这些特定列而不是整个电子表格会很有帮助。我使用的基本查询是根据 zend 文档

$query = new Zend_Gdata_Spreadsheets_ListQuery();
$query->setSpreadsheetKey($spreadsheetKey);
$query->setWorksheetId($worksheetId); 
$listFeed = $spreadsheetService->getListFeed($query);

我有机会通过发送结构化查询,$query->setSpreadsheetQuery('name=someName');但据我所知,这仅适用于限制返回的行数而不是列数。有没有办法以某种方式使用它来获取特定的列?或者,仅获取电子表格的某些先前指定的行以便仅检索电子表格的块并在当时稀化一个块将是有帮助的。无论哪种方式,我都需要避免在任何给定时间将整个电子表格放在内存中。

谢谢你的帮助。

4

1 回答 1

0

我设法使用基于单元的提要解决了这个问题。基本上我所做的是首先获取特定列标题的列号,如下所示

$query = new Zend_Gdata_Spreadsheets_CellQuery();
$query->setSpreadsheetKey($spreadsheetkey);
$query->setWorksheetId($wworksheetkey);
$query->setMinRow(1);
$query->setMaxRow(1);
$headerFeed = $spreadsheetService->getCellFeed($query);

foreach($headerFeed as $cellEntry){
    if(strcasecmp($cellEntry->cell->getText(), $column) ==  0){
        $colNr = $cellEntry->cell->getColumn();
        break;
    }
}

这将为我提供该列的列号$column。然后,我将继续获取给定列号的特定行范围,以便我可以逐块读取整个列,而无需将整个电子表格(或列)放在内存中。这可以作为

$query->setMinCol($colNr);
$query->setMaxCol($colNr);
$query->setMinRow($startingRow);
$query->setMaxRow($endingRow);

$columnFeed = $spreadsheetService->getCellFeed($query);
foreach($columnFeed as $cellEntry){
    $result[$cellEntry->cell->getRow()] = $cellEntry->cell->getText();
}

通过更改$startingRow$endingRow我可以遍历该列。但是,必须小心选择这些,因为如果它们“越界”,google api 将返回一个 http 400 代码。单元格中不必有值,但它们必须存在(向下滚动电子表格,您看到的最后一行编号应该是两个值的最大值)。我认为默认情况下会创建一个包含 100(空)行的电子表格。

这可能不是最优雅或最快的解决方案,但它对我有用。

于 2012-07-20T00:57:11.430 回答