服务热线 400-660-8066

广州网站建设
首页 站内资讯

广州网站建设

站内资讯
广州网站建设 / 站内资讯 / 行业资讯 / 正文

PHPExcel-超过26列数据的导出

来源: All文章
发布时间:2023-04-10 15:00:51

  在网站制作中,经常会遇到的功能就是数据的导入和导出,PHP导入导出功能的实现不算很复杂,因为有一个比较好的插件PHPEXCEL。

  最近遇到一个问题,用phpExcel导出数据的时候发现报错Invalidcellcoordinate一直在用这个插件没有遇到过这样的问题,网上找了一下原来是当数据大于26列的时候26个字母用完了需要对列数进行处理大于26应该AA,AB,AC,AD排列下去。PHPExcel数据导出方式是一行一行的循环处理

  比如:第一行是标题,输出的时候以A1,B1,C1,D1AA1,BB1,CC1顺序循环。

  **

  *PHPExcel使用类

  *+------------------------------------使用------------------------------------+

  *导入excel表

  *vendor('PHPExcel.PHPExcelUser');

  *$file='./cs.xlsx';

  *$excel=new\PHPExcelUser($file);

  *$data=$excel-excelImport(1);//从第一行读取,如果有非字符串和函数的话则会返加一个错误的数组

  *导出excel表

  *vendor('PHPExcel.PHPExcelUser');

  *$file='./cs.xlsx';

  *$excel=new\PHPExcelUser($file);

  *$excel-excelExport($data=array(),$title=array());

  *+------------------------------------使用------------------------------------+

  *ClassFileTem

  */

  classPHPExcelUser{

  public$excelFilename;//excel导入或导出的文件的名称

  public$strCheck;//是否进行导入全部字符串验证

  public$funCheck;//是否进行导入函数验证

  public$errorArr=array();//当需要检查并且有错误时返回的错误统计数组

  /**

  *构造函数

  *@param$excelFilename文件名称

  *@parambool$strCheck是否进行字符串验证检测

  *@parambool$funCheck是否进行函数验证检测

  */

  publicfunction__construct($excelFilename,$strCheck=false,$funCheck=false){

  if(!$excelFilename){

  try{

  $error='请输入Excel文件名称';

  thrownewException($error);

  }catch(Exception$e){

  echo$e-getMessage();

  }

  }

  $this-excelFilename=$excelFilename;;

  $this-strCheck=$strCheck;

  $this-funCheck=$funCheck;

  }

  /**

  *导出成Excel文件

  *@paramarray$data一个二维数组,结构如同从数据库查出来的数组

  *@paramarray$titleexcel的第一行标题,一个数组,如果为空则没有标题

  *@exapme

  *$arr=$Model-select();

  *excelExport($arr,array('id','账户','密码','昵称'),'文件名');

  */

  functionexcelExport($data=array(),$title=array()){

  require_once('PHPExcel.php');

  error_reporting(E_ALL);

  date_default_timezone_set('Europe/London');

  $objPHPExcel=newPHPExcel();

  /*以下是一些设置,什么作者标题啊之类的*/

  $objPHPExcel-getProperties()-setCreator($this-excelFilename)

  -setLastModifiedBy($this-excelFilename)

  -setTitle(数据EXCEL导出)

  -setSubject(数据EXCEL导出)

  -setDescription(备份数据)

  -setKeywords(excel)

  -setCategory(resultfile);

  /*以下就是对处理Excel里的数据,横着取数据,主要是这一步,其他基本都不要改*/

  $model=$objPHPExcel-setActiveSheetIndex(0);

  $key=65;//只有A-Z

  $key2=ord(@);//@--64

  foreach($titleas$k=$v){

  if($keyord(Z)){

  $key2+=1;

  $key=ord(A);

  $colum=chr($key2).chr($key);//超过26个字母时才会启用

  }else{

  if($key2=ord(A)){

  $colum=chr($key2).chr($key);//超过26个字母时才会启用

  }else{

  $colum=chr($key);

  }

  }

  $model-setCellValue($colum.'1',$v);

  $key++;

  }

  $column=2;//从第二行开始

  foreach($dataas$key=$rows){//行写入

  $span=ord(A);

  $span2=ord(@);

  foreach($rowsas$m=$n){

  foreach($titleas$k=$v){

  if($spanord(Z)){

  $span2+=1;

  $span=ord(A);

  $j=chr($span2).chr($span);//超过26个字母时才会启用

  }else{

  if($span2=ord(A)){

  $j=chr($span2).chr($span);

  }else{

  $j=chr($span);

  }

  }

  }

  //dump($j.$column.'|'.$n);

  $model-setCellValue($j.$column,$n);

  //数据从第二行开始A2,B2,C2,D2开始循环

  $span++;

  }

  $column++;

  }

  //exit;

  $objPHPExcel-getActiveSheet()-setTitle('siteape');

  $objPHPExcel-setActiveSheetIndex(0);

  header('Content-Type:applicationnd.ms-excel');

  header('Content-Disposition:attachment;filename='.$this-excelFilename.'.xls');

  header('Cache-Control:max-age=0');

  $objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');

  $objWriter-save('php://output');

  exit;

  }

  /**

  *Excel读取

  *@param$begin开始读取的行数

  *@returnarray|string

  */

  functionexcelImport($begin){

  require_once('PHPExcel.php');

  $filename=$this-getRealFile($this-excelFilename);

  //建立reader对象

  $PHPReader=newPHPExcel_Reader_Excel2007();

  if(!$PHPReader-canRead($filename)){

  $PHPReader=newPHPExcel_Reader_Excel5();

  if(!$PHPReader-canRead($filename)){

  returnarray();

  }

  }

  //建立excel对象,此时你即可以通过excel对象读取文件,也可以通过它写入文件

  $PHPExcel=$PHPReader-load($filename);

  /*读取excel文件中的第一个工作表*/

  $currentSheet=$PHPExcel-getSheet(0);

  /*取得最大的列号*/

  $allColumn=$currentSheet-getHighestColumn();

  /*取得一共有多少行*/

  $allRow=$currentSheet-getHighestRow();

  $returnCell='';

  //循环读取每个单元格的内容。注意行从1开始,列从A开始

  for($rowIndex=$begin;$rowIndex=$allRow;$rowIndex++){

  for($colIndex='A';$colIndex=$allColumn;$colIndex++){

  $addr=$colIndex.$rowIndex;

  $cell=$currentSheet-getCell($addr)-getCalculatedValue();

  if($cellinstanceofPHPExcel_RichText){

  //富文本转换字符串

  $returnCell[$rowIndex][$colIndex]=$cell-__toString();

  }else{

  $returnCell[$rowIndex][$colIndex]=$cell;

  }

  }

  }

  return$returnCell;

  }

  /**

  *获取正确的路径

  *@param$file

  *@returnstring

  */

  publicfunctiongetRealFile($file){

  $file=$file?$file:$this-excelFilename;

  $error='';

  if(substr($file,0,4)=='http'){

  $realfile=$file;

  }elseif(!$file){

  $error='请指定文件路径';

  }elseif(file_exists($file)){

  $realfile=$file;

  }elseif(file_exists('.'.$file)){

  $realfile='.'.$file;

  }elseif(file_exists('..'.$file)){

  $realfile='..'.$file;

  }else{

  $error='您输入的文件不存在';

  }

  if($error!=''){

  try{

  thrownewException($error);

  }catch(Exception$e){

  echo$e-getMessage();

  }

  }else{

  return$realfile;

  }

  }

  /**

  *根据数据与字段匹配内容生成标准的表头

  *@param$titleArr二维数组,field=title

  *@param$data

  *@returnarray

  */

  publicfunctiongetArrayTitle($titleArr,$data){

  $reData=array();

  $firstData=$data[0];//只需要取第一条数据即可

  if($firstData){

  foreach($firstDataas$k=$v){

  $title=$titleArr[$k];

  $reData[]=$title;

  }

  }else{

  //直接输入默认顺序的title

  foreach($titleArras$k=$v){

  $reData[]=$v;

  }

  }

  return$reData;

  }

  }

* 文章来源于网络,如有侵权,请联系客服删除处理。
在线 咨询

添加动力小姐姐微信

微信 咨询

电话咨询

400-660-8066

我们联系您

电话 咨询
微信扫码关注动力小姐姐 X
qr