安装PhpOffile
composer require phpoffice/phpspreadsheet
导出excel文件到本地
public function output(){
$model = new GraveModel();
$data = $model->field('id,sn,open_name,mobile,status,dead_name1,dead_name2,type,temp_id')->all();
$newData = [];
foreach ($data as $key=>$val){
$newData[] = [
'id' => $val['id'],
'sn' => $val['sn'],
'type' => $val['type'] == 1 ? '单墓' : '双墓',
'open_name' => $val['open_name'],
'mobile' => $val['mobile'],
'dead_name' => $val['dead_name1'].' '.$val['dead_name2'],
'status' => $val['status'] == 1 ? '已领取' : '未领取'
];
}
$title = ['id','墓穴编号','类型','墓穴开通者','手机号码','亡者姓名','状态'];
$filename = '墓穴数据';
FileProcess::downFile($title,$newData,$filename);
}
导入Excel数据到数据库
public function import(){
$file = $this->request->file('myFile');
$info = $file->move('./upload/xsl');
if(!$info){
$this->error($file->getError());
}
$fileurl = WEB_ROOT.'upload/xsl/'.$info->getSaveName();
$data = FileProcess::toArray($fileurl);
$snArr = [];
$dataArr = [];
foreach ($data as $key=>$val){
$snArr[] = $val[0];
$dataArr[] = [
'sn' => $val[0],
'dead_name1' => $val[1]
];
}
$res = GraveModel::where('sn','in',$snArr)->find();
if($res){
$this->error('有重复的编号,不可导入');
}
$res = GraveModel::insertAll($dataArr);
if(!$res){
$this->error('导入失败');
}
$this->success('导入成功');
}
FileProcess 类
<?php
namespace app\portal\service;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class FileProcess
{
public static function toArray($filePath)
{
$spreadsheet = IOFactory::load($filePath);
$worksheet = $spreadsheet->getActiveSheet();
$highestRow = $worksheet->getHighestRow();
$highestColumn = $worksheet->getHighestColumn();
$highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);
$data = [];
for ($row = 2; $row <= $highestRow; ++$row) {
$row_data = [];
for ($column = 1; $column <= $highestColumnIndex; $column++) {
$row_data[] = $worksheet->getCellByColumnAndRow($column, $row)->getValue();
}
$data[] = $row_data;
}
return $data;
}
public static function toFile($title, $data, $fileName, $options = [])
{
if (isset($options['fileType']) && !in_array($options['fileType'], ['xls', 'xlsx', 'ods', 'csv', 'html', 'tcpdf', 'dompdf', 'mpdf'])) {
return false;
}
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
$worksheet->setTitle($fileName);
foreach ($title as $key => $value) {
$worksheet->setCellValueByColumnAndRow($key + 1, 1, $value);
}
$row = 2;
foreach ($data as $item) {
$column = 1;
foreach ($item as $value) {
$worksheet->setCellValueByColumnAndRow($column, $row, $value);
$column++;
}
$row++;
}
if (!isset($options['fileType'])) {
$fileName = $fileName . '.xls';
} else {
$fileName = $fileName . '.' . $options['fileType'];
}
if (!isset($options['savePath'])) {
} else {
$savePath = $options['savePath'] . $fileName;
}
$writerType = ucfirst($options['fileType']);
$writer = IOFactory::createWriter($spreadsheet, $writerType);
$writer->save($savePath);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
ob_end_flush();
return true;
}
public static function downFile($title,$data,$filename){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle($filename);
$sheet->getDefaultColumnDimension()->setWidth(18);
$sheet->getDefaultRowDimension()->setRowHeight(25);
foreach($title as $key => $value){
$sheet->setCellValueByColumnAndRow($key + 1, 1, $value);
}
$row = 2;
foreach ($data as $item) {
$column = 1;
foreach ($item as $value) {
$sheet->setCellValueByColumnAndRow($column, $row, $value);
$column++;
}
$row++;
}
$fileType = 'Xlsx';
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.$filename.'.'.$fileType.'');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
}
public static function toSql($tableName, $filed, $filePath)
{
$params = self::toArray($filePath);
}
}
前端文件
<input type="file" id="xslFile" style="display:none">
<button type="button" class="btn btn-info btn-sm" onclick="F_Open_dialog()">导入</button>
<script>
function F_Open_dialog()
{
document.getElementById("xslFile").click();
}
$(function(){
$('#xslFile').change(function(res){
var formData = new FormData();
formData.append('myFile', $('#xslFile')[0].files[0]);
$.ajax({
url:"{:url('import')}",
type:"POST",
data:formData,
processData: false,
contentType: false,
success:function(res){
if(res.code == 1){
noty({
text: "导入成功",
type: 'success',
layout: 'center',
callback: {
afterClose: function () {
reloadPage(window);
}
}
});
}else{
noty({
text: res.msg,
type: 'error',
layout: 'center',
callback: {
afterClose: function () {
reloadPage(window);
}
}
});
}
},
fail:function(res){
noty({
text: '导入失败',
type: 'error',
layout: 'center',
callback: {
afterClose: function () {
reloadPage(window);
}
}
});
}
});
})
})
</script>
<a class="btn btn-default btn-sm " href="{:url('output')}" data-subcheck="true">导出
</a>