如图 最近要做一个这样的导出,一个团长对应一个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. Linux下查看进程和线程
  2. 5.8 正则化和数据标准化
  3. c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装1
  4. android win8风格布局,Android仿Win8界面开发
  5. # Mysql免登录重置root密码
  6. 国产 Java 代码补全神器,aiXcoder 2.0 实测
  7. 重复可记,证明没有忘记这回事
  8. Java-集合第五篇Map集合
  9. 世界超长经典名车荟萃
  10. 最新Via轻插件下载
  11. java脚本引擎parseint方法_autojs脚本引擎调用java的jsoup爬取科学网博客的指定id的好友名字...
  12. Word插入的表格如何调整长和宽
  13. androidStudio开发安卓APP的五种框架布局界面设计
  14. 有关神经网络的训练算法,神经网络算法通俗解释
  15. 智慧城市的背后是大数据的深度挖掘和利用
  16. 在手机上图片分辨率怎么调?怎样用手机改300dpi图片?
  17. VirtualBox导入虚拟电脑
  18. Windows10怎么卸载删除微软拼音输入法
  19. Fiddle工具的使用
  20. 低功耗读卡(RFID)电路与程序实现

热门文章

  1. 新媒体运营教程:线上线下用户转化的核心流程!
  2. 第九讲:Python爬取网页图片并保存到本地
  3. 常见的百度云搜索引擎入口合集
  4. CSR8670项目实战:BlueHeart心率监测耳机
  5. mysql特殊符号无法储存_解决MYSQL数据库无法保存emoji表情及特殊符号问题
  6. 第六篇,STM32脉冲宽度调制(PWM)编程
  7. 从阅读中记笔记的8个技巧
  8. 科幻电影虚拟世界中的8大服务器
  9. APM的3DR无线数传的安装和调试
  10. opc ua 用哪种语言编写_OPC UA是什么 OPC UA简介