Springboot 文件处理导入导出
简单记录下使用Springboot进行文件与后端交互、excel前台导出等内容这里用到了:elelemt-ui\HTML\vue\Springboot框架一、后台导入HTML:<el-button-group><el-button @click="importExcel()" size="small" type = "primary">导入</el-button>
·
简单记录下使用Springboot进行文件与后端交互、excel前台导出等内容
这里用到了:elelemt-ui\HTML\vue\Springboot框架
一、后台导入
HTML:
<el-button-group>
<el-button @click="importExcel()" size="small" type = "primary">导入</el-button>
<el-button @click="exportExcel()" size="small">导出</el-button>
</el-button-group>
Javascript:响应importExcel弹窗,文件选择,遍历发送给后端
importExcel: function () {
this.upload();
this.handleFile();
},
upload: function () {
var inputObj = document.createElement('input');
inputObj.setAttribute('id', 'file');
inputObj.setAttribute('type', 'file');
inputObj.setAttribute('name', 'file');
inputObj.setAttribute("style", 'visibility:hidden');
document.body.appendChild(inputObj);
inputObj.value;
inputObj.click();
console.log(inputObj);
},
//处理文件
handleFile: function () {
document.querySelector('#file').addEventListener('change', function (e) {
for (let entry of e.target.files) {
//处理files
var fd = new FormData();
fd.append('file', entry);
fd.append('type', dotType+'dot_Detail');
fd.append('params', JSON.stringify({master_id:dotId,type:dotType}));
$.ajax({
url: "url", //请求的url地址
dataType: "json", //返回格式为json
async: false,//请求是否异步,默认为异步,这也是ajax重要特性
data: fd, //参数值
type: "POST", //请求方式
contentType: false,// 不设置Content-Type请求头
processData: false,// 不处理发送的数据
success: function (res) {
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
}
});
}
})
},
Java:接收前端FormData()中包含的file\type\params字段,利用file在业务中使用POI或者Easy这样的做导入功能开发
@Autowired
ExcelServiceImpl excelService;
@RequestMapping("/read")
@ResponseBody
public ResposeObject read(@RequestParam MultipartFile file, String type, String params) {
Map<String,Object> paramMap = JSONObject.parseObject(params,Map.class);
try {
if (file != null) {
InputStream ins = file.getInputStream();
excelService.read(ins,type,paramMap);
}
} catch (Exception e) {
e.printStackTrace();
}
return ResposeHelper.ok("ok");
}
二、前台导入
HTML:
<a v-on:click="importExcel()" href="javascript:void(0);" >
从excel导入...
</a>
Javascript:
data: function () {
return {
dataList: [
{
addr: '',
code: '',
start: '',
length: '',
crc: '',
rate: '',
state: ''
}
],
}
}
mothods:{
importExcel: function () {
this.upload();
this.handleFile();
},
upload: function () {
var inputObj = document.createElement('input');
inputObj.setAttribute('id', 'file');
inputObj.setAttribute('type', 'file');
inputObj.setAttribute('name', 'file');
inputObj.setAttribute("style", 'visibility:hidden');
document.body.appendChild(inputObj);
inputObj.value;
inputObj.click();
console.log(inputObj);
inputObj.value = '';
},
//处理文件
handleFile: function () {
document.querySelector('#file').addEventListener('change', function (e) {
for(let entry of e.target.files){
readFile(entry);
}
})
},
}
<script type="text/javascript">
//循环读取文件触发parseXlsxObject方法操作业务
function readFile(file) {
var name = file.name;
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
var wb = XLSX.read(data, {type: "binary"});
parseXlsxObject(wb);
};
reader.readAsBinaryString(file);
}
//实现导入到前端的List变量
function parseXlsxObject(wb) {
var sheet = wb.Sheets.Sheet1;
var json = XLSX.utils.sheet_to_json(sheet);
json.forEach(function (value) {
var item = {
addr: value['地址位'],
code: value['模式'],
start: value['起始地址'],
length: value['长度'],
crc: value['crc校检'],
rate: value['频率'],
state: value['启用状态']
}
this.dataList.push(item);
});
/* 读取方式有很多种,这里推荐用xls.js上面官方的sheet_to_json方法
console.log(json)
var obj = {
addr: '',
code: '',
start: '',
length: '',
crc: '',
rate: '',
state: ''
};
for (var i = 2; ; i < i++) {
var row = "";
eval("row = sheet.A" + i);
if (row == null || row == undefined) {
break;
}
var command = JSON.parse(JSON.stringify(obj));
eval("command.addr=sheet.A" + i + ".w");
eval("command.code=sheet.B" + i + ".w");
eval("command.start=sheet.C" + i + ".w");
eval("command.length=sheet.D" + i + ".w");
eval("command.crc=sheet.E" + i + ".w");
eval("command.rate=sheet.F" + i + ".w");
eval("command.state=sheet.G" + i + ".w");
}
console.log(this.dataList);
*/
}
</script>
三、前台导出
HTML:
<a v-on:click="exportExcel()" href="javascript:void(0);" >
导出到excel...
</a>
Javascript:响应导出按钮,将list通过xls的方法aoa_to_sheet导出为excel文档
exportExcel: function () {
var settingsArray = [['地址位','模式','起始地址','长度','crc校检','频率','启用状态']];
this.dataList.forEach(function (row) {
var settingArr = [row.addr,row.code,row.start,row.length,row.crc,row.rate,row.state];
settingsArray.push(settingArr);
});
var sheet = XLSX.utils.aoa_to_sheet(settingsArray);
openDownloadDialog(sheet2blob(sheet), '导出.xlsx');
},
<script>
/**
* 通用的打开下载对话框方法,没有测试过具体兼容性
* @param url 下载地址,也可以是一个blob对象,必选
* @param saveName 保存文件名,可选
*/
function openDownloadDialog(url, saveName)
{
if(typeof url == 'object' && url instanceof Blob)
{
url = URL.createObjectURL(url); // 创建blob地址
}
var aLink = document.createElement('a');
aLink.href = url;
aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
var event;
if(window.MouseEvent) event = new MouseEvent('click');
else
{
event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
}
aLink.dispatchEvent(event);
}
// 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
function sheet2blob(sheet, sheetName) {
sheetName = sheetName || 'Sheet1';
var workbook = {
SheetNames: [sheetName],
Sheets: {}
};
workbook.Sheets[sheetName] = sheet;
// 生成excel的配置项
var wopts = {
bookType: 'xlsx', // 要生成的文件类型
bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type: 'binary'
};
var wbout = XLSX.write(workbook, wopts);
var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
// 字符串转ArrayBuffer
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
return blob;
}
</script>
总结:本篇主要记录了
(1)前端上传文件给后端multipart格式的方法
(2)前端利用xls.js从excel文档导入数据到json数组变量的方法
(3)前端利用xls.js将json数组导出到excel文档下载的方法
上述代码可以优化,暂时贴成这样,以后有这样的需求可以快速cv使用。
后续有时间可以多熟悉xls.js,Apache的POI和阿里巴巴的EasyExcel,都是相关的内容
最后再贴一个用EasyExcel后台将后台生成的List数据导出的方法,可以用
window.location.href= [后台导出的地址] 这种方式进行后端导出,注意设置response的格式
try (ServletOutputStream out = response.getOutputStream()) {
//这三行不可缺,否则会被前端解析成乱码数据,而不是文件
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(sheetName, "UTF-8")
+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx");
RowModel rowModel = excelService.getExcelModel(type);
List<Map<String,Object>> list = rowModel.exportData(paramsMap);
List rowModelList = JSONObject.parseArray(JSONObject.toJSONString(list),rowModel.getClass())
ExcelWriter writer = EasyExcelFactory.getWriter(out);
WriteSheet ws = new WriteSheet();
ws.setSheetName(sheetName);
ws.setClazz(rowModel.getClass());
writer.write(rowModelList, ws);
writer.finish();
out.flush();
} catch (IOException e) {
throw new RuntimeException();
}
更多推荐
已为社区贡献1条内容
所有评论(0)