PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > CMS教程 > Fastadmin

用PHPExcel 实现服务器端导出 后端导出 导出 excel bootstrap table export 导出格式 自定义导出 多数据导出 导出问题

管理员 2024-12-14
Fastadmin
7
  • 问题
  • bootstrap table 自带导出功能比较蹩脚
  • 导出的excel文件 本地打开时候会有弹窗告诉你文件类型和文件名称不符!什么鬼!
  • 数据少的时候凑合可以用,数据稍多的时候秒秒钟卡到人崩溃!
  • 导出的excel居然不能再导入回去 呵呵……
  • 思路
  • 自己做呗 用PHPExcel
  • fastadmin更新到5月13号的时候 后经过一系列愉(dou)快(bi)的讨论后,可能是在4月中旬某个版本中 发现了 Karson 大神 偷偷加入了PHPExcel,粗略看了一下用来做导入功能!image.png
  • 这种情况 更新fastadmin 即可 直接用起来 不用管插件的安装啦
  • 实现
  • 前端
    ①. 在模板页的toolbar加入一个导出按钮

     <div id="toolbar" class="toolbar">                      <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>                      <a class="btn btn-success btn-myexcel-export  btn-disabled disabled {:$auth->check('lvtotals1/exportOrderExcel')?'':'hide'}" href="javascript:;"><i class="fa fa-user"></i> 导出</a><!--添加一个类名称btn-myexcel-export给监听事件用,检查下当前登录的选手有没有控制中对应导出方法 exportOrderExcel的权限,没有就隐藏-->                  </div>

    ②. 在对应js文件处添加监听动作位置和代码如下

                  table.bootstrapTable({clickToSelect: true,……});              // 监听事件              $(document).on("click", ".btn-myexcel-export", function () { //监听刚刚的按钮btn-myexcel-export的动作                  var myexceldata=table.bootstrapTable('getSelections');//获取选中的项目的数据 格式是json                      myexceldata=JSON.stringify(myexceldata);//数据转成字符串作为参数              //直接url访问,不能使用ajax,因为ajax要求返回数据,和PHPExcel一会浏览器输出冲突!将数据作为参数                      top.location.href="lvtotals1/exportOrderExcel?data="+myexceldata;              });

    ③. 对应控制器方法代码如下

    function exportOrderExcel($data)  {      // 新建一个excel对象 大神已经加入了PHPExcel 不用引了 直接用!      $objPHPExcel = new PHPExcel();  //在vendor目录下 不能少 否则报错      // 设置文档的相关信息      $objPHPExcel->getProperties()->setCreator("楼主666")/*设置作者*/      ->setLastModifiedBy("楼主666")/*最后修改*/      ->setTitle("楼主666")/*题目*/      ->setSubject("楼主666")/*主题*/      ->setDescription("楼主666")/*描述*/      ->setKeywords("楼主666")/*关键词*/      ->setCategory("楼主666");/*类别*/       $objPHPExcel->getDefaultStyle()->getFont()->setName('微软雅黑');//字体      /*设置表头*/      $objPHPExcel->getActiveSheet()->mergeCells('A1:P1');//合并第一行的单元格      $objPHPExcel->getActiveSheet()->mergeCells('A2:P2');//合并第二行的单元格      $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);      $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', '楼主教我导出EXcel666');//标题      $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(30);      // 第一行的默认高度      //第二行的内容和格式      $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A2', '楼主真的666');      $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(20);/*设置行高*/      $myrow = 3;/*表头所需要行数的变量,方便以后修改*/      /*表头数据填充*/      $objPHPExcel->getActiveSheet()->getRowDimension('3')->setRowHeight(30);/*设置行高*/      $objPHPExcel->setActiveSheetIndex(0)  //设置一张sheet为活动表 添加表头信息           ->setCellValue('A' . $myrow, '序号')          ->setCellValue('B' . $myrow, '日期')          ->setCellValue('C' . $myrow, '物资名称')          ->setCellValue('D' . $myrow, '规格')          ->setCellValue('E' . $myrow, '单位')          ->setCellValue('F' . $myrow, '数量')          ->setCellValue('G' . $myrow, '出厂单价(元)')          ->setCellValue('H' . $myrow, '运杂费(元)')          ->setCellValue('I' . $myrow, '税率')          ->setCellValue('J' . $myrow, '税额(元)')          ->setCellValue('K' . $myrow, '价税合计(元)')          ->setCellValue('L' . $myrow, '金额(元)')          ->setCellValue('M' . $myrow, '使用单位')          ->setCellValue('N' . $myrow, '卸车地点')          ->setCellValue('O' . $myrow, '生产厂家')          ->setCellValue('P' . $myrow, '备注');      // 关键数据      $data = json_decode($data, true);      $myrow = $myrow + 1; //刚刚设置的行变量      $mynum = 1;//序号       //遍历接收的数据,并写入到对应的单元格内      foreach ($data as $key => $value) {          $objPHPExcel->setActiveSheetIndex(0)              ->setCellValue('A' . $myrow, $mynum)              ->setCellValue('B' . $myrow, $value['buyTime'])              ->setCellValue('C' . $myrow, $value['proName'])              ->setCellValue('D' . $myrow, $value['spec'])              ->setCellValue('E' . $myrow, $value['unit'])              ->setCellValue('F' . $myrow, $value['num'])              ->setCellValue('G' . $myrow, $value['sellPrice'])              ->setCellValue('H' . $myrow, '0')              ->setCellValue('I' . $myrow, $value['sellTaxRate'])              ->setCellValue('J' . $myrow, $value['sellTax'])              ->setCellValue('K' . $myrow, $value['sellSumTax'])              ->setCellValue('L' . $myrow, $value['sellSum'])              ->setCellValue('M' . $myrow, '')              ->setCellValue('N' . $myrow, '')              ->setCellValue('O' . $myrow, '')              ->setCellValue('P' . $myrow, '');          $objPHPExcel->getActiveSheet()->getRowDimension('' . $myrow)->setRowHeight(20);/*设置行高 不能批量的设置 这种感觉 if(has(蛋)!=0){疼();}*/          $myrow++;          $mynum++;      }      $mynumdata=$myrow-1; //获取主要数据结束的行号      $objPHPExcel->setActiveSheetIndex(0)->getstyle('A3:P' . $mynumdata)->getAlignment()->setHorizontal(PHPExcel_style_Alignment::HORIZONTAL_CENTER);/*设置格式 水平居中*/      /*设置数据的边框 手册上写的方法只显示竖线 非常坑爹 所以采用网上搜来的方法*/      $style_array = array(          'borders' => array(              'allborders' => array(                  'style' => PHPExcel_Style_Border::BORDER_THIN              )          ));      $objPHPExcel->getActiveSheet()->getStyle('A3:P' . $mynumdata)->applyFromArray($style_array);      /*设置数据的格式*/      $objPHPExcel->getActiveSheet()->getRowDimension('' . $myrow)->setRowHeight(20);/*设置行高*/      $objPHPExcel->getActiveSheet()->mergeCells('A'.$myrow.':P'.$myrow);//合并下一行的单元格      $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $myrow,'供应单位:'.$name);      $myrow++; $objPHPExcel->getActiveSheet()->getRowDimension('' . $myrow)->setRowHeight(20);/*设置行高*/      $objPHPExcel->getActiveSheet()->mergeCells('A'.$myrow.':C'.$myrow);//合并下一行的单元格      $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $myrow,'收料员:');      $objPHPExcel->getActiveSheet()->mergeCells('D'.$myrow.':J'.$myrow);//合并下一行的单元格      $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('D' . $myrow,'复核:');      $objPHPExcel->getActiveSheet()->mergeCells('K'.$myrow.':P'.$myrow);//合并下一行的单元格      $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('K' . $myrow,'确认签字:');      $myrow++; $objPHPExcel->getActiveSheet()->getRowDimension('' . $myrow)->setRowHeight(20);/*设置行高*/      $objPHPExcel->getActiveSheet()->mergeCells('I'.$myrow.':K'.$myrow);//合并下一行的单元格      $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('I' . $myrow,'日期:');      $objPHPExcel->getActiveSheet()->getStyle('A1:P' . $myrow)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);/*垂直居中*/      //关键数据结束      //设置宽width 由于自适应宽度对中文的支持是个BUG因此坑爹的手动设置了每一列的宽度 这种感觉 if(has(蛋)!=0){碎();}      $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(12);      $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);      $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(15);      $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(8.5);      $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(8);      $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(8);      $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(8.5);      $objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(7);      $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('O')->setWidth(5);      $objPHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(5);      $objPHPExcel->getActiveSheet()->getStyle('A3:P' . $myrow)->getAlignment()->setWrapText(true);//设置单元格允许自动换行      /*设置表相关的信息*/      $objPHPExcel->getActiveSheet()->setTitle($buytime); //活动表的名称      $objPHPExcel->setActiveSheetIndex(0);//设置第一张表为活动表      //纸张方向和大小 为A4横向      $objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);      $objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);      //浏览器交互 导出      header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');      header('Content-Disposition: attachment;filename="楼主教我的导出excel这弄得真是666.xlsx"');      header('Cache-Control: max-age=0');      // If you're serving to IE 9, then the following may be needed      header('Cache-Control: max-age=1');      // If you're serving to IE over SSL, then the following may be needed      header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past      header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified      header('Cache-Control: cache, must-revalidate'); // HTTP/1.1      header('Pragma: public'); // HTTP/1.0      $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');      $objWriter->save('php://output');      exit;  }
  • 总结
  • 能不能导入我还没试过
  • karson 大神曾经对相关内容的回复 作为膜拜之用 求教服务端导出大量数据的写法
  • 需要对导出的Excel做其他格式的设置 请参考网络上的PHPexcel 手册 这里不赘述!
  • 本人是美工 大神勿喷!

希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部