我正在使用 insertRow 填充一个空的电子表格,它开始需要大约 1 秒来插入一行,然后在 150 行左右后减慢到大约 5 秒。
有没有人经历过这种行为?电子表格中的数据没有任何计算可能会随着更多数据而变得更长。
谢谢!
我正在使用 insertRow 填充一个空的电子表格,它开始需要大约 1 秒来插入一行,然后在 150 行左右后减慢到大约 5 秒。
有没有人经历过这种行为?电子表格中的数据没有任何计算可能会随着更多数据而变得更长。
谢谢!
我会尽量严格。
如果您查看“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 很棒,但有时在资源优化方面你不想过多地依赖他们的代码。