php导出excel列数太多,【PHPEXECL】关于使用phpExecl导出数据时,列数超过26个报错问题 | Vany...

今天遇到一个关于导出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个报错的.之前我的代码是这样的

eaba5adae7f0259e183380e12125a903.png

直接读取头部信息然后重置excel的表头,所以超过26个的时候没做处理,直接就报错了,下面我处理后的代码是这样的

a1f305463802566b93959ff5ff783aeb.png

从上面我们可以看出,当$key1(默认值为0)大于25的时候,新增了一个$key变量,将A字母的ASCII码赋值给$key,每次遍历++$key;这样就可以获取从A-Z的字母了.

关于用$key1/26是为了获取当前轮数,再加上64(A字母的ASCII码是65),再加上chr($key)就可以组合成,AA,AB,AC,AD形式的新抬头标示了.最后附上字符的ASCII表

2f2e6670c57ee63fab0ec24e0f237914.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值