js+PHP利用PHPExcel导出表格数据到excel

前言

因为在开发平台的时候遇到了需要将表格数据导出到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百度有很多详解不必深究我的代码好坏,写一下给自己一个印象。
  • 有不对请指正
发布了10 篇原创文章 · 获赞 3 · 访问量 510

猜你喜欢

转载自blog.csdn.net/weixin_44546342/article/details/103843693
今日推荐