最近经常处理Excel文件数据的导入导出,都是使用PHPExcel类库。PHPExcel是一个强大的PHP类库,用于生成和处理Excel文件以及相关操作。其功能强大,类和方法繁多。由于没有找到权威的中文手册,使用过程中也遇到了许多问题,在这里做一下记录和分享。
代码是边对照手册和边通过Google自己编写的,某些方法不一定是最优解,但都是经过调试和线上运行过的,保证可用。
今天先是读取的部分:
首先是引入类库文件,在读取Excel文件时可以不引入PHPExcel.php主文件,直接引入PHPExcel下的 IOFactory.php 类即可。
require_once(__YOUR_LIB_PATH__.'/PHPExcel/IOFactory.php');
然后新建PHPExcel对象并读取相应文件。
在实际过程中发现csv文件与xls(x)文件的处理稍有不同,需要设置一些文件选项,因此加入了文件类型判断,区分两种情况。
$file = "test.csv"; $type = strtolower( pathinfo($file, PATHINFO_EXTENSION) ); $path = __YOUR_FILE_PATH__.'/'.$file;if (!file_exists($path)) { die('no file!'); }//根据不同类型分别操作if( $type=='xlsx'||$type=='xls' ){ $objPHPExcel = PHPExcel_IOFactory::load($path); }else if( $type=='csv' ){ $objReader = PHPExcel_IOFactory::createReader('CSV') ->setDelimiter(',') ->setInputEncoding('GBK') //不设置将导致中文列内容返回boolean(false)或乱码 ->setEnclosure('"') ->setLineEnding("\r\n") ->setSheetIndex(0); $objPHPExcel = $objReader->load($path); }else{ die('Not supported file types!'); }
现在已经打开了相应的文件,接下来就是选择标签页,读取行和列的总数,为循环取出数据做准备。
需要注意的是,通常Excel文件的列名为大写英文字母制,如第一列为‘A’,第26列为‘Z’,第27列为‘AA’。以此类推。通过getHighestColumn()方法可获得表中最后一列的列名,为了方便后续的操作,需要将列名转换为数字的索引。
PHPExcel也为此提供了互相转换的方法,即在PHPExcel_Cell类中的columnIndexFromString() 与 stringFromColumnIndex()两个方法。
其中columnIndexFromString()将列名转换为相应的数字索引,索引从1开始,即columnIndexFromString(‘A’) 的结果为1。
stringFromColumnIndex()将数字索引转换为相应的列名,索引从0开始,即stringFromColumnIndex(0) 的结果为’A‘。
继续以下代码:
//选择标签页$sheet = $objPHPExcel->getSheet(0);//获取行数与列数,注意列数需要转换$highestRowNum = $sheet->getHighestRow(); $highestColumn = $sheet->getHighestColumn(); $highestColumnNum = PHPExcel_Cell::columnIndexFromString($highestColumn);//取得字段,这里测试表格中的第一行为数据的字段,因此先取出用来作后面数组的键名$filed = array();for($i=0; $i<$highestColumnNum;$i++){ $cellName = PHPExcel_Cell::stringFromColumnIndex($i).'1'; $cellVal = $sheet->getCell($cellName)->getValue();//取得列内容 $filed []= $cellVal; }//开始取出数据并存入数组$data = array();for($i=2;$i<=$highestRowNum;$i++){//ignore row 1 $row = array(); for($j=0; $j<$highestColumnNum;$j++){ $cellName = PHPExcel_Cell::stringFromColumnIndex($j).$i; $cellVal = $sheet->getCell($cellName)->getValue(); $row[ $filed[$j] ] = $cellVal; } $data []= $row; } print_r($data);//完成,可以存入数据库了
附上 PHPExcel 的GIthub地址: PHPExcel
上一篇:AJAX跨域请求获取JSON数据