WithCoderWithCoderWithCoder

Think PHP5框架中实现PHP导出Excel文件

    今天需要在PHP中将后台业务数据导出到excel中,实现完成后将实现过程整理下来,以备后期使用。

    准备

    1. 开发环境Think PHP5

    2. 第三方SDK(PHPExcel)

    3. 数据准备为家庭/成员主子表

    导出效果图

    1-200421150T4202.png

    导出

    1. 准备数据

    创建两个数据表,家庭表(tn_home):

CREATE TABLE `tn_home` (
  `home_id` int(11) NOT NULL COMMENT '家庭id',
  `home_name` varchar(50) DEFAULT NULL COMMENT '家庭名',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`home_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

    成员表(tn_home_member):

CREATE TABLE `tn_home_member` (
  `member_id` int(11) NOT NULL COMMENT '家庭成员id',
  `home_id` int(11) DEFAULT NULL COMMENT '家庭id',
  `member_name` varchar(50) DEFAULT NULL COMMENT '成员名',
  PRIMARY KEY (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

    2. 在tp5中,连接数据库,生成导出的数据结构。PHP代码如下:

function export()
{
   // 生成数据结构(tp5Db返回数组)
   // 家庭表数据
   $home = Db::table('tn_home')->select();
   foreach ($home AS $k => &$v) {
       $members = Db::table('tn_home_member')->where(['home_id' => $v['home_id']])->select();
       if (!$members) {
           continue;
       }

       // 成员表子数据
       $v['member_no'] = $v['member_name'] = [];
       foreach ($members as $k2 => $v2) {
           $v['member_no'][] = $k2 + 1;
           $v['member_name'][] = $v2['member_name'];
       }
       $v['member_count'] = $v['HEIGHT'] = count($v['member_no']); // 需要合并的行数
   }

   // 生成表头
   $xlsCell = array(
       array('home_id', '家庭id'),
       array('home_name', '家庭名'),
       array('member_count', '成员个数'),
       array('member_no', '成员编号'),
       array('member_name', '成员姓名'),
       array('create_time', '创建时间'),
   );

   // 导出excel
   $this->exportExcelMult('家庭成员表', $xlsCell, $home);
}

    3. 调用导出方法,生成excel并输出到页面:   

/**
* 导出带有多行值数据
*
* @param string $title 文件名
* @param array $cellNames 表头
* @param array $rowDatas 数据,数据中行值带 HEIGHT 参数,表示一行中有合并的子行
*/
function exportExcelMult($title = '', $cellNames = [], $rowDatas = [])
{
   $rowDatas = array_values($rowDatas);
   $xlsTitle = iconv('utf-8', 'gb2312', $title); // 文件标题
   $fileName = $title . date('_Ymd'); // 文件名称可根据自己情况设定
   $cellNum = count($cellNames); // 单元格列数
   $dataNum = count($rowDatas); // 数据行数
   vendor("PHPExcel.PHPExcel");
   $objPHPExcel = new \PHPExcel();
   $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');

   // 当前行数
   $h = 1;
   // 标题
   if ($title) {
       $objPHPExcel->getActiveSheet(0)->mergeCells("A{$h}:" . $cellName[$cellNum - 1] . $h);//合并单元格
       $objPHPExcel->getActiveSheet()->getStyle("A{$h}")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 居中
       $objPHPExcel->setActiveSheetIndex(0)->setCellValue("A{$h}", $title); //第一行标题
       $h++;
   }

   // 表头
   if ($cellNum > 0) {
       for ($i = 0; $i < $cellNum; $i++) {
           $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i] . $h, $cellNames[$i][1]);
       }
       $h++;
   }

   // 内容
   for ($i = 0; $i < $dataNum; $i++) {
       $height = intval($rowDatas[$i]['HEIGHT']); // 合并的行数
       if ($height < 1)
           $height = 1;

       for ($j = 0; $j < $cellNum; $j++) {
           $current_data = $rowDatas[$i][$cellNames[$j][0]];
           if (!is_array($current_data)) {
               if ($height > 1) {
                   $objPHPExcel->getActiveSheet(0)->mergeCells("{$cellName[$j]}{$h}:" . "{$cellName[$j]}" . ($h + $height - 1)); // 合并单元格
               }
               $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j] . ($h), $current_data);
               continue;
           }

           if ($height > 1 && is_array($current_data)) {
               for ($li = 0; $li < $height; $li++) {
                   $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j] . ($h + $li), $current_data[$li]);
               }
           }
       }

       if ($cellNum > 0)
           $h = $h + $height;
   }

   header('pragma:public');
   header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $xlsTitle . '.xls"');
   header("Content-Disposition:attachment;filename=$fileName.xls");
   $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
   $objWriter->save('php://output');
   exit;
}

欢迎分享交流,转载请注明出处:WithCoder » Think PHP5框架中实现PHP导出Excel文件