Я имею дело с 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