在
网站制作中,经常会遇到的功能就是数据的导入和导出,PHP导入导出功能的实现不算很复杂,因为有一个比较好的插件PHPEXCEL。
最近遇到一个问题,用phpExcel 导出数据的时候发现报错 Invalid cell coordinate 一直在用这个插件没有遇到过这样的问题,网上找了一下原来是当数据大于26列的时候 26个字母用完了需要对列数进行处理 大于26应该AA,AB,AC,AD…排列下去。PHPExcel数据导出方式是一行一行的循环处理
比如:第一行是标题,输出的时候以A1,B1,C1,D1…AA1,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());
* +------------------------------------使用------------------------------------+
* Class FileTemp
*/
class PHPExcelUser {
public $excelFilename; //excel导入或导出的文件的名称
public $strCheck; //是否进行导入全部字符串验证
public $funCheck; //是否进行导入函数验证
public $errorArr = array(); //当需要检查并且有错误时返回的错误统计数组
/**
* 构造函数
* @param $excelFilename 文件名称
* @param bool $strCheck 是否进行字符串验证检测
* @param bool $funCheck 是否进行函数验证检测
*/
public function __construct($excelFilename, $strCheck = false, $funCheck = false) {
if (!$excelFilename) {
try {
$error = '请输入Excel文件名称';
throw new Exception($error);
} catch (Exception $e) {
echo $e->getMessage();
}
}
$this->excelFilename = $excelFilename;;
$this->strCheck = $strCheck;
$this->funCheck = $funCheck;
}
/**
* 导出成Excel文件
* @param array $data 一个二维数组,结构如同从数据库查出来的数组
* @param array $title excel的第一行标题,一个数组,如果为空则没有标题
* @exapme
* $arr = $Model -> select();
* excelExport($arr,array('id','账户','密码','昵称'),'文件名');
*/
function excelExport($data = array(), $title = array()) {
require_once('PHPExcel.php');
error_reporting(E_ALL);
date_default_timezone_set('Europe/London');
$objPHPExcel = new PHPExcel();
/*以下是一些设置 ,什么作者 标题啊之类的*/
$objPHPExcel->getProperties()->setCreator($this->excelFilename)
->setLastModifiedBy($this->excelFilename)
->setTitle("数据EXCEL导出")
->setSubject("数据EXCEL导出")
->setDescription("备份数据")
->setKeywords("excel")
->setCategory("result file");
/*以下就是对处理Excel里的数据, 横着取数据,主要是这一步,其他基本都不要改*/
$model = $objPHPExcel->setActiveSheetIndex(0);
$key = 65; //只有A-Z
$key2 = ord("@");//@--64
foreach ($title as $k => $v) {
if($key>ord("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($data as $key => $rows){ //行写入
$span = ord("A");
$span2 = ord("@");
foreach ($rows as $m => $n) {
foreach($title as $k=>$v){
if($span>ord("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 开始读取的行数
* @return array|string
*/
function excelImport($begin) {
require_once('PHPExcel.php');
$filename = $this->getRealFile($this->excelFilename);
//建立reader对象
$PHPReader = new PHPExcel_Reader_Excel2007();
if (!$PHPReader->canRead($filename)) {
$PHPReader = new PHPExcel_Reader_Excel5();
if (!$PHPReader->canRead($filename)) {
return array();
}
}
//建立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 ($cell instanceof PHPExcel_RichText) {
//富文本转换字符串
$returnCell[$rowIndex][$colIndex] = $cell->__toString();
} else {
$returnCell[$rowIndex][$colIndex] = $cell;
}
}
}
return $returnCell;
}
/**
* 获取正确的路径
* @param $file
* @return string
*/
public function getRealFile($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 {
throw new Exception($error);
} catch (Exception $e) {
echo $e->getMessage();
}
} else {
return $realfile;
}
}
/**
* 根据数据与字段匹配内容生成标准的表头
* @param $titleArr 二维数组,field=>title
* @param $data
* @return array
*/
public function getArrayTitle($titleArr, $data) {
$reData = array();
$firstData = $data[0]; //只需要取第一条数据即可
if ($firstData) {
foreach ($firstData as $k => $v) {
$title = $titleArr[$k];
$reData[] = $title;
}
} else {
//直接输入默认顺序的title
foreach ($titleArr as $k => $v) {
$reData[] = $v;
}
}
return $reData;
}
}
网站标题:PHPExcel-超过26列数据的导出
转载源于:https://www.cdcxhl.com/news13/248263.html
成都网站建设公司_创新互联,为您提供网站收录、动态网站、手机网站建设、小程序开发、网页设计公司、网站设计公司
广告
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源:
创新互联