Я столкнулся с проблемой во время создания 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+ сотрудников.
Вы должны начать искать узкие места. 600 строк не совпадают. Вы уверены, что проблема в библиотеке Excel? Вы будете пытаться измерить время в любой части приложения.
600 строк, 100 столбцов = 60000 ячеек. В соответствии с документ, создание таблицы не займет более нескольких секунд.
Так что я уверен, что длительное время связано с кодом вокруг Spout (возможно, дважды проверьте, как данные извлекаются?). Вы можете добавить журналы, чтобы увидеть, где время тратится в вашей программе.
Кроме того, вместо использования $writer->openToFile($filePath)
и прочитать файл, чтобы отправить его в браузер, вы можете использовать $writer->openToBrowser($fileName)
непосредственно. Не нужно устанавливать дополнительные заголовки.