PHP 实现Excel数据导入Mysql数据库
PHPExcelReader是一个基于php的开源项目,其作用在于解析excel文件
下载地址:http://phpexcelreader.sourceforge.net/
一般结构如下:

解析:
Excel目录下的两个文件oleread.inc和reader.php是excel解析 必备的包含文件,解析所需的类与方法分别写在这两个文件之中,其中example.php和example2.php是示例文件,jxlrwtest.xls为excel数据文件,其他的为自述文件。
主要程序代码:
require_once(ROOT_DIR.'Excel/reader.php');// 引用reader.php文件,加载类库 $excelData = new Spreadsheet_Excel_Reader();//实例化解析类 $excelData -> setOutputEncoding("UTF-8");//设置编码方式 $excelData -> setUTFEncoder('iconv');//设置字符编码器
执行执行后,解析的结果在数组 $excelData->sheets[0] 中,包含有:
maxrow:
maxcol:
numRows:表行数,如 $excelData -> sheets[0]['numRows'];
numCols:表列数,如 $excelData -> sheets[0]['numCols'];
cells:表的实际内容,是一个形如[row][column]格式的二维数组,如:$excelData -> sheets[0]['cells'][1][2]---行1列2中的数据;
cellsInfo:表格不同的数据类型信息,包含了表格的原始数据(raw)和类型(type);
引入文件:
$excelData -> read('./Excel/CarAndAir.xls');//读取并解析文件
想要获取单元格里的数据,需遍历 $excelData -> sheets[0]['cells'];根据数据库字段类型对excel表格中的数据进行相应处理;
注:
1、reader.php文件中已经包含了oleread.inc文件,因此在调用的时候不需要加载oleread.inc;
2、官方提供的excel文件jxlwtest.xls已经损坏,无法读取与解析;
3、原始reader.php文件的第31行,如下
require_once 'Spreadsheet/Excel/Reader/OLERead.php';
文件不存在,在这里需把文件修改文Excel/oleread.inc;
4、原始reader.php文件的第261行会发生错误,如下
function Spreadsheet_Excel_Reader() { $this->_ole =& new OLERead(); $this->setUTFEncoder('iconv'); }
原因是 =& 符号在PHP 5.3中被废弃。在此处需把 “=&” 修改为 “=” 即可;
5、PHPExcelReader不支持扩展名为 xlsx 的excel文档,它只针对扩展名为 xls 的excel文档;
6、PHPExcelReader的设置方法基于iconv 扩展;若本地PHP环境没有iconv扩展,那么PHPExcelReader的编码方法默认为Unicode;
完整代码:
excel_data.php
<?php header('content-type:text/html;charset=utf-8'); define('ROOT_DIR',str_replace('\\','/',dirname(__DIR__))."/"); //define('ROOT_DIR',dirname(dirname(__FILE__))); require_once(ROOT_DIR.'pub/fun_package.php'); require_once(ROOT_DIR.'config/config_db.php'); require_once(ROOT_DIR.'Excel/reader.php');// 引用reader.php文件,加载类库 $excelData = new Spreadsheet_Excel_Reader();//实例化解析类 $excelData -> setOutputEncoding("UTF-8");//设置编码方式 $excelData -> setUTFEncoder('iconv');//设置字符编码器 // ini_set("data.timezone","Asia/Shanghai"); //$excelData -> read(ROOT_DIR.'Excel/hk.xls');//读取并解析文件---航空; $excelData -> read(ROOT_DIR.'Excel/CarAndAir.xls');//读取并解析文件---汽运; error_reporting(E_ALL ^ E_NOTICE); //$del_sql = "delete from yzs_cwjs.code_prc_tmp where vld_date = '2017-08-25' and entr_pers = '12798'";//删除航空数据 $del_sql = "delete from yzs_cwjs.code_prc_tmp where vld_date = '2017-08-25' and entr_pers = '12798' and trans_type = '0'";//删除汽运数据 $pdo->exec($del_sql); $numRowData = $excelData->sheets[0]['numRows'];//行 $CellsData = $excelData->sheets[0]['cells'];//列 foreach ($CellsData as $k => $v) { if($k == '1') continue; $start_res = array(); $end_res = array(); $start_res[] = is_numeric($v['2']) ? $v['2'] : preg_match("/(?:\()(.*)(?:\))/i",$v['2'],$start_res); $end_res[] = is_numeric($v['3']) ? $v['3'] : preg_match("/(?:()(.*)(?:))/i",$v['3'],$end_res); $start_code = is_numeric($start_res[0]) ? $start_res[0] : $start_res[1];//始发网点编码 $end_city = is_numeric($end_res[0]) ? $end_res[0] : $end_res[1];//目的城市编码 //判断运输方式 switch ($v['4']) { case '汽运': $trans_type = 0; break; case '航空': $trans_type = 1; break; default: $trans_type = ''; break; } //免首重 switch ($v['10']) { case '否': $exmpt_one = 0; break; case '是': $exmpt_one = 1; break; default: $exmpt_one = ''; break; } switch ($v['15']) { case '否': $exmpt_two = 0; break; case '是': $exmpt_two = 1; break; default: $exmpt_two = ''; break; } switch ($v['20']) { case '否': $exmpt_three = 0; break; case '是': $exmpt_three = 1; break; default: $exmpt_three = ''; break; } switch ($v['25']) { case '否': $exmpt_four = 0; break; case '是': $exmpt_four = 1; break; default: $exmpt_four = ''; break; } switch ($v['30']) { case '否': $exmpt_five = 0; break; case '是': $exmpt_five = 1; break; default: $exmpt_five = ''; break; } switch ($v['35']) { case '否': $exmpt_six = 0; break; case '是': $exmpt_six = 1; break; default: $exmpt_six = ''; break; } $vld_date = '2017-08-25';//生效日期 $vld = 0;//有效性 $entr_time = date('Y-m-d H:i:s',intval(time()));//录入时间 $entr_pers = '12798';//录入人id $CHK_STAT = 0;//审核状态 $CHK_PERS = 'system';//审核人员 $last_modify_time = date('Y-m-d H:i:s',intval(time()));//最后更新时间 $sql = "insert into yzs_cwjs.code_prc_tmp (id,start_code,end_city,trans_type,first_wgt,first_prc,oper_one,first_one,end_one,exmpt_one,prc_one,oper_two,first_two,end_two,exmpt_two,prc_two,oper_three,first_three,end_three,exmpt_three,prc_three,oper_four,first_four,end_four,exmpt_four,prc_four,oper_five,first_five,end_five,exmpt_five,prc_five,oper_six,first_six,end_six,exmpt_six,prc_six,oper_seven,vld_date,vld,entr_time,entr_pers,CHK_STAT,CHK_PERS,last_modify_time,entr_ip) values(null,$start_code,$end_city,'$trans_type','$v[5]','$v[6]','$v[7]','$v[8]','$v[9]','$exmpt_one','$v[11]','$v[12]','$v[13]','$v[14]','$exmpt_two','$v[16]','$v[17]','$v[18]','$v[19]','$exmpt_three','$v[21]','$v[22]','$v[23]','$v[24]','$exmpt_four','$v[26]','$v[27]','$v[28]','$v[29]','$exmpt_five','$v[31]','$v[32]','$v[33]','$v[34]','$exmpt_six','$v[36]','$v[37]','$vld_date','$vld','$entr_time','$entr_pers',$CHK_STAT,'$CHK_PERS','$last_modify_time','$v[41]')"; $sql_res = $pdo -> exec($sql); if($sql_res){ echo "数据插入成功!"; }else{ echo "数据插入失败!"; } }
excel 文档:
编号 始发网点 目的城市 运输方式 首重重量 首重价格 操作费1 始重重量段1 末重重量段1 免首重1 价格元/kg1 操作费2 始重重量段2 末重重量段2 免首重2 价格元/kg2 操作费3 始重重量段3 末重重量段3 免首重3 价格元/kg3 操作费4 始重重量段4 末重重量段4 免首重4 价格元/kg4 操作费5 始重重量段5 末重重量段5 免首重5 价格元/kg5 操作费6 始重重量段6 末重重量段6 免首重6 价格元/kg6 操作费7 生效日期 录入时间 录入人 录入人IP
1 100506 省直管县级行政区域(139000) 汽运 0 0 0 0 5 是 0.1 0.2 5 999 否 0.2 0.3 0 0 否 0 0 0 0 否 0 0 0 0 否 0 0 0 0 否 0 0 2017/6/10 2017/6/14 呵呵呵 192.168.10.1
建好数据库和数据表,运行excel_data.php即可。

浙公网安备 33010602011771号