phpexcel导入导出excel,并解决超出26列出现的错误
2017-06-14 13:19
477 查看
Thinkphp
$lists = ''; //sql查询结果;
$total_money = ''; $filename="order_excel"; // 文件名称 $headArr=array("ID","用户名称","专家名称","专家订单","订单价格","消费类型","订单类型","订单时间","订单有效期"); $title = "订单明细"; // 文件标题 $total_name = '总金额'; $this->exportExcel($filename,$title,$headArr,$order_listss,$total_name,$total_money);
第一种:
function exportExcel($filename,$expTitle,$expCellName,$expTableData,$total_name='',$total_money='')
{ $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称 $fileName = $filename.date('_YmdHis');//or $xlsTitle 文件名称可根据自己情况设定 $cellNum = count($expCellName); $dataNum = count($expTableData); Vendor("PHPExcel.PHPExcel"); Vendor("PHPExcel.PHPExcel.Writer.Excel5"); Vendor("PHPExcel.PHPExcel.PHPExcel.IOFactory.php"); $objPHPExcel = new \PHPExcel(); $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'); $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格 $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.' Export time:'.date('Y-m-d H:i:s')); for($i=0;$i<$cellNum;$i++){ $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i]); } $column = 3; $objActSheet = $objPHPExcel->getActiveSheet(0); foreach($expTableData as $keys => $rows){ $span = ord("A"); foreach($rows as $keyName=>$value){ $j = chr($span); $objActSheet->setCellValue($j.$column, $value); $span++; } $column++; } if (!empty($total_money) && !empty($total_name)) { $objActSheet->setCellValue('A'.$column, $total_name); $objActSheet->setCellValue('B'.$column, $total_money[0]['total_money']); } header('pragma:public'); header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"'); header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印inline本窗口打印 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit; }
第二种:
/** * excel表格导出 * @param string $fileName 文件名称 * @param array $expTitle 表头名称 * @param array $expTableData 要导出的数据 * @author static7 */ function exportExcel($filename,$expTitle,$expCellName,$expTableData) { // $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称 // $fileName = $expTitle;//or $xlsTitle 文件名称可根据自己情况设定 $cellNum = count($expCellName); $dataNum = count($expTableData); vendor("PHPExcel"); $objPHPExcel = new PHPExcel(); // Set document properties $objPHPExcel->getProperties()->setCreator("Maarten Balliauw") ->setLastModifiedBy("Maarten Balliauw") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") ->setKeywords("office 2007 openxml php") ->setCategory("Test result file"); ob_clean(); //解决文件损坏 // Add some data $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'); // $nowDate = date('Y-m-d H:i', time()); $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1'); //合并单元格 $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.' 导出时间:'.date('Y-m-d H:i:s')); for($i=0;$i<$cellNum;$i++){ $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i]); } $column = 3; $objActSheet = $objPHPExcel->getActiveSheet(0); foreach($expTableData as $keys => $rows){ // 行写入 $span = ord("A"); foreach($rows as $keyName => $value){ // 列写入 $j = chr($span); $objActSheet->setCellValue($j.$column, $value); $span++; } $column++; } // Rename worksheet 重命名工作表,修改sheet名称 $objPHPExcel->getActiveSheet()->setTitle('Simple'); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表 // Redirect output to a client’s web browser (Excel2007) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header("Content-Disposition: attachment;filename=$filename.xlsx"); header('Cache-Control: max-age=0'); // If you're serving to IE 9, then the following may be needed header('Cache-Control: max-age=1'); // If you're serving to IE over SSL, then the following may be needed header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); exit; }
YII
一 :导入excel文件
引入phpexcel类库
require(Yii::getAlias('@common').'/library/PHPExcel/PHPExcel.PHP');
//这是yii的引入方式 根据情况自己引入类库
1.要上传文件
if (!empty ( $_FILES ['excel'] ['name'] )){
$tmp_file = $_FILES ['excel'] ['tmp_name'];
$file_types = explode ( ".", $_FILES ['excel'] ['name'] );
$file_type = end($file_types);
/*判别是不是.xls文件,判别是不是excel文件*/
if ((strtolower ($file_type) != "xls") && (strtolower ($file_type) != "xlsx")&& (strtolower ($file_type) != "csv")){
$error ="文件类型不对";
die;
}
//DS 是自己定义的/ 和在Linux里是\
需要自己定义
$dir=date("Y-m-d",time());
if(!is_dir(ROOT_PATH.DS."upload".DS."excel".DS.$dir)){
mkdir(ROOT_PATH.DS."upload".DS."excel".DS.$dir);
}
//注意,如果upload前加 / 则报错。
$path = 'upload'.DS.'excel'.DS.$dir.DS. time().rand(1000,9999) . '.' . $file_type;
$pic_name = time() . rand(10000, 99999) . "." . $file_type;//图片名称
if (!move_uploaded_file($tmp_file, $path)) { //临时文件转移到目标文件夹
$error ="上传失败";
return $this->redirect(['index',
'error' => $error,
]);
die;
}
2.读取上传的文件
//加载导入类
$PHPExcel=new \PHPExcel();
$PHPReader = new \PHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($path)){
$PHPReader = new \PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($path)){
return false;
}
}
$PHPExcel=$PHPReader->load($path);//载入文件
// print_r($PHPExcel);die;
$currentSheet=$PHPExcel->getSheet(0); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
$allColumn=$currentSheet->getHighestColumn();//获取总列数d
++$allColumn;
$allRow=$currentSheet->getHighestRow();//获取总行数
// echo $allRow;die;
// print_r($allRow);die;
$arr=array();
for($currentRow = 3;$currentRow <= $allRow;$currentRow++){
/**从第A列开始输出*/
$i=0;
for($currentColumn = 'A'; $currentColumn !=$allColumn; $currentColumn++){ //大于26列
if($i>25){
$num =ord($currentColumn)+$i;
}else{
$num =ord($currentColumn);
}
// echo $i.$currentColumn; echo "<br>";
$val = $currentSheet->getCellByColumnAndRow($num - 65,$currentRow)->getValue(); /*ord()将字符转为十进制数*/
/**如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出*/
// $arr[$currentRow][]= iconv('utf-8','gb2312', $val)."\t";
$arr[$currentRow][]= trim($val);
$i++;
}
}
//删除全部为空的行
foreach ($arr as $key=>$vals){
$tmp = '';
foreach($vals as $v){
$tmp .= $v;
}
if(!$tmp) unset($arr[$key]);
}
print_r($arr);die;
二:导出excel
public function getExcel($fileName,$headArr,$data){
//$headArr, 设置的表头
//$data 传过来的需要导出的数据 二维数组
$date = date("Y_m_d",time());
$fileName .= "_{$date}.xls";
//创建PHPExcel对象,注意,不能少了\
$objPHPExcel = new \PHPExcel();
$objProps = $objPHPExcel->getProperties();
//设置表头 超过26列
$key = 0;
foreach($headArr as $v){
//注意,不能少了。将列数字转换为字母\
$colum = \PHPExcel_Cell::stringFromColumnIndex($key);
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
$key += 1;
}
//设置表头
/* $key = ord("A");
//print_r($headArr);exit;
foreach($headArr as $v){
$colum = chr($key);
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
$key += 1;
}*/
$column = 2; //从第二行写入数据 第一行是表头
$objActSheet = $objPHPExcel->getActiveSheet();
//print_r($data);exit;
/*foreach($data as $key => $rows){ //行写入
$span = ord("A");
foreach($rows as $keyName=>$value){// 列写入
$j = chr($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}*/
此处解决列超出26的问题
foreach($data as $key => $rows){ //行写入
$span = 0;
foreach($rows as $keyName=>$value){// 列写入
$j = \PHPExcel_Cell::stringFromColumnIndex($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}
$fileName = iconv("utf-8", "gb2312", $fileName);
/* //重命名表
$objPHPExcel->getActiveSheet()->setTitle($date);
//设置字体大小
$objPHPExcel->getDefaultStyle()->getFont()->setSize(14);
//设置单元格宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
//设置默认行高
$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(23);
*/
//重命名表
//$objPHPExcel->getActiveSheet()->setTitle('test');
//设置活动单指数到第一个表,所以Excel打开这是第一个表
$objPHPExcel->setActiveSheetIndex(0);
ob_end_clean();//清除缓冲区,避免乱码
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;
相关文章推荐
- PHPexcel导入导出超过26列的解决方法
- phpExcel导出大量数据出现内存溢出错误的解决方法
- phpExcel导出大量数据出现内存溢出错误的解决方法
- phpExcel导出大量数据出现内存溢出错误的解决方法
- phpExcel导出大量数据出现内存溢出错误的解决方法
- ThinkPHP 3.2 + PHPExcel 导入导出文件 第三方类库不能用问题解决
- ThinkPHP 3.2 + PHPExcel 导入导出文件 第三方类库不能用问题解决
- ThinkPHP 3.2 PHPExcel 导入导出文件 第三方类库不能用问题解决
- 将Excel导入MSSQL2000时出现"对于所指定的缓冲区来讲太大"错误的解决方法
- EXCEL表导入SQL,出现错误 0xc02020c5 的问题解决
- sql server 2005 导入导出数据时出现错误 0x00470fe的解决办法
- 导出Excel出现“异常来自 HRESULT:0x800A03EC”错误的解决方法(已验证)
- 将Excel导入MSSQL2000时出现"对于所指定的缓冲区来讲太大"错误的解决方法
- Excel导入数据库出现“外部表不是预期的格式”错误的解决方法
- 解决 Linux下oracle导入(imp)导出(exp)出现"failed to open ...for reader/wirte" 错误
- php导出EXCEL出现乱码的终极解决方法
- SAS 9.3 x64 导入导出Excel出现问题解决方法
- 解决导出excel中出现的错误:只能在执行 Render() 的过程中调用 RegisterForEventValidation
- Access2007导入文本文件和Excel文件时,出现的三种错误情况及其解决
- EXCEL导入到SQL Server经常出现“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决