tp6 接收excel文件,并解析成数组入库,多sheet读取,自动进行字符编码转换
客户端
这里用的是layui,这个与服务端的解析数据无关系的
<div class="layui-fluid">
<div class="layui-row layui-col-space15" id="app">
<div class="layui-col-md12" v-cloak="">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-form-item">
<div class="layui-form-item parent-menu">
注意事项:<label for="" class="label-danger">数据无价,谨慎操作</label><br>
<ul>
<li>1、请严格遵守示例模板格式(97-2003 工作簿),即 .xls 扩展名。</li>
<li>2、请耐心等到后台处理结果,如果长时间未响应,请联系管理员进行排查。</li>
<li>3、数据表中严禁出现制表符、换行符等特殊符号。</li>
<li>4、导入程序具有一定的容错能力,但仍请规范数据。</li>
<li>5、继续上传,即表示您已充分了解其风险,并为其负责。</li>
<li>6、选择文件后,程序将自动上传至服务器,并进行解析。</li>
</ul>
<input class="layui-upload-file" type="file" accept="undefined" name="file">
</div>
</div>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-danger" id="seleceFile">
<i class="layui-icon"></i>选择文档
</button>
<a href="{__PUBLIC_PATH}uploads/routine/template/orders_template.xls" download="订单示例模板">
<button type="button" class="layui-btn layui-btn-normal">查看示例</button></a>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="{__ADMIN_PATH}js/layuiList.js"></script>
<script type="application/javascript">
layui.use(['jquery', 'layer', 'upload'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var upload = layui.upload;
//文件上传
upload.render({
elem: '#seleceFile'
, url: 'import_upload'//上传接口
, accept: 'file'
, acceptMime: ""
, auto: true
, multiple: true
, bindAction: '#importBtn'
, data: { }
, done: function (res) {
//上传完毕回调
if (res.code == 0) {
layer.msg(res.msg);
layer.closeAll();
} else {
//其它异常code弹信息
layer.msg(res.msg);
}
}
, error: function () {
//请求异常回调
},
complete:function () {
//结束的回调
}
})
});
</script>
服务端
/** 提交位置 */
public function import_upload()
{
$fileArr = request()->file('file'); //接收文件
$file = $_FILES['file']; //得到传输的数据
$type = $file["type"]; //获得图片的类型
// $rdate = date("Ymd", time()); //获得时间
/**
* 判断接收文件是否为空
*/
if ($fileArr == null) {
return $this->failed('不被允许的请求');
}
/**
* 截取上传文件名后缀
* 将文件名以.分割为数组
* 用PHP end函数取数组最后一个
* 即可得到上传文件后缀 $temp = explode(".", $_FILES["file"]["name"]);
* 判断上传文件是否合法
* 判断截取上传文件名是否为
*/
$temp = explode(".", $file["name"]);
$extension = end($temp);
/* 这里限定版本 */
if (in_array($extension, array("xlsx"))) {
return $this->failed('不被允许的版本');
}
/* 这里限定文档 */
if (!in_array($extension, array("xls"))) {
return $this->failed('不被允许的文档');
}
/**
* 调用disk方法
* 此时根目录为/public/storage 系统默认路径
* 再把文件移动至uploads下的img文件夹里
* 文件名用data
*/
$saveName = \think\facade\Filesystem::disk('public')->putFile("document", $fileArr, 'data');
//$data["name"] = $file["name"];
$result = self::analysisExcel(str_replace(['\\'], '/', $saveName));//这里返回的是多维数组
$result = self::analysisData($result);
return $result ? (Json::successful('导入成功!')) : (Json::failed('导入失败!'));
}
public function analysisExcel($path)
{
$datas = [];
$colus = ['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'];
//存储的位置
$file = public_path() . '/public/uploads/' . $path;
$objPHPExcel = \PHPExcel_IOFactory::load($file);
//获取表名,一维数组,值是表名。如:array('sheet1', 'sheet2', 'sheet3')
$nameArr = $objPHPExcel->getsheetnames();
//获取表的数量
$sheetCount = $objPHPExcel->getSheetCount();
//循环读取每一张表
for ($index = 0; $index < $sheetCount; $index++) {
//设置当前要读取的表
$objPHPExcel->setActiveSheetIndex($index);
$sheet = $objPHPExcel->getSheet($index); //excel中的第一张sheet
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
$lastColumn = array_search($highestColumn, $colus); // 取得总列数
$data = [];
//这里的$i 决定从哪一行开始读取,我这里是从第二行开始,即索引为1
for ($i = 1; $i < $highestRow; $i++) {
$row = [];
for ($c = 0; $c <= $lastColumn; $c++) {
//读取单元格数据,暂存到表中//暂存需要保存到数据库中的数据
$row[] = mb_convert_encoding(str_replace('-','/',$objPHPExcel->getActiveSheet()->getCell($colus[$c] . ($i+1))->getValue()),'UTF-8');//这里进行了转编码操作
}
$data[] = $row;
}
$datas[] = $data;
}
//getCell的参数示例,读取A1单元格的内容
// echo $objPHPExcel->getActiveSheet()->getCell('A1')->getValue();
return json_decode(json_encode($datas),true);//可以直接用下一行代码替代
//return $datas;
}
public function analysisData($data){
//$data 表格中的全部sheet数据,$sheet一个sheet的数据集
foreach ($data as $sheet){
//$sheet表格中的一个sheet,$row一行数据
foreach ($sheet as $row){
file_put_contents('log.log',json_encode($row)."\n",8);//输出到文档查看
//这里做你想要做的事情,这里拿到的是sheet的二维数组之中的一行数据
}
}
return bool;//依据你的业务
}