前端导入Excel将对应字段插入数据库表中
用到
1. tp5.1 开发
2. php的扩展 PHPEXCEL
3. layui 的文件上传(前端)
先制作出前端显示的列表页面 用到layui的数据表格制作出需要的列表页面
导入功能
- 导入按钮的代码
<a onclick="importExcel()" class="layui-btn layui-btn-primary layui-btn-sm layui-icon layui-icon-upload"
title="导入Excel"> 导入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文件
还是原来的数据表格
- 导出按钮的代码
<a onclick="exportExcel()" class="layui-btn layui-btn-primary layui-btn-sm layui-icon layui-icon-export"
title="按条件导出"> 按条件导出</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文件啦