深圳全飞鸿
标题:
beacon实现模板导出Excel
[打印本页]
作者:
zhgc
时间:
2023-2-17 19:44
标题:
beacon实现模板导出Excel
默认下载为xlsx文档 ,如果实现按模板导出Excel如果数据量非常大,建议用csv,请参考:
beacon实现下载CSV
http://www.nagomes.com/disc/foru ... d=718&fromuid=6
模板放置目录:
htdocs\sfc\excel_template
范例:FPY.xlsx
d:\project.syant\0005php\htdocs\sfc-source\modules\repair\mod.repair_00.php<<<<<
$path = $config->base_path.DIRECTORY_SEPARATOR.'excel_template'.DIRECTORY_SEPARATOR."FPY.xlsx";
需要重构:
createExcel
<?php
//by syant
//FPY报表需要处理一下excel的模板下载
//defined('WORK_PATH') or define('WORK_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR);
class REPAIR_00 extends tpage{
function REPAIR_00($app) {
parent::__construct($app);
}
/*
* 重构默认的Excel下载逻辑
*/
function createExcel(){
global $db, $config, $user, $report, $smarty;
$sqlstr = $smarty->tpl_vars["sql"];
$limit = 65000; //最大60K
//require_once("phar://beacon.inc.phar/page.inc.php");
include_once("page.inc.php");
$pager = new pager($limit, 1);
$data=$pager->execute($db, $sqlstr);
//$count=count($data); //数量
include_once($config->base_path."/libs/mi.excel.php");
//$objReader = PHPExcel_IOFactory::createReader ( 'Excel5' ); //如果模板是.xls的
$objReader = PHPExcel_IOFactory::createReader ( 'Excel2007' ); //如果模板是.xlsx的
$path = $config->base_path.DIRECTORY_SEPARATOR.'excel_template'.DIRECTORY_SEPARATOR."FPY.xlsx";//设置移动路径
$objPHPExcel = $objReader->load ($path);
$objPHPExcel->setActiveSheetIndex(0) ;
$objActSheet = $objPHPExcel->getActiveSheet();
//用于debug, 将SQL存在P2, 中间数据存在P3
$objActSheet->setCellValue('P2', $sqlstr);
$objActSheet->setCellValue('P3', var_export($data,true));
/*$ii=4;
foreach($smarty->tpl_vars as $kk=>$vv){
$objActSheet->setCellValue("P{$ii}", $kk);
$ii=$ii+1;
}
//echo print_r(debug_backtrace(),true);
*/
//填充模板内容
/*
SELECT '2021-06-13' DTBEGIN,'2021-06-13' DTEND,R.MODEL_NAME,r.GROUP_NAME,
sum(R.PASS_QTY) + sum(R.FAIL_QTY) Total_Qty,
sum(R.PASS_QTY) Pass_Qty, sum(R.FAIL_QTY) Fail_Qty,
format(100 * sum(R.FAIL_QTY)/IF((sum(R.PASS_QTY)+sum(R.FAIL_QTY))=0,1,(sum(R.PASS_QTY)+sum(R.FAIL_QTY))),2) Fail_Rate,
format(100 * sum(R.PASS_QTY)/IF((sum(R.PASS_QTY)+sum(R.FAIL_QTY))=0,1,(sum(R.PASS_QTY)+sum(R.FAIL_QTY))),2) Yield_Rate,
sum(R.REPASS_QTY) RePass_Qty,
sum(R.REFAIL_QTY) ReFail_Qty
from sfc.r102 R,sfc.c_model_desc_t B
WHERE R.WORK_DATE BETWEEN REPLACE('2021-06-13','-','') and REPLACE('2021-06-13','-','')
and r.model_name=b.model_name
Group by R.MODEL_NAME,R.GROUP_NAME
ORDER BY R.MODEL_NAME,GROUP_NAME
*/
$currow=5; //excel开始写的行
$k=0; $kk=0; $title="";
foreach($data as $ii=>$line){
$istart=$currow; $iend=$currow;
//B序号 C机型名称 D工站 E投入数 F良品数 G总不良数 H总不良率 I直通率 J不良项 K单项不良数 L单项不良率 M备注
$k=$k+1;
/*$objActSheet->setCellValue("B{$istart}", $k); //行号
$objActSheet->setCellValue("C{$istart}", $line["MODEL_NAME"]);
$objActSheet->setCellValue("D{$istart}", $line["GROUP_NAME"]);
$objActSheet->setCellValue("E{$istart}", $line["Total_Qty"]);
$objActSheet->setCellValue("F{$istart}", $line["Pass_Qty"]);
$objActSheet->setCellValue("G{$istart}", $line["Fail_Qty"]);
$objActSheet->setCellValue("H{$istart}", $line["Fail_Rate"]."%");
$objActSheet->setCellValue("I{$istart}", $line["Yield_Rate"]."%"); */
if($line["Fail_Qty"]>0){
$sql="SELECT a.test_code,ifnull(b.error_desc,a.test_code) error_desc,count(serial_number) qty
FROM SFC.r_repair_t a left join sfc.c_error_code_t b on a.test_code=b.error_code
WHERE a.MODEL_NAME='".$line["MODEL_NAME"]."' AND a.TEST_GROUP='".$line["GROUP_NAME"]."'
AND a.TEST_TIME between str_to_date('".$line["DTBEGIN"]." 00:00:00','%Y-%m-%d %H:%i:%s')
and str_to_date('".$line["DTEND"]." 23:59:59','%Y-%m-%d %H:%i:%s')
group by b.error_desc,a.test_code order by count(serial_number) desc";
$table=$db->getAll($sql);
$icount=count($table);
$istart=$currow; $iend=$currow;
foreach($table as $tmp=>$row){
$objActSheet->setCellValue("J{$currow}", $row["test_code"]);
$objActSheet->setCellValue("K{$currow}", $row["error_desc"]);
$objActSheet->setCellValue("L{$currow}", $row["qty"]);
$rate=round($row["qty"]/$line["Fail_Qty"]*100,2);
$objActSheet->setCellValue("M{$currow}", "{$rate}%");
$objActSheet->setCellValue("N{$currow}", "");
$iend=$currow;//结束的行!
$currow=$currow+1;
}
if($icount>0){
$objActSheet->mergeCells("B{$istart}:B{$iend}");
$objActSheet->mergeCells("C{$istart}:C{$iend}");
$objActSheet->mergeCells("D{$istart}:D{$iend}");
$objActSheet->mergeCells("E{$istart}:E{$iend}");
$objActSheet->mergeCells("F{$istart}:F{$iend}");
$objActSheet->mergeCells("G{$istart}:G{$iend}");
$objActSheet->mergeCells("H{$istart}:H{$iend}");
$objActSheet->mergeCells("I{$istart}:I{$iend}");
}
}else{
$currow=$currow+1;
}
$objActSheet->setCellValue("B{$istart}", $k); //行号
$objActSheet->setCellValue("C{$istart}", $line["MODEL_NAME"]);
$objActSheet->setCellValue("D{$istart}", $line["GROUP_NAME"]);
$objActSheet->setCellValue("E{$istart}", $line["Total_Qty"]);
$objActSheet->setCellValue("F{$istart}", $line["Pass_Qty"]);
$objActSheet->setCellValue("G{$istart}", $line["Fail_Qty"]);
$objActSheet->setCellValue("H{$istart}", $line["Fail_Rate"]."%");
$objActSheet->setCellValue("I{$istart}", $line["Yield_Rate"]."%");
if($line["Fail_Rate"]>2){
$objActSheet->getStyle("H{$istart}")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objActSheet->getStyle("H{$istart}")->getFill()->getStartColor()->setARGB('FFFFAAAA') ;
}else if($line["Fail_Rate"]>0){
$objActSheet->getStyle("H{$istart}")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objActSheet->getStyle("H{$istart}")->getFill()->getStartColor()->setARGB('FFFFFF99') ;
}
$title="FPY报表,日期[".$line["DTBEGIN"]." 00:00时 至 ".$line["DTEND"]." 23:59时]生产状况";
};
#测试设置边框
$styleArray = array(
'borders' => array(
'allborders' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
'color' => array('argb' => 'FF000000'),
),
),
);
$objActSheet->setCellValue("B3", $title);
$objActSheet->getStyle("B5:N{$iend}")->applyFromArray($styleArray);
$filename = uniqid(time(),true);
ob_end_clean(); //fix by syant !
//header('Content-Type: application/vnd.ms-excel');
header('pragma:public');
header('Content-Disposition: attachment;filename="FPY' . $filename . '.xlsx"');
//header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit; //by syant ,很重要!
}
}
?>
复制代码
欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/)
Powered by Discuz! X3.2