Слишком много времени для экспорта в Excel с использованием библиотеки spout с php & mysqli? - PullRequest
0 голосов
/ 04 февраля 2019

Я столкнулся с проблемой во время создания Excel с использованием библиотеки носика.Это займет вечность, чтобы завершить.У меня есть большой объем данных для экспорта.В результате будет создано не менее 600 строк и 98 столбцов в Excel.

require(APPPATH .'libraries/spout/src/Spout/Autoloader/autoload.php');  
$this->load->model('Report_model','report');
$pay_ele = $this->report->pay_elements_data();// iT has 70+ codes like 
hra,Da etc.
$pay_code = '';
$array = [];
array_push($array,'E- 
ID','Name','Month','Year','Department','Grade','Accno','Bank 
Name','IFSC','Aadhar','PFNo','ESI','PAN','Working 
Days','Holidays','Weekoffs','Presents','Leaves','Absents');
foreach( $pay_ele as $pay) {
array_push($array,$pay->code);
}
array_push($array, 'Gross Pay');
array_push($array, 'Net Pay');
$writer->addRowWithStyle($array, $style);
if(empty($employee_id)) {
$employees  = $this->report->find_all_employee_ids();
}
foreach ( $employees as $emp) {
$employee_id    = $emp->employee_id;
$name           = $emp->full_name;
$department     = $emp->company_department;
$grades         = $emp->category_code;
$bank_details       = $this->report->find_bank_details($employee_id);
$p_det              = $this->report->personal_detail($employee_id);
$mon_dat  = $this->report->find_all_monhtlydata($employee_id,$month,$year);
if(!empty($mon_dat)) {
foreach ( $mon_dat as $mondata) {
$absent_days    = $mondata->absent_days; 
$present_days       = $mondata->present_days;
$working_days   = $mondata->working_days;
$holidays       = $mondata->holidays;
$week_off       = $mondata->week_off;
$leave_days     = $mondata->leave_days;
}
}
foreach( $bank_details as $bank) {
$acc_number = $bank->account_number;
$bank_name = $bank->bank_name;
$ifsc_code = $bank->ifsc_code;
}
$data1 = [$employee_id,$name,$month,$year,$department,$grades,$acc_number,
          $bank_name,$ifsc_code,$addhar,$pf,$esi,$pan,$working_days];
$gtotAmt = 0;
$totAmt = 0;
foreach( $pay_ele as $pay) {
$n_data = $this->report->find_pay_ledger_data_withparametrs
          ($employee_id,$month,$year,$department,$pay->code);
$amt = 0;
foreach( $n_data as $dat) {
$amt = round($dat->amount,2);
$totAmt += round($dat->amount,2);
if($pay->type == 'ADDITION') {
$gtotAmt += round($dat->amount,2);
} }
array_push($data1,$amt); 
}
array_push($data1,$gtotAmt);
array_push($data1,$totAmt);
$writer->addRow($data1);
}
$writer->close();
if (file_exists($filePath)
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; 
filename="'.basename($filePath).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filePath));
readfile($filePath);
exit;
}

Я хочу экспортировать Excel в очень быстром режиме, но на самом деле это занимает более 2 часов.Для немногих сотрудников он генерирует Excel очень быстро, но не для 500+ сотрудников.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

600 строк, 100 столбцов = 60000 ячеек.Согласно документу , создание электронной таблицы должно занимать не более нескольких секунд.

Так что я уверен, что длительное время связано с кодом вокругНосик (может быть, дважды проверить, как данные выбираются?).Вы можете добавить журналы, чтобы увидеть, сколько времени тратится в вашей программе.

Кроме того, вместо использования $writer->openToFile($filePath) и чтения файла для отправки его в браузер, вы можете использовать $writer->openToBrowser($fileName) напрямую.Нет необходимости устанавливать дополнительные заголовки.

0 голосов
/ 04 февраля 2019

Вы должны начать искать узкие места. 600 строк не совпадают.Вы уверены, что проблема в библиотеке Excel?Вы будете пытаться измерить время в любой части приложения.

...