如图 最近要做一个这样的导出,一个团长对应一个sheet,然后一键导出

使用PhpOffice\PhpSpreadsheet实现   直接上代码

    /*** 多sheet的导出* @author bwy <xxx@xxx.com>* @param [type] $data_array* @return void*/public  function xtexport($data_array){ $name = '团长' . date("Y-m-d", time());$spreadsheet = new Spreadsheet();foreach ($data_array as $key => $data) {$this->opSheet($spreadsheet,$key,$data);}header('Content-Type: application/vnd.ms-excel');header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');header('Cache-Control: max-age=0');$writer = new Xlsx($spreadsheet);$writer->save('php://output');//删除清空:$spreadsheet->disconnectWorksheets();unset($spreadsheet);exit;}

然后就是处理sheet的多循环

    /*** 处理多sheet* @author bwy <xxx@xxx.com>* @param [type] $spreadsheet* @param [type] $n* @param [type] $data* @return void*/public  function opSheet($spreadsheet,$n, $data){$spreadsheet->createSheet();//创建sheet$objActSheet = $spreadsheet->setActiveSheetIndex($n);//设置当前的活动sheet$keys = $data['rows'][0];//这是你的数据键名$count = count($keys);//计算你所占的列数$infoNum = ceil(count($data['info']) / 2);//求k-v值的所占行数$infoStart = $infoNum + 2 ;//下面的详细信息的开始行数$cellName    = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');$sheet = $spreadsheet->getActiveSheet($n)->setTitle($data['info']['社区团长姓名:']);//设置sheet的名称$spreadsheet->getActiveSheet($n)->mergeCells('A1:' . $cellName[$count - 1] . '1'); //合并单元格$spreadsheet->getActiveSheet($n)->getStyle('A1')->getFont()->setSize(20); //设置title的字体大小$spreadsheet->getActiveSheet($n)->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('A')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('E')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('F')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle('G')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle("$infoStart")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //居中$spreadsheet->getActiveSheet($n)->getStyle("$infoStart")->getFont()->setBold(true); //标题栏加粗$objActSheet->setCellValue('A1', $data['title']); //设置每个sheet中的名称title/*** 图中最下面的数据信息循环*/foreach ($data['rows'] as $key => $item) {             //循环设置单元格://$key+$infoStart,因为第一行是表头,所以写到表格时   从第数据行开始写 for ($i = 65; $i < $count + 65; $i++) {   //数字转字母从65开始://$sheet->setCellValue(strtoupper(chr($i)) . ($key + "$infoStart"), $item[[$keys][$i - 65]]);$sheet->setCellValue(strtoupper(chr($i)) . ($key+"$infoStart"), $item[$i - 65]);$spreadsheet->getActiveSheet($n)->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列宽}}/*** 处理图中的中间区 团长名称之类的 */$rowNumber = 1;$infoIndex = 0;foreach ($data['info'] as $key => $value) {if ($infoIndex % 2 == 0) {$rowNumber++;$infoCellName1 = 'A' . $rowNumber;$infoCellMegreRange = 'B' . $rowNumber . ':C' . $rowNumber;$infoCellName2 = 'B' . $rowNumber;} else {$infoCellName1 = 'D' . $rowNumber;$infoCellMegreRange = 'E' . $rowNumber . ':F' . $rowNumber;$infoCellName2 = 'E' . $rowNumber;}$spreadsheet->setActiveSheetIndex($n)->setCellValue($infoCellName1, $key);$spreadsheet->getActiveSheet($n)->mergeCells($infoCellMegreRange);$spreadsheet->setActiveSheetIndex($n)->setCellValue($infoCellName2, $value);$infoIndex++;}}

每个人的数据格式不一致,所以自行改一改,我的数据格式是这样可以参考下

    public function xtexport(){$data = array(array('title' => 'AAA','info' => ['社区团长店铺地址:' => 'AAA','社区团长姓名:' => 'AAA','收货地址:' => 'AAA','联系方式:' => 'AAA','配送日期:' => 'AAA','手打阿达:' => 'AAA','手动蝶阀:' => 'AAA'],'rows' => [['id','name','sex','phone','res','aaa','bbb'],[1111,2222,3333,4444,5555,6666,7777],[111,222,333,444,555,666,777]]), array('title' => 'BBBB','info' => ['社区团长店铺地址:' => 'BBBB','社区团长姓名:' => 'BBBB','收货地址:' => 'BBBB','联系方式:' => 'BBBB','配送日期:' => 'BBBB','手打阿达:' => 'BBBB','手动蝶阀:' => 'BBBB'],'rows' => [['id','name','sex','phone','res','aaa','bbb'],[1,2,3,4,5,6,7],[11,22,33,44,55,66,77]]));model('Excel')->xtexport($data);}

导出如图:

参考地址 https://www.programminghunter.com/article/62071254396/

多表头 多sheet 示例

 /*** @description: 设定EXCEL表头* @param integer $num* @return array* @author: chaihao <158533752@qq.com>*/public function getExcelHeader($num = 100){// 计算表格列$col = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];if ($num > 730) {$newCol = [];for ($j = 0; $j <= 26; $j++) {for ($h = 0; $h <= 25; $h++) {for ($i = 0; $i <= 25; $i++) {if ($j == 0 && $h == 0) {$newCol[] = $col[$i];} elseif ($j == 0) {$newCol[] = $col[$h] . $col[$i];} else {$newCol[] = $col[$j - 1] . $col[$h] . $col[$i];}}}}} else {for ($j = 0; $j <= 26; $j++) {for ($i = 0; $i <= 25; $i++) {if ($j == 0) {$newCol[] = $col[$i];} else {$newCol[] = $col[$j - 1]  . $col[$i];}}}}return $newCol;}// 多表头数据处理 , 数据结构// $data =  [//     [//         "headerData": [//             [//                 "x": "A1",//                 "y": "B1",//                 "name": "yFieldNam_1"//             ],//             [//                 "x": "A2",//                 "y": "B2",//                 "name": "yFieldNam_2"//             ],//             [//                 "x": "C1",//                 "y": "D1",//                 "name": "首席运营官"//             ],//             [//                 "x": "E1",//                 "y": "L1",//                 "name": "饲养员"//             ],//             [//                 "x": "C2",//                 "y": "D2",//                 "name": "2010年3季度"//             ],//             [//                 "x": "E2",//                 "y": "F2",//                 "name": "2012年2季度"//             ],//             [//                 "x": "G2",//                 "y": "H2",//                 "name": "2010年2季度"//             ],//             [//                 "x": "I2",//                 "y": "J2",//                 "name": "2009年3季度"//             ],//             [//                 "x": "K2",//                 "y": "L2",//                 "name": "2009年2季度"//             ],//             [//                 "x": "M1",//                 "y": "N2",//                 "name": "汇总"//             ],//             [//                 "x": "A9",//                 "y": "B9",//                 "name": "汇总"//             ]//         ],//         "mergeCells": [//             "A1:B1",//             "A2:B2",//             "C1:D1",//             "E1:L1",//             "C2:D2",//             "E2:F2",//             "G2:H2",//             "I2:J2",//             "K2:L2",//             "M1:N2",//             "A9:B9"//         ],//         "row": [//            [],//            []//         ],//         "yFields": [//             [],//             [],//         ]//     ]// ]/*** 处理多sheet* @param [type] $spreadsheet* @param [type] $n* @param [type] $data* @return void*/public  function opSheet($spreadsheet, $n, $data){$spreadsheet->createSheet(); //创建sheet$objActSheet = $spreadsheet->setActiveSheetIndex($n); //设置当前的活动sheet$keys = $data['row'][0]; //这是你的数据键名$count = count($keys); //计算你所占的列数$infoNum = count($data['yFields']); //求k-v值的所占行数$infoStart = $infoNum + 1; //下面的详细信息的开始行数// $cellName    = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');$cellName = $this->getExcelHeader($count);$sheet = $spreadsheet->getActiveSheet($n)->setTitle('透视表导出_' . ($n + 1)); //设置sheet的名称// $spreadsheet->getActiveSheet($n)->mergeCells('A1:' . $cellName[$count - 1] . '1'); //合并单元格// $spreadsheet->getActiveSheet($n)->getStyle('A1')->getFont()->setSize(20); //设置title的字体大小$spreadsheet->getActiveSheet($n)->getStyle("$infoStart")->getFont()->setBold(true); //标题栏加粗// $objActSheet->setCellValue('A1', $data['title']); //设置每个sheet中的名称title/*** 图中最下面的数据信息循环*/foreach ($data['row'] as $key => $item) {//循环设置单元格://$key+$infoStart,因为第一行是表头,所以写到表格时   从第数据行开始写 for ($i = 0; $i < $count; $i++) {//数字转字母从65开始:$sheet->setCellValue($cellName[$i] . ($key + "$infoStart"), $item[$i]);$spreadsheet->getActiveSheet($n)->getColumnDimension($cellName[$i])->setWidth(20); //固定列宽}}/*** 处理图中的中间区 团长名称之类的 */foreach ($data['headerData'] as $key => $value) {$spreadsheet->setActiveSheetIndex($n)->setCellValue($value['x'], $value['name']); // 合并单元格$spreadsheet->getActiveSheet($n)->mergeCells($value['x'] . ':' . $value['y']); // 设置单元格值}}

参考地址: 使用PhpOffice\PhpSpreadsheet 实现Excel多sheet导出 - 简书

PhpSpreadsheet 实现Excel多sheet导出相关推荐

  1. PhpSpreadsheet处理Excel 导入、导出并设置样式

    PhpSpreadsheet处理Excel PHPOffice 是一个用来处理办公相关软件的php类库 PhpSpreadsheet 专门处理excle的类库 导出如下: 引入类库 composer ...

  2. PhpSpreadsheet 基本使用和导入 导出 模版生成Excel文件

    一. 基本使用 <?phpuse PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Dra ...

  3. easyexcel多个sheet导入_Java中Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 cn.afterturn easypoi-spring-boot-st ...

  4. easyexcel多个sheet导入_Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 cn.afterturn easypoi-spring-boot-st ...

  5. Poi 导出excel单个sheet的内容

    Poi 导出excel单个sheet的内容 目录 Poi 导出excel单个sheet的内容 代码: Contrller Service: 导出引用:ExcelExportUtil 导出类:PoiSi ...

  6. easyPoi单sheet与多sheet导出excel简单实用(重点:自动列宽的设置)

    导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base< ...

  7. ThinkPHP 6.0 phpspreadsheet操作Excel表格实例

    在 ThinkPHP 6.0 中实现 excel 导出功能,需要使用第三方扩展phpspreadsheet. 安装和导入导出就不再讲解了,可以看这两篇: <ThinkPHP6 excel 导入功 ...

  8. Laravel Excel文件模板导出

    这篇主要描述如何从模板中导出的内容,如果不想使用模板 可参考Laravel Excel 3.1 导出_json_li的博客-CSDN博客 目录 创建导出模型 创建模板文件 控制器中调用 1.激活下载窗 ...

  9. excel winform 导入 导出_强大的 Excel 导入导出工具 hutool

    " 最近项目上需要用到 Excel 的导入导出功能,想着之前使用的都有点麻烦,所以结合多方资料,终于找到了这个还算不错的 Excel 处理工具,一起来看" 今日安利好物名为 Hut ...

最新文章

  1. oracle io profile,ORACLE 中 PROFILE的管理
  2. 开发日记-20190503 关键词 汇编语言(二)
  3. Ionic3 UI组件之 ImageLoader
  4. flex属性值----弹性盒子布局
  5. ant target间的dependency
  6. Android之手机摇一摇震动刷新(支持ListView、GridView、WebView)并生成我的二维码
  7. linux6如何分区,CentOS6.9安装 硬盘分区方案与分区步骤
  8. meta refresh 刷新
  9. C++之boost库报错:note: in expansion of macro BOOST_MPL_ASSERT_NOT
  10. ubuntu14.04 caffe安装前先要将gcc版本降到4.7.x
  11. 火狐浏览器添加restclient.xpi 添加插件时候遇见的 附件未经验证无法安装
  12. ABBYY最新OCR文字识别软件 ,需激活码序列号密钥安装下载
  13. Android组件化入门,分享一点面试小经验
  14. h5活动是什么意思_H5是什么,怎么用H5做运营活动?
  15. 提高医疗信息化或是解决看病难看病贵的有效助剂
  16. java string占用内存_Java中String到底占用多大的内存空间?
  17. 错误 '800a03ea'
  18. Keras之model.fit_generator()的使用
  19. 基于Java实现的中文分词系统
  20. Android开发笔记(一百二十八)手机制式适配

热门文章

  1. 电子商城数据库设计思路
  2. 3DSMAX中英文对照大全(从A-Z分类)
  3. 解析微分电路和积分电路的区别
  4. 如何在VMware虚拟机中查看Linux的IP地址
  5. android 相册view,Android直接把当前View保存到相册
  6. 如何把一张照片的像素提高_如何提升照片的像素?
  7. 导入数据报错Packet for query is too large (20717492 4194304).
  8. C#:查找文件所在位置
  9. SPI与IIC的异同
  10. java实现猜测游戏,最后统计用户猜的次数