今天遇到一个关于导出excel表的问题,原因是因为导出的数据列数超过26列,为什么超过26列就会报错呢,因为execl表的抬头标示是从A-Z的,所以超过26位之后,会用[/^等等标识符进行标示.其实这些标识符是有规则的,这些是根据ASCII码进行编排的.
下面我们来看看完善的代码
protected function getExcel($fileName,$headArr,$data,$keys){
//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
import("Think.ORG.PHPExcel");
import("Think.ORG.PHPExcel.Writer.Excel5");
import("Think.ORG.PHPExcel.IOFactory.php");
$fileName .= ".xls";
//创建PHPExcel对象
$objPHPExcel = new PHPExcel();
//设置表头
$key = ord("A");
foreach($headArr as $key1 => $v){
//判断是否超过26列
if ($key1 <= 25) {
$colum = chr($key);
}else{
if (chr($key) == '[') {
$key = ord("A");
}
$colum = chr(64+$key1/26).chr($key);
}
$columArr[] = $colum;
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
++$key;
}
$column = 2;
$objActSheet = $objPHPExcel->getActiveSheet();
foreach($data as $key => $rows){ //行写入
$span = ord("A");
$i=1;
foreach($rows as $keyName=>$value){// 列写入
$j = $columArr[$keyName]; //判断第i个为时间戳时间
if ($keys==$i) {
$objActSheet->setCellValue($j.$column,date('Y-m-d',$value));
}else{
$objActSheet->setCellValue($j.$column,$value);
}
$span++;
$i++;
}
$column++;
}
$fileName = iconv("utf-8", "gb2312", $fileName);
//设置活动单指数到第一个表,所以Excel打开这是第一个表
$objPHPExcel->setActiveSheetIndex(0);
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=\"$fileName\"");
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); //文件通过浏览器下载
exit;
}
以上代码是我一个项目中的一部分代码,关于列数超过26个报错的.之前我的代码是这样的
直接读取头部信息然后重置excel的表头,所以超过26个的时候没做处理,直接就报错了,下面我处理后的代码是这样的
从上面我们可以看出,当$key1(默认值为0)大于25的时候,新增了一个$key变量,将A字母的ASCII码赋值给$key,每次遍历++$key;这样就可以获取从A-Z的字母了.
关于用$key1/26是为了获取当前轮数,再加上64(A字母的ASCII码是65),再加上chr($key)就可以组合成,AA,AB,AC,AD形式的新抬头标示了.最后附上字符的ASCII表
相关资源:php实现利用phpexcel导入导出数据至excel_phpexcel导出数据-PHP...
原文链接:php导出excel列数太多,【PHPEXECL】关于使用phpExecl导出数据时,列数超过26个报错问题 | Vany..._胡子长过汪涵的博客-优快云博客