0

insertRow を使用して空のスプレッドシートにデータを入力しています。行を挿入するのに約 1 秒かかり、150 行程度で約 5 秒かかります。

この種の行動を経験した人はいますか?スプレッドシートのデータには、データが増えると長くなる可能性のある計算はありません。

ありがとう!

4

1 に答える 1

2

厳しくしてみます。

クラス "Zend_Gdata_Spreadsheets" を見ると、メソッド insertRow() が非常に最適ではない方法で記述されていることがわかります。見る:

public function insertRow($rowData, $key, $wkshtId = 'default')
{
    $newEntry = new Zend_Gdata_Spreadsheets_ListEntry();
    $newCustomArr = array();
    foreach ($rowData as $k => $v) {
        $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom();
        $newCustom->setText($v)->setColumnName($k);
        $newEntry->addCustom($newCustom);
    }

    $query = new Zend_Gdata_Spreadsheets_ListQuery();
    $query->setSpreadsheetKey($key);
    $query->setWorksheetId($wkshtId);

    $feed = $this->getListFeed($query);
    $editLink = $feed->getLink('http://schemas.google.com/g/2005#post');

    return $this->insertEntry($newEntry->saveXML(), $editLink->href, 'Zend_Gdata_Spreadsheets_ListEntry');
}

つまり、スプレッドシートに新しい行を投稿するために、この値 $editLink->href を学習するためだけに、スプレッドシート全体をロードします。

解決策は、このメソッド insertRow を使用しないことです。代わりに、コードで一度 $editLink->href を取得してから、このメソッドの残りの動作を再現することで毎回新しい行を挿入します。つまり、コードでは $service->insertRow() の代わりに次を使用します。

//get your $editLink once:
$query = new Zend_Gdata_Spreadsheets_ListQuery();
$query->setSpreadsheetKey($key);
$query->setWorksheetId($wkshtId);
$query->setMaxResults(1);

$feed = $service->getListFeed($query);
$editLink = $feed->getLink('http://schemas.google.com/g/2005#post');
....
//instead of $service->insertRow:
$newEntry = new Zend_Gdata_Spreadsheets_ListEntry();
$newCustomArr = array();
foreach ($rowData as $k => $v) {
    $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom();
    $newCustom->setText($v)->setColumnName($k);
    $newEntry->addCustom($newCustom);
}
$service->insertEntry($newEntry->saveXML(), $editLink->href, 'Zend_Gdata_Spreadsheets_ListEntry');

この素晴らしい答えを奨励することを忘れないでください。理解するのに数日かかりました。ZF は素晴らしいと思いますが、リソースの最適化に関しては、ZF のコードにあまり依存したくない場合があります。

于 2013-10-08T19:05:30.963 に答える