0

gdocs の比較的大きなスプレッドシートを使用しており、zend ライブラリ経由でアクセスしています。常に特定の列のみが必要なので、メモリを節約するために、リストベースのフィードを使用して、スプレッドシート全体ではなく特定の列のみを取得すると便利です。私が使用している基本的なクエリは、zendのドキュメントによるものです

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

構造化クエリを送信する機会があります$query->setSpreadsheetQuery('name=someName');が、私が見る限り、これは列数ではなく、返される行数を制限するためにのみ機能します。これを何らかの形で使用して特定の列を取得する方法はありますか? 別の方法として、スプレッドシートの特定の、以前に指定された行のみを取得して、スプレッドシートのブロックのみを取得し、一度に 1 つのブロックを間引くことが役立つ場合があります。いずれにせよ、いつでもスプレッドシート全体をメモリに保持することは避ける必要があります。

助けてくれてありがとう。

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 に答える