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即可。

 

posted @ 2017-09-04 16:19  小z姑娘  Views(751)  Comments(2)    收藏  举报