web程序开发的时候,经常有关于操作Excel的需求.PHPExcel类是我用过的比较实用的工具[当然,除了那惊人的内存占用].PHPExcel本身的tar包里面已经有非常详细的demo,在这里我记录我使用到的一些工作,作为常用的工具类收藏下来,以后如果有用到更多的功能,会不断的更新.
首先定义PHPExcel类的路径[这里根据大家实际不同的目录结构定义]
define('PATH','/var/www/class/PHPExcel/PHPExcel.php');
/** ++++++++++++++++++++++++++++
* excel文件导出
++++++++++++++++++++++++++++ */
首先加载PHPExcel类并实例化,设置相关属性.
include_once PATH; $objPHPExcel = new PHPExcel(); $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");
excel导出对应值运算
//PHPExcel导出单元格设置 $outputFileName='biby.xls';//输出excel文件名称 //处理要输出的数据为二维数组,对应形式如下 $data=array( 0=>array(//第一行 0=>'name',//第一列 1=>'sex',//第二列 2=>'age',//第三列 ); 0=>array(//第二行 0=>'name',//第一列 1=>'sex',//第二列 2=>'age',//第三列 ); ); $objPHPExcel->setActiveSheetIndex(0)->setCellValue(A1,$value);//setActiveSheetIndex(0)设置当前sheet && setCellValue(单元格,对应值) //这里excel是以A1,A2...B1,B2....Z1,Z2的方式处理输出值对应单元格的,我们可以生成对应的数组来存储这些表示单元格的值,这样就可以用循环遍历的方式处理输出了 $skeyArr = array(); $k=0; for($i=0;$i<=100;$i++){ //列 for ($j=1; $j <= 100; $j++) { //行 $skeyArr[$k][] = PHPExcel_Cell::stringFromColumnIndex($i) . $j;//PHPExcel_Cell::stringFromColumnIndex将数字转换为对应字母列 } $k++; } //最后用嵌套的循环设置每个对应单元格的值 $l=0;//行 foreach ($data as $key => $value) { $count = count($value); for ($p=0; $p < $count; $p++) { //列 $objPHPExcel->setActiveSheetIndex(0)->setCellValue($skeyArr[$p][$l],$value[$p]); } $l++; }
设置头文件,告诉浏览器以下载方式处理输出
$objPHPExcel->getActiveSheet()->setTitle($outputFileName);//当前sheet名称 $objPHPExcel->setActiveSheetIndex(0);//当前活动sheet header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$outputFileName.'"');//设置输出excel文件名称 header('Cache-Control: max-age=0'); 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, 'Excel5');//excel2003版本 //$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');//excel2007版本 $objWriter->save('php://output'); exit;
/** ++++++++++++++++++++++++++++
* excel文件导入
++++++++++++++++++++++++++++ */
excel文件导入通常是读取excel文件存放成PHP数组,然后就可以进行相应的操作了[计算,入库等]
首先同样是加载PHPExcel类并实例化
include_once PATH; $file_path = '/var/www/biby.test.xls';//要导入的excel文件 $PHPExcel = new PHPExcel(); $PHPReader = new PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead($file_path)){ $PHPReader = new PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead($file_path)){ $this->error('Excel文件处理错误!'); } }
接着加载excel文件并读取相关信息
$PHPExcel = $PHPReader->load($file_path); $currentSheet = $PHPExcel->getSheet(0);//当前活动sheet $allColumn = $currentSheet->getHighestColumn();//excel最高列值 PHPExcel_Cell::columnIndexFromString($allColumn);//excel文件总列数 $allRow = $currentSheet->getHighestRow();//excel总行数,这里要注意空白行的影响 $inMonth = $currentSheet->getCellByColumnAndRow(0,2);//这里用数字代表行列 eg,0,2代表第二行第一列 //可以用for循环读取单元格的值,构造我们需要的数组 $inMonth = PHPExcel_Style_NumberFormat::toFormattedString($inMonth->getCalculatedValue(), 'YYYY-MM');//将读取的时间值转换为我们需要的格式 //eg: //一般第一行是表头,我们可以用数组来存储该值 $KeyArr = array('month','name','sex','age');//同时作二维数组下标值 //后面的行数可以用for嵌套循环读取 $i = 0; for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {//行循环 && $allRow 行数 $k = 0; for ($j=65; $j > 32; $j--) {//列循环 65为A对应ASCII码 32是根据excel表列数,根据第一列是A[65]计算而得 $selcolumn = ord('A') - $j;//列数 if( isset($KeyArr[$k]) ){ if($selcolumn==0){//第一列[月份] && 月份要转换 $downData[$i][$KeyArr[$k]] = $currentSheet->getCellByColumnAndRow($selcolumn,$currentRow); $downData[$i][$KeyArr[$k]] = PHPExcel_Style_NumberFormat::toFormattedString($DeferData[$i][$DeferKeyArr[$k]]->getCalculatedValue(), 'YYYY-MM'); }else{ $downData[$i][$KeyArr[$k]] = trim($currentSheet->getCellByColumnAndRow($selcolumn,$currentRow)->getValue()); } $k++; }else{ $k++; continue; } } $i++; } //$downData 就是我们组装后的数组,可以根据我们的业务需求进行对应操作
当然,也可以将excel读成一个简单的二维数组[如果我们不需要特定结构的数组]
$PHPExcel = $PHPReader->load($file_path); $currentSheet = $PHPExcel->getSheet(0); $currentSheet->ToArray();