时间太长使用壶嘴库使用PHP和mysqli的Excel的出口?

问题描述 投票:0回答:2

我在使用喷库生成Excel中时面临的一个问题。它正在采取永远完成。我有一个大的数据量输出。这将产生至少600行和在Excel 98列。

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;
}

我想导出非常快速模式出类拔萃,但实际上它走2个多小时。对于少数员工则生成的Excel非常快,但不超过500名员工。

php mysqli codeigniter-3 spout
2个回答
0
投票

你应该开始寻找bottlenecks.600行不匹配。你知道,如果这个问题是在Excel的图书馆吗?你会尝试测量应用程序的任何部分的时间。


0
投票

600行,100列= 60,000个细胞。据the doc,它不应该超过几秒钟,以生成电子表格。

所以我敢肯定,在很长一段时间它需要有事情做与喷口周围的代码(也许仔细检查数据如何获取?)。您可以添加日志,看看那里的时间是在你的程序中度过。

此外,而不是使用$writer->openToFile($filePath)和读取文件将其发送给浏览器,就可以直接使用$writer->openToBrowser($fileName)。无需设置额外的头。

© www.soinside.com 2019 - 2024. All rights reserved.