laravel excel 导出导入
2018-03-28 本文已影响0人
敲代码的小仙女
一、扩展包安装
"maatwebsite/excel": "~2.1.0"
加入composer.json
中的require
中,执行composer update
。
二、导出
1. 直接导出
public function excelExport(Request $request)
{
//获取数据
$report = Xzcase::all();
Excel::create('excel导出',function($excel) use ($report){
$excel->sheet('score',function ($sheet) use ($report){
$sheet->appendRow(['案件编号','文书字号']);
//处理数据
foreach ($report as $key){
$sheet->appendRow([
$key->case_code,
$key->number,
]);
}
//定义单元格宽度
$sheet->setWidth(array(
'A' => 10,
'B' => 10,
));
//定义字体大小
$sheet->setFontSize(10);
//定义字体加粗
$sheet->setFontBold(true);
});
})->export('xlsx');
}
2. view导出
1)在excel导出部分进行修改:
Excel::create('excel导出', function ($excel) use ($data) {
$excel->sheet('score', function ($sheet) use ($data) {
//使用with()将数据传到指定的页面中
$sheet->loadView('admin/table/case_quality')->with('data', $data);
$sheet->setFontSize(10);
});
})->export('xlsx');
2)在view中就是根据html进行表格的编写就行,注意两点
-
a. 设置单元格宽高时,不要加上px单位,会报错或者导出空的报表。
-
b. 在html中,如果第一行合并了列的单元格,在第二行是不需要在写<td></td>的,但是excel导出时是需要加上的。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.td{
border: 1px solid #000000;
width: 10;
height: 30;
}
.td-m{
border: 1px solid #000000;
width: 15;
height: 30;
}
.td-h{
width: 13;
height: 30;
border: 1px solid #000000;
}
</style>
</head>
<body>
<table>
<tr>
<td valign="middle" colspan="16" align="center" style="height: 40;">
<span><h1>{{$day}}每日法制汇报表</h1></span>
</td>
</tr>
<tr>
<td class="td-h" valign="middle" colspan="13" align="center"><b>强制措施</b></td>
<td class="td-h" valign="middle" colspan="3" align="center"><b> 移送起诉</b></td>
</tr>
<tr>
<td class="td-h" valign="middle" colspan="4" align="center"><b>强制措施合计</b></td>
<td class="td-h" valign="middle" colspan="4" align="center"><b>侵财</b></td>
<td class="td-h" valign="middle" colspan="5" align="center"><b>涉黑涉恶</b></td>
<td class="td-h" valign="middle" rowspan="2" align="center"><b>移送起诉合计</b></td>
<td class="td-h" valign="middle" rowspan="2" align="center"><b>侵财</b></td>
<td class="td-h" valign="middle" rowspan="2" align="center"><b>涉黑涉恶</b></td>
</tr>
<tr>
<td class="td-h" valign="middle" align="center" ><b>刑拘</b></td>
<td class="td-h" valign="middle" align="center" ><b>取保</b></td>
<td class="td-h" valign="middle" align="center" ><b>监居</b></td>
<td class="td-h" valign="middle" align="center" ><b>总数</b></td>
<td class="td-h" valign="middle" align="center" ><b>刑拘</b></td>
<td class="td-h" valign="middle" align="center" ><b>取保</b></td>
<td class="td-h" valign="middle" align="center" ><b>监居</b></td>
<td class="td-h" valign="middle" align="center" ><b>总数</b></td>
<td class="td-h" valign="middle" align="center" ><b>刑拘</b></td>
<td class="td-h" valign="middle" align="center" ><b>取保</b></td>
<td class="td-h" valign="middle" align="center" ><b>监居</b></td>
<td class="td-h" valign="middle" align="center" ><b>总数</b></td>
<td class="td-h" valign="middle" align="center" ><b>逮捕后增加</b></td>
</tr>
<tr>
@for($i=0;$i<=15;$i++)
<td class="td-h" valign="middle" align="center"><b>{{$res[$i]}}</b></td>
@endfor
</tr>
</table>
</body>
</html>
3.导入
1)保存excel到storage中
public function upload_data(Request $request) {
$file = $request->file('excel');
// 文件是否上传成功
if (!$file->isValid()) {
return $this->show(2, "上传失败");
}
// 获取文件相关信息
$ext = $file->getClientOriginalExtension(); // 扩展名
//文件格式
$fileTypes = ['xls', 'xlsx'];
$isInFileType = in_array($ext, $fileTypes);
//文件格式是否成功
if (!$isInFileType) {
return $this->show(2, "上传文件格式不正确");
}
// 上传文件
$filename = date('Ymd') . uniqid() . '.' . $ext;
//路径
$path = $request->file('excel')->storeAs('excel', $filename);
return $this->show(1, $path);
}
2)读取excel数据
private function load_excel($filename) {
$filePath = 'storage/app/' . $filename;
$reader = Excel::load($filePath);//要开始导入文件,可以使用->load($filename)。回调是可选的。
$reader = $reader->getSheet(0);//得到Excel的第一页内容
return $reader->toArray();
}
3)导入数据
public function excelImport(Request $request) {
session()->forget('error');
$rlt = $this->upload_data($request);//调用上面的方法,上传文件得到文件名
if ($rlt["status"] != 1) {
return redirect('index')->with('err', $rlt['message']);
} else {
try {
$data = [];
$error = [];
$err_count = 0;
$success_count = 0;
$table = $this->load_excel($rlt["message"]);//调用load_excel方法导入文件
if ($table[0][0] == "案件编号" && $table[0][1] == "文书字号" ) {//Excel第一行
$title = [
0 => '案件编号',
1 => '文书字号',
];
array_unshift($error, $title);//将标题插入失败数据的第一行,后面导出
foreach ($table as $v) {
try {
if ($v[0] == "案件编号" && $v[1] == "文书字号" ) {
continue;
}
if ($v[0] == "" && $v[1] == "" ) {
} else {
$row["case_code"] = trim($v[0]);
$row["number"] = trim($v[1]);
array_push($data, $row);
}
} catch (\Exception $e) {
$err_count++;
array_push($error, $v);//失败数据存起来后面将把失败数据导出
Log::info($e);
continue;
}
}
//插入
foreach ($data as $k => $d) {
if (!$d) continue;
try {
$insert_id = new Xzcase();
$insert_id->case_code = $d['case_code'];
$insert_id->number = $d['number'];
$insert_id->save();
$success_count++;
//一些数据库操作
} catch (\Exception $e) {
$err_count++;
array_push($error, $d);//失败数据存起来后面将把失败数据导出
Log::info($e);
continue;
}
}
if ($error) {
session(['error' => $error]);//将要导出的内容存入session 键值为error
$download = true;//向前台返回一个标识,true说明有失败数据
} else {
$download = false;
}
Storage::delete($rlt["message"]);
return redirect('xzcase-index')->with('mess', "本次共导入 " . ($success_count + $err_count) . " 条数据 , 其中失败 " . $err_count . "条 。 ", $download);
} else {
Storage::delete($rlt["message"]);
return redirect('xzcase-index')->with('err', "数据格式错误");
}
} catch (\Exception $e) {
Log::info($e);
Storage::delete($rlt["message"]);
return redirect('xzcase-index')->with('err', "数据导入失败");
}
}
}
4)导出导入失败的数据
public function errorExport() {
$data = session('error');
if (empty($data)) {
return redirect('index')->with('mess', '没有错误数据');
}
$cellData = [];
foreach ($data as $k => $v) {
if ($k == 0) {
array_push($cellData, $v);
} else {
$res = [];
if (!empty($v['case_code'])) {
$res[] = $v['case_code'];
$res[] = $v['number'];
}else{
$res[] = $v[0];
$res[] = $v[1];
}
array_push($cellData, $res);
}
}
Excel::create('导入失败信息汇总', function ($excel) use ($cellData) {
$excel->sheet('score', function ($sheet) use ($cellData) {
$sheet->rows($cellData);
});
})->export('xls');
}
更多参数和操作方法请看官网!!