PHPExcel-超过26列数据的导出

2023-03-27    分类: 网站建设

网站制作中,经常会遇到的功能就是数据的导入和导出,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。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司