这里写自定义目录标题
前言
因为在开发平台的时候遇到了需要将表格数据导出到Excel的情况,通过百度找到了PHP插件PHPExcel有这功能,于是结合js就开始动手
通过js筛选出表格数据
首先我们需要先获取到前端页面表格内的数据,js方法可以对表格数据进行获取
- 首先可以先给页面表格添加id
<table id='mytable'>
......
</table>
- 然后再添加js脚本,通过id获取表格数据
function getTableData(){
var mytable = document.getElementById('mytable');
var data = [];
for(var i=0,rows=mytable.rows.length; i<rows; i++){ //行
for(var j=0,cells=mytable.rows[i].cells.length; j<cells; j++){ //列
data[i][j] = mytable.rows[i].cells[j].innerText;
}
}
}
- 当代码运行完成后将会获得一个二维数组的data数据。起初想通过ajax的方法直接向后台POST方法传输二维数组,但是后台使用PHPExcel时怎么也打印不了,检查了ajax的返回值始终时乱码,最后百度得到的解释说明为:html用了ajax,导致必须返回数据,与header输出浏览器冲突,导致无法输出excel,并且乱码,使用url方式直接访问即可。
- 于是我就将取得到的data二维数组转换成json格式直接url到后台,再通过转换json格式的数据得到二维数组
var json = encodeArray2D(data);
window.location.href='xxxxx?data='+json+'&&xxxx='+xxxx+'&&xxx='+xxx;
//将二维数组转换成json字符形式
function encodeArray2D(obj) {
var array = [];
for (var i = 0; i < obj.length; i++) {
array[i] = '[' + obj[i].join(',') + ']';
}
return '[' + array.join(',') + ']';
}
PHP利用PHPExcel导出表格数据到excel
- 当前台传输过来json数据后进行解码
$json = $_GET['json'];
$list = json_decode($json);
- 之后我们将用到PHPExcel,这个插件要自己下,下载完后如图文件夹和文件放到控制器目录里。只用到这如图两个。
- 下载链接::https://github.com/PHPOffice/PHPExcel
- 下载完后将class文件放到控制器目录
- 之后引入文件进行编写
public function contestRankXls()
{
require_once 'PHPExcel.php'; //引入
require_once 'PHPExcel/Writer/Excel2007.php';
$fileName = " ";//导出文件名
$json = $_GET['json'];
$list = json_decode($json);
$indexKey = $list[0];//获取列表头
$objPHPExcel = new \PHPExcel(); //声明一个类
$startRow=2; //表头从第几行开始
$xlsTitle = iconv('utf-8', 'gb2312', $fileName);//文件名称
//列段编号
$header_arr = 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'
);
if(empty($fileName)) $fileName = time(); //如果文件名为空则为当前时间戳
//设置保存版本格式
if($excel2007){
$objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
$fileName = $fileName.'.xlsx';
}else{
$objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
$fileName = $fileName.'.xls';
}
//设置表
$objActSheet = $objPHPExcel->getActiveSheet();
//设置表头样式
$objPHPExcel->getActiveSheet()->mergeCells('A1:'.$header_arr[count($indexKey)-1].'1');//合并单元格(如果要拆分单元格是需要先合并再拆分的,否则程序会报错)
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1',$c_id.' '.$c_title); //设置表头名称
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true); //合并单元格加粗
$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(14); //所有单元格设置默认宽度
$objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(20);//设置行高度
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);//设置学号列宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(30);//设置姓名列宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);//设置昵称列宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(7);//设置rank列宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(7);//设置解题数列宽度
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(18); //设置字体大小
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//设置文字居左(HORIZONTAL_LEFT,默认值)中(HORIZONTAL_CENTER)右(HORIZONTAL_RIGHT)
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
foreach ($list as $row) {
foreach ($indexKey as $key=>$value){
//这里是设置单元格的内容
$objActSheet->setCellValue($header_arr[$key].$startRow,$row[$key]);
$objPHPExcel->getActiveSheet()->getStyle($header_arr[$key].$startRow)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //文字居中
if($startRow==2){ //如果是表头字段则设置加粗
$objPHPExcel->getActiveSheet()->getStyle($header_arr[$key].$startRow)->getFont()->setBold(true);//设置是否加粗
}
}
$startRow++; //行加一
}
// 下载这个表格,在浏览器输出
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");;
header('Content-Disposition:attachment;filename='.$fileName.'');
header("Content-Transfer-Encoding:binary");
$objWriter->save('php://output');
}
- 通过这种方法导出Excel文件时,我在浏览器控制台输出数据时就打印失败或者乱码,打印前必须删除了控制台输出在能够成功打印,不知道时我的其他header影响还是本就如此,有待求证。
- 以上便是基本的代码了,有很多其他的部分被我删掉了,不太方便放出来,但是基本操作流程就是这样吧,对于PHPExecl百度有很多详解不必深究我的代码好坏,写一下给自己一个印象。
- 有不对请指正