- 前端数组形式
[{
"筑创星": "景宁筑商刘丹商务服务工作室",
"姓名": "刘丹",
"手机号": "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
即可(在前面加上反斜杠)- 如果是超长数字的话,这种方法还是不能够解决问题的(但其实一般情况下都够用了)。那么就只能在数据前面手动拼接一个空格,这样就一定是一个字符串了