在网站制作中,经常会遇到的功能就是数据的导入和导出,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;
}
}