-
前端数组形式
[{ "筑创星": "景宁筑商刘丹商务服务工作室", "姓名": "刘丹", "手机号": "15686868000", "任务报名时间": "2020-01-06 12:00:05", "申请验收时间": "2020-01-06 12:00:06", "验收时间": "2020-01-06 12:00:07", "验收时间范围": "2020-01-06 至 2020-02-03", "结算任务佣金": "2999" }]
-
经
JSON.stringify()
转json字符串 -
后端接口使用
PHPExcel
实例:将表格存储到服务器,然后返回一个链接提供下载public function dataExportExcel($data = [],$name = '结算单') { $data = isset($_REQUEST['data']) ? $_REQUEST['data'] : ''; // 获取表格数据,json编码后的 $data = json_decode($data); $excel = new \PHPExcel(); //引用phpexcel iconv('UTF-8', 'gb2312', $name); //针对中文名转码 // 设置单元格居中对齐 $excel->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $excel->setActiveSheetIndex(0); $excel->getActiveSheet()->setTitle($name); //设置表名 $excel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(18); $excel->getActiveSheet()->getColumnDimension('B')->setWidth(80); // $excel->getActiveSheet()->freezePaneByColumnAndRow(1,1);//冻结首列 $excel->getActiveSheet()->protectCells('A1:A2', 'order_id'); //受保护的地址列 //$excel->getActiveSheet()->protectCells('A1:A7', 'password'); //解除指定列锁定 // $excel->getActiveSheet()->getStyle('B1:B7')->getProtection()->setLocked(\PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); $excel->getActiveSheet()->getStyle('H')->getProtection()->setLocked(\PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); //设置sheet锁定属性 $excel->getActiveSheet()->getProtection()->setSheet(true); // 设置单元格的宽度 $excel->getActiveSheet()->getColumnDimension('A')->setWidth(30);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('B')->setWidth(10);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('C')->setWidth(15);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('D')->setWidth(20);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('E')->setWidth(20);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('F')->setWidth(20);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('G')->setWidth(30);#设置单元格宽度 $excel->getActiveSheet()->getColumnDimension('H')->setWidth(15);#设置单元格宽度 //设置表头 $excel->setActiveSheetIndex(0) ->setCellValue('A1', '筑创星') ->setCellValue('B1', '姓名') ->setCellValue('C1', '手机号') ->setCellValue('D1', '任务报名时间') ->setCellValue('E1', '申请验收时间') ->setCellValue('F1', '验收时间') ->setCellValue('G1', '验收时间范围') ->setCellValue('H1', '结算任务佣金'); foreach ($data as $k => $v) { //从第二行开始写入数据(第一行为表头) //$excel->getActiveSheet()->setCellValue('A'.($k+2),$v['gid']); // $excel->getActiveSheet()->setCellValue('A' . ($k + 2), $v['id']."\t"); $excel->getActiveSheet()->setCellValue('A' . ($k + 2), $v->筑创星."\t"); $excel->getActiveSheet()->setCellValue('B' . ($k + 2), $v->姓名); $excel->getActiveSheet()->setCellValue('C' . ($k + 2), $v->手机号 ?: ''); $excel->getActiveSheet()->setCellValue('D' . ($k + 2), $v->任务报名时间); $excel->getActiveSheet()->setCellValue('E' . ($k + 2), $v->申请验收时间); $excel->getActiveSheet()->setCellValue('F' . ($k + 2), $v->验收时间); $excel->getActiveSheet()->setCellValue('G' . ($k + 2), $v->验收时间范围); $excel->getActiveSheet()->setCellValue('H' . ($k + 2), $v->结算任务佣金); } //设置单元格边框 $excel->getActiveSheet()->getStyle("A1:E9")->getBorders()->getAllBorders()->setBorderStyle(); ob_end_clean(); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="' . $name . '.xls"'); header('Cache-Control: max-age=0'); $res_excel = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); $res_excel->save('php://output'); }
PHPExcel额外的方法(关于设置表格属性的)
PHPExcel-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护等等
关于报错
- PHPExcel生成Excel文件—提示
Class 'PHPExcel_Style_Alignment' not found
解决方案:在PHPExcel_Style_Alignment
和PHPExcel_Style_Border
前面加上\
符号$objPHPExcel->getActiveSheet()->getStyle(‘A‘)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
小技巧
- 关于导出长数字自动变成科学计数法的问题
解决方案:$objActSheet->setCellValueExplicit('A5','8757584',PHPExcel_Cell_DataType::TYPE_STRING);
关键点:- 使用
setCellValueExplicit
而不是setCellValue
因为,setCellValue
方法不支持手动指定数据类型,需要手动去源码进行修改,比较麻烦,如果有想法可以参考这篇文章 setCellValueExplicit
方法中第三个参数使用PHPExcel_Cell_DataType::TYPE_STRING
指定数据类型,如果报错说PHPExcel_Cell_DataType
找不到,那么使用\PHPExcel_Cell_DataType::TYPE_STRING
即可(在前面加上反斜杠)- 如果是超长数字的话,这种方法还是不能够解决问题的(但其实一般情况下都够用了)。那么就只能在数据前面手动拼接一个空格,这样就一定是一个字符串了
- 使用