tp5.1导入Excel插入数据库 前端将列表导出为Excel文件

本文详细介绍了如何使用TP5.1框架、PHPEXCEL扩展和layui前端框架,实现Excel文件的导入和导出功能。前端通过layui的文件上传组件上传Excel,后台利用PHPEXCEL解析文件内容并插入数据库,同时提供了按条件导出数据到Excel的实现方法。
摘要由CSDN通过智能技术生成

前端导入Excel将对应字段插入数据库表中

 用到  
 1. tp5.1 开发
 2. php的扩展 PHPEXCEL
 3. layui 的文件上传(前端)

先制作出前端显示的列表页面 用到layui的数据表格制作出需要的列表页面
列表页面

导入功能

  1. 导入按钮的代码
<a onclick="importExcel()" class="layui-btn layui-btn-primary layui-btn-sm layui-icon layui-icon-upload"
       title="导入Excel">&nbsp;导入Excel</a>

2.点击导入按钮后 弹出文件上传框 实现文件上传功能


点击按钮弹出层发JS

// 导入操作
    function importExcel() {
        layer.open({
            title: '导入Excel',
            type: 1,
            content: $('#importExcel'),
            end: function () {
                $('#uploadDemoView').addClass('layui-hide').find('img').attr('src', '');
            }
        });
    }

弹出层的html代码

<!-- 导入Excel  -->
<div style="display:none;" id="importExcel">
    <div class="layui-upload-drag" id="test10">
        <i class="layui-icon"></i>
        <p>点击上传,或将文件拖拽到此处</p>
        <div class="layui-hide" id="uploadDemoView">
            <hr>
            <img src="" alt="" style="max-width: 196px">
        </div>
    </div>
</div>

文件上传的js  upload要先声明

		//拖拽上传
        upload.render({
            elem: '#test10'
            , url: 'uploadExcel' //改成您自己的上传接口
            , accept: 'file'
            , exts: 'xls|xlsx'
            , done: function (res) {
                if (res.code == 1) {
                    loading_frame = layer.load(1);
                    //layer.msg(res.msg);
                    layui.$('#uploadDemoView').removeClass('layui-hide').find('img').attr('src', res.data.file);
                    //  因为上传的是文件  src填写文件路径是显示不了的   此处自行修改------------- 此处JS省略在下方  -------------} else {
                    layer.msg(res.msg);
                }
            }
        });


前端 文件上传要的   uploadExcel 接口

	// Excel导入  上传 Excel到服务器uploads下
    public function uploadExcel()
    {
        $file = $this->request->file('file');
        $floder = $this->request->param('floder');
        if (!file_exists('./uploads/' . $floder)) {
            mkdir('./uploads/' . $floder);
            chmod('./uploads/' . $floder, 0777);
        }
        $res = $file->validate(['size' => 1024 * 1024 * 30, 'ext' => 'xls,xlsx'])->move('uploads/' . $floder);
        if ($res) {
            return json(['code' => 1, 'msg' => '上传成功', 'data' => ['file' => '/uploads/' . $floder . '/' . $res->getSaveName()]]);
        }
        return json(['code' => 0, 'msg' => $file->getError(), 'data' => ['src' => '']]);
    }

此时 前端文件上传功能已实现 文件上传后 可返回Excel文件的路径

根据路径和php扩展PHPEXCEL中的方法 解析Excel文件内容并将数据插入数据库表中


将上传后的文件路径传到后端

				// 得到上传后的文件路径
                    $.ajax({
                        url: 'insertDataByExcel',
                        data: {
                            file: res.data.file
                        },
                        type: 'post',
                        dataType: 'json',
                        success: function (data) {
                            layer.close(loading_frame);
                            if (data.code === "0000") {
                                layer.msg(data.msg);
                                tableIns.reload();
                            } else {
                                layer.msg(data.msg);
                                console.log(data.details);
                            }
                        }
                    })

php得到前端传的 文件路径 解析文件 并将数据插入数据库


前端Ajax调用的接口   解析Excel数据并插入数据表

public function insertDataByExcel()
    {
        if ($this->request->isAjax()){
            $file = input('post.file');
            $file = substr($file, 1);
            //  解析Excel表中数据返回数组
            $data = read_excel($file,0);

            //  开启事务控制
            Db::startTrans();

            try {

                foreach ($data as $key => &$value){
                    if ($key>1&&!empty($value['B'])){
                        $addtime = date("Y-m-d H:i:s");
                        $sql = "insert into mw_insurence_import values(null,'{$value['A']}','{$value['F']}','{$value['B']}','{$value['C']}','{$value['G']}','{$value['H']}','{$value['E']}','{$value['D']}',0,null,null,'{$addtime}',null,'{$value['I']}')";
                        Db::query($sql);
                    }
                }

                Db::commit();  // 提交事务
                unlink($file);   //  导入成功后将 文件删除......
                return json(['code' => '0000', 'msg' => '导入成功']);

            } catch (\Exception $exception) {
                //  回滚事务
                Db::rollback();
                return json(['code' => '1001', 'msg' => '导入失败,请重新导入', 'details' => $exception->getTraceAsString()]);
            }
        }

    }



重点方法!!!  扩展中的 read_excel()方法
需 引用了 PHPEXCEL扩展

function read_excel($file,$sheet,$time_colun=""){
    require_once '../extend/PHPExcel.php';
    $objRead = new \PHPExcel_Reader_Excel2007();   //建立reader对象
    if(!$objRead->canRead($file)){
        $objRead = new \PHPExcel_Reader_Excel5();
        if(!$objRead->canRead($file)){
            die('No Excel!');
        }
    }

    $cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');

    $obj = $objRead->load($file);  //建立excel对象
    $currSheet = $obj->getSheet($sheet);   //获取指定的sheet表
    $columnH = $currSheet->getHighestColumn();   //取得最大的列号
    $columnCnt = array_search($columnH, $cellName);
    $rowCnt = $currSheet->getHighestRow();   //获取总行数

    $data = array();
    for($_row=1; $_row<=$rowCnt; $_row++){  //读取内容
        for($_column=0; $_column<=$columnCnt; $_column++){
            $cellId = $cellName[$_column].$_row;
            $cellValue = $currSheet->getCell($cellId)->getValue();
            if($time_colun && $cellName[$_column] == $time_colun && $_row>1){
                //$cellValue = gmdate("Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP($cellValue));
                $cellValue = gmdate("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($cellValue));
            }else{
                $cellValue = $currSheet->getCell($cellId)->getCalculatedValue();  #获取公式计算的值
                if($cellValue instanceof \PHPExcel_RichText){   //富文本转换字符串
                    $cellValue = $cellValue->__toString();
                }
            }


            $data[$_row][$cellName[$_column]] = $cellValue;
        }
    }
    return $data;
}

此时 Excel表的对应字段插入到数据表中 并且上传的Excel已删除…(用完就删 典型渣男)

2.导出功能

导出功能 数据表格数据导出为Excel文件

还是原来的数据表格
列表页面

  1. 导出按钮的代码
<a onclick="exportExcel()" class="layui-btn layui-btn-primary layui-btn-sm layui-icon layui-icon-export"
       title="按条件导出">&nbsp;按条件导出</a>

2.导出按钮JS

function exportExcel() {
        var q = getSearchData(), qstr = 'q=1';
        for (let key in q) {
            qstr += '&' + key + '=' + q[key];
        }
        //console.log(qstr);return;
        //  此地址是 php后台的导出接口  导出接口也是用了PHPEXCEL扩展
        window.location.href = "/admin.php/system/Info/exportInsuranceSer?" + qstr;
    }

	//  此方法是   得到上面的筛选条件  因为是根据条件导出   需得到上面选中的筛选条件
    function getSearchData() {
        var SearchData = '{';
        for (var i = 0; i < $("#search-area input").length; i++) {
            if ($("#search-area input")[i].type != 'submit' && $("#search-area input")[i].type != 'button' && $("#search-area input")[i].id) {
                SearchData += ',' + $("#search-area input")[i].id + ':' + '"' + $('#' + $("#search-area input")[i].id).val() + '"';
            }
        }
        for (var j = 0; j < $("#search-area select").length; j++) {
            if ($("#search-area select")[j].type != 'submit' && $("#search-area select")[j].type != 'button') {
                if ($('#' + $("#search-area select")[j].id).val() != null) {
                    SearchData += ',' + $("#search-area select")[j].id + ':' + '"' + $('#' + $("#search-area select")[j].id).val() + '"';
                }
            }
        }
        SearchData = SearchData.substr(2);
        SearchData = eval('({' + SearchData + '})');
        return SearchData;
    }

筛选条件表单代码 用于选中筛选条件 可以筛选导出数据

<form action="" class="layui-form">
    <div class="layui-row layui-col-space15">
        <div class="layui-collapse layui-collapse-self" lay-accordion="">
            <div class="layui-colla-item">
                <!--<div class="layui-form">-->
                <div class="layui-colla-content layui-show" id="search-area">
                    <div class="layui-inline">
                        <label class="layui-form-label">车牌号</label>
                        <div class="layui-input-inline">
                            <input type="text" name="plate_number" id="plate_number" autocomplete="off"
                                   placeholder="请输入车牌号"
                                   class="layui-input">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <label class="layui-form-label">激活状态</label>
                        <div class="layui-input-inline">
                            <!-- 0初始    1已激活 -->
                            <select name="status" id="status">
                                <option value="">全部</option>
                                <option value="0">未激活</option>
                                <option value="1">已激活</option>
                            </select>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <label class="layui-form-label">激活时间</label>
                        <div class="layui-input-inline" style="width: 280px;">
                            <input type="text" name="active_time" id="active_time" autocomplete="off"
                                   class="layui-input"
                                   placeholder="请选择时间范围">
                        </div>
                    </div>

                    <button class="layui-btn layui-btn-normal layui-btn-sm layui-icon layui-icon-search"
                            id="doSearch">搜索
                    </button>
                    <button type="reset" class="layui-btn layui-btn-warm layui-btn-sm layui-icon layui-icon-refresh">重置
                    </button>
                </div>
            </div>
        </div>
    </div>
</form>

 window.location.href = "/admin.php/system/Info/exportInsuranceSer?" + qstr;

php后台的接口 exportInsuranceSer()

public function exportInsuranceSer()
    {
        $params = $this->request->param();
        $where = [];

        if (isset($params['plate_number']) && $params['plate_number'] && $params['plate_number'] != '') {
            $where[] = ['ii.plate_number', 'like', "%{$params['plate_number']}%"];
        }
        if (isset($params['status']) && $params['status'] != '') {
            $where[] = ['ii.status', 'eq', $params['status']];
        }
        if (isset($params['active_time']) && $params['active_time'] && $params['active_time'] != '') {
            $tstr = explode(' - ', $params['active_time']);
            $stime = isset($tstr[0]) ? trim($tstr[0]) : '';
            $etime = isset($tstr[1]) ? trim($tstr[1]) : '';
            $where[] = ['ii.active_time', 'between time', [$stime, $etime]];
        }

        $data = Db::table('mw_insurence_import')->alias('ii')
            ->leftJoin('coupon_type ct','ct.id=ii.coupon_type')
            ->where($where)->order('addtime', 'desc')
            ->field('ii.*,ct.title as coupon_title')->select();
        foreach ($data as &$value) {
            if ($value['status']==1){
                $value['status'] = '已激活';
            }else{
                $value['status'] = '未激活';
            }
        }

        $header = array('渠道代码', '车牌号', '车架号', '卡券类型', '发送数量','电话','姓名','是否激活','激活时间','激活成功后回填卡号','评价');
        $index = array('channel', 'plate_number', 'vin', 'coupon_title', 'send_num','phone','realname','status','active_time','card_no','remark');

        createtable($data, 'Excel表' . time(), $header, $index);
    }


用到的PHPEXCEL扩展方法    ceratetable($list,$filename,$header=array(),$index = array());

/**
 * 创建(导出)Excel数据表格
 * @param  array   $list 要导出的数组格式的数据
 * @param  string  $filename 导出的Excel表格数据表的文件名
 * @param  array   $header Excel表格的表头
 * @param  array   $index $list数组中与Excel表格表头$header中每个项目对应的字段的名字(key值)
 * 比如: $header = array('编号','姓名','性别','年龄');
 *       $index = array('id','username','sex','age');
 *       $list = array(array('id'=>1,'username'=>'YQJ','sex'=>'男','age'=>24));
 * @return [array] [数组]
 */
function createtable($list,$filename,$header=array(),$index = array()){
    header("Content-type:application/vnd.ms-excel");
    header("Content-Disposition:filename=".$filename.".xls");
    $teble_header = implode("\t",$header);
    $strexport = $teble_header."\r";
    foreach ($list as $row){
        foreach($index as $val){
            $strexport.=$row[$val]."\t";
        }
        $strexport.="\r";

    }
    $strexport=iconv('UTF-8',"GB2312//IGNORE",$strexport);
    exit($strexport);
}

这样 点击导出后就可以导出下载一个Excel文件啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值