深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 465|回复: 0
打印 上一主题 下一主题

beacon实现模板导出Excel

[复制链接]

800

主题

1379

帖子

7705

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7705
跳转到指定楼层
楼主
发表于 2023-2-17 19:44:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
默认下载为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
  1. <?php

  2. //by syant
  3. //FPY报表需要处理一下excel的模板下载
  4. //defined('WORK_PATH') or define('WORK_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR);

  5. class REPAIR_00 extends tpage{
  6.                
  7.         function REPAIR_00($app) {
  8.                 parent::__construct($app);
  9.         }       
  10.        
  11.         /*
  12.          * 重构默认的Excel下载逻辑
  13.          */
  14.         function createExcel(){
  15.                 global $db, $config, $user, $report, $smarty;
  16.                 $sqlstr = $smarty->tpl_vars["sql"];
  17.                 $limit = 65000;  //最大60K
  18.                 //require_once("phar://beacon.inc.phar/page.inc.php");        
  19.                 include_once("page.inc.php");
  20.                 $pager = new pager($limit, 1);
  21.                 $data=$pager->execute($db, $sqlstr);
  22.                 //$count=count($data);  //数量
  23.                
  24.                 include_once($config->base_path."/libs/mi.excel.php");
  25.                 //$objReader = PHPExcel_IOFactory::createReader ( 'Excel5' );                //如果模板是.xls的       
  26.                 $objReader = PHPExcel_IOFactory::createReader ( 'Excel2007' );        //如果模板是.xlsx的
  27.                 $path = $config->base_path.DIRECTORY_SEPARATOR.'excel_template'.DIRECTORY_SEPARATOR."FPY.xlsx";//设置移动路径  
  28.                 $objPHPExcel = $objReader->load ($path);
  29.                 $objPHPExcel->setActiveSheetIndex(0) ;
  30.                 $objActSheet = $objPHPExcel->getActiveSheet();
  31.                 //用于debug, 将SQL存在P2, 中间数据存在P3
  32.                 $objActSheet->setCellValue('P2', $sqlstr);
  33.                 $objActSheet->setCellValue('P3', var_export($data,true));
  34.                 /*$ii=4;
  35.                 foreach($smarty->tpl_vars as $kk=>$vv){
  36.                         $objActSheet->setCellValue("P{$ii}", $kk);
  37.                         $ii=$ii+1;
  38.                 }
  39.                 //echo print_r(debug_backtrace(),true);
  40.                 */
  41.                
  42.                
  43.                 //填充模板内容
  44.                 /*
  45.                         SELECT '2021-06-13' DTBEGIN,'2021-06-13' DTEND,R.MODEL_NAME,r.GROUP_NAME,
  46.                         sum(R.PASS_QTY) + sum(R.FAIL_QTY) Total_Qty,
  47.                         sum(R.PASS_QTY) Pass_Qty, sum(R.FAIL_QTY) Fail_Qty,
  48.                         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,
  49.                         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,
  50.                         sum(R.REPASS_QTY) RePass_Qty,
  51.                         sum(R.REFAIL_QTY) ReFail_Qty
  52.                         from sfc.r102 R,sfc.c_model_desc_t B
  53.                         WHERE R.WORK_DATE BETWEEN REPLACE('2021-06-13','-','') and REPLACE('2021-06-13','-','')  
  54.                         and r.model_name=b.model_name  
  55.                         Group by R.MODEL_NAME,R.GROUP_NAME
  56.                         ORDER BY R.MODEL_NAME,GROUP_NAME
  57.                 */
  58.                 $currow=5;        //excel开始写的行
  59.                 $k=0; $kk=0; $title="";
  60.                 foreach($data as $ii=>$line){
  61.                         $istart=$currow; $iend=$currow;
  62.                         //B序号        C机型名称        D工站        E投入数        F良品数        G总不良数        H总不良率        I直通率        J不良项        K单项不良数        L单项不良率        M备注
  63.                         $k=$k+1;
  64.                         /*$objActSheet->setCellValue("B{$istart}", $k);  //行号
  65.                         $objActSheet->setCellValue("C{$istart}", $line["MODEL_NAME"]);
  66.                         $objActSheet->setCellValue("D{$istart}", $line["GROUP_NAME"]);
  67.                         $objActSheet->setCellValue("E{$istart}", $line["Total_Qty"]);
  68.                         $objActSheet->setCellValue("F{$istart}", $line["Pass_Qty"]);
  69.                         $objActSheet->setCellValue("G{$istart}", $line["Fail_Qty"]);
  70.                         $objActSheet->setCellValue("H{$istart}", $line["Fail_Rate"]."%");
  71.                         $objActSheet->setCellValue("I{$istart}", $line["Yield_Rate"]."%"); */
  72.                         if($line["Fail_Qty"]>0){
  73.                                 $sql="SELECT a.test_code,ifnull(b.error_desc,a.test_code) error_desc,count(serial_number) qty
  74.                                                         FROM SFC.r_repair_t a left join sfc.c_error_code_t b on a.test_code=b.error_code
  75.                                                         WHERE a.MODEL_NAME='".$line["MODEL_NAME"]."' AND a.TEST_GROUP='".$line["GROUP_NAME"]."'
  76.                                                         AND a.TEST_TIME between str_to_date('".$line["DTBEGIN"]." 00:00:00','%Y-%m-%d %H:%i:%s')  
  77.                                                         and   str_to_date('".$line["DTEND"]." 23:59:59','%Y-%m-%d %H:%i:%s')  
  78.                                                         group by b.error_desc,a.test_code  order by count(serial_number) desc";
  79.                          $table=$db->getAll($sql);
  80.                          $icount=count($table);
  81.                          $istart=$currow; $iend=$currow;
  82.                          foreach($table as $tmp=>$row){
  83.                                 $objActSheet->setCellValue("J{$currow}", $row["test_code"]);
  84.                                 $objActSheet->setCellValue("K{$currow}", $row["error_desc"]);
  85.                                 $objActSheet->setCellValue("L{$currow}", $row["qty"]);
  86.                                 $rate=round($row["qty"]/$line["Fail_Qty"]*100,2);
  87.                                 $objActSheet->setCellValue("M{$currow}", "{$rate}%");
  88.                           $objActSheet->setCellValue("N{$currow}", "");
  89.                                 $iend=$currow;//结束的行!
  90.                                 $currow=$currow+1;
  91.                          }
  92.                          if($icount>0){
  93.                                  $objActSheet->mergeCells("B{$istart}:B{$iend}");
  94.                                  $objActSheet->mergeCells("C{$istart}:C{$iend}");
  95.                                  $objActSheet->mergeCells("D{$istart}:D{$iend}");
  96.                                  $objActSheet->mergeCells("E{$istart}:E{$iend}");
  97.                                  $objActSheet->mergeCells("F{$istart}:F{$iend}");
  98.                                  $objActSheet->mergeCells("G{$istart}:G{$iend}");
  99.                                  $objActSheet->mergeCells("H{$istart}:H{$iend}");
  100.                                  $objActSheet->mergeCells("I{$istart}:I{$iend}");
  101.                          }
  102.                         }else{
  103.                                 $currow=$currow+1;
  104.                         }
  105.                         $objActSheet->setCellValue("B{$istart}", $k);  //行号
  106.                         $objActSheet->setCellValue("C{$istart}", $line["MODEL_NAME"]);
  107.                         $objActSheet->setCellValue("D{$istart}", $line["GROUP_NAME"]);
  108.                         $objActSheet->setCellValue("E{$istart}", $line["Total_Qty"]);
  109.                         $objActSheet->setCellValue("F{$istart}", $line["Pass_Qty"]);
  110.                         $objActSheet->setCellValue("G{$istart}", $line["Fail_Qty"]);
  111.                         $objActSheet->setCellValue("H{$istart}", $line["Fail_Rate"]."%");
  112.                         $objActSheet->setCellValue("I{$istart}", $line["Yield_Rate"]."%");
  113.                         if($line["Fail_Rate"]>2){
  114.                                 $objActSheet->getStyle("H{$istart}")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
  115.                                 $objActSheet->getStyle("H{$istart}")->getFill()->getStartColor()->setARGB('FFFFAAAA') ;
  116.                         }else if($line["Fail_Rate"]>0){
  117.                                 $objActSheet->getStyle("H{$istart}")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
  118.                                 $objActSheet->getStyle("H{$istart}")->getFill()->getStartColor()->setARGB('FFFFFF99') ;
  119.                         }
  120.                         $title="FPY报表,日期[".$line["DTBEGIN"]." 00:00时 至 ".$line["DTEND"]." 23:59时]生产状况";
  121.                 };
  122.                 #测试设置边框
  123.                 $styleArray = array(
  124.                                                 'borders' => array(
  125.                                                                 'allborders' => array(
  126.                                                                                 'style' => PHPExcel_Style_Border::BORDER_THIN,
  127.                                                                                 'color' => array('argb' => 'FF000000'),
  128.                                                                 ),
  129.                                                 ),
  130.                                 );
  131.                 $objActSheet->setCellValue("B3", $title);
  132.                 $objActSheet->getStyle("B5:N{$iend}")->applyFromArray($styleArray);

  133.        
  134.                 $filename = uniqid(time(),true);  
  135.                 ob_end_clean();  //fix by syant !
  136.                 //header('Content-Type: application/vnd.ms-excel');
  137.                 header('pragma:public');  
  138.                 header('Content-Disposition: attachment;filename="FPY' . $filename . '.xlsx"');
  139.                 //header('Cache-Control: max-age=0');
  140.                 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');  
  141.                 $objWriter->save('php://output');
  142.                
  143.                 exit; //by syant ,很重要!
  144.        
  145.   }
  146.   
  147. }
  148. ?>
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 06:17 , Processed in 0.024895 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表