我正在处理来自gdocs的相对较大的电子表格,并通过zend库访问它们。我在任何给定时间只需要某些列,因此为了节省内存,使用基于列表的提要仅检索这些特定列而不是整个电子表格会很有帮助。我使用的基本查询是根据zend文档
$query = new Zend_Gdata_Spreadsheets_ListQuery();
$query->setSpreadsheetKey($spreadsheetKey);
$query->setWorksheetId($worksheetId);
$listFeed = $spreadsheetService->getListFeed($query);
我有机会通过$query->setSpreadsheetQuery('name=someName');
发送结构化查询,但据我所知,这只能用于限制返回的行数而不是列数。有没有办法以某种方式使用它来获取特定的列?或者,仅获得电子表格的某些先前指定的行将是有帮助的,以便仅检索电子表格的块并且当时稀疏一个块。无论哪种方式,我都需要避免在任何给定时间将整个电子表格放在内存中。
感谢您的帮助。
答案 0 :(得分:0)
我设法使用基于单元格的Feed来解决此问题。基本上我所做的是首先得到特定列标题的列号,如此
$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
,我可以遍历该列。人们必须小心选择这些,因为如果它们“超出范围”,谷歌api将返回一个http 400代码。单元格不必具有值,但它们必须存在(向下滚动电子表格,您看到的最后一行数应该是两个值的最大值)。我认为默认情况下会创建一个包含100(空)行的电子表格。
这可能不是最优雅或最快的解决方案,但它对我有用。