使用PHPExcel读取xls/xlsx或csv表格文件数据

最近经常处理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


 联系我们

  • 邮箱:admin@admincms.top
  • 官方博客:blog.admincms.top
  • 官方微信公众号:huayuejishu
扫描二维码关注Joker.Liu微信公众号
TOP博客官方微信公众号二维码