Работя със 700 реда данни в моя Excel.
И добавям в колона този запис:
foreach($data as $k => $v){
$users ->getCell('A'.$k)->setValue($v['Username']);
$users->setCellValueExplicit('B'.$k,
'=INDEX(\'Feed\'!H2:H'.$lastRow.',MATCH(A'.$k.',\'Feed\'!G2:G'.$lastRow.',0))',
PHPExcel_Cell_DataType::TYPE_FORMULA);
}
$users
означава електронна таблица.
Виждам, че писането на 700 клетки с горното setCellValueExplicit()
отнема повече от 2 минути, за да бъде обработено. Ако пропусна този ред, обработката му отнема 4 секунди на същата машина.
2 минути може да са добре, но какво ще стане, ако имам 2000 клетки. Има ли начин да се оптимизира скоростта?
ps: =VLOOKUP
е същата бавна като горната функция.
Актуализация
Цялата идея на скрипта: прочетете CSV файл (13 колони и поне 100 реда), запишете го в електронна таблица, създайте нова електронна таблица ($users
), прочетете две колони, сортирайте ги въз основа на една колона и я запишете в $users
електронна таблица.
Прочетете колоните:
$data = array();
for ($i = 1; $i <= $lastRow; $i++) {
$user = $Feed ->getCell('G'.$i)->getValue();
$number = $Feed ->getCell('H'.$i)->getValue();
$row = array('User' => $user, 'Number' => $number);
array_push($data, $row);
}
Сортирайте данните
function cmpb($a,$b){
//get which string is less or 0 if both are the same
if($a['Number']>$b['Number']){
$cmpb = -1;
}elseif($a['Number']<$b['Number']){
$cmpb = 1;
}else{
$cmpb = 0;
}
//if the strings are the same, check name
if($cmpb == 0){
//compare the name
$cmpb = strcasecmp($a['User'], $b['User']);
}
return $cmpb;
}
usort($data, 'cmpb');
Запишете данни
foreach($data as $k => $v){
$users ->getCell('A'.$k)->setValue($v['Username']);
$users ->getCell("B{$k}")->setValueExplicit("=INDEX('Feed'!H2:H{$lastRow},MATCH(A{$k},'Feed'!G2:G{$lastRow},0))",
PHPExcel_Cell_DataType::TYPE_FORMULA);
}
и също дезадайте данните за паметта:
unset($data);
Така че, ако коментирате линията с setValueExplicit
, всичко става по-гладко.
setCellValueExplicit
, е малко нечетлива поради всички тези конкатенации и бягство в единичните кавички. Можете да го замените с"=INDEX('Feed'!H2:H{$lastRow},MATCH(A{$k},'Feed'!G2:G{$lastRow},0))"
. - person Rolando Isidoro   schedule 09.05.2013setCellValueExplicit()
да е значително по-бавен отgetCell()->setValue()
, но можете да опитатеgetCell()->setValueExplicit()
, както Роландо предложи. - person Mark Baker   schedule 10.05.2013