java、springboot?接口導(dǎo)出txt方式
java、springboot 接口導(dǎo)出txt
就寫(xiě)兩個(gè)方法
@Log
@ApiOperation(value = "導(dǎo)出單碼/箱碼",produces = "application/octet-stream")
@GetMapping(value = "/export")
public void exportExcel(TraceBatchPageQuery page HttpServletResponse response){
Page<TraceBatchDto> pages = traceBatchService.pageByParam(page);
if (page.getRecords().size()==0)
throw new BusinessException("數(shù)據(jù)為空");
for(TraceBatchDto dto:pages.getRecords()){
if (type==0)
text.append(dto.getQuantity());
else
text.append(dto.getPackQuantity());
text.append("\r\n");//換行字符
}
//導(dǎo)出的文件存儲(chǔ)目錄
ExportUtil.exportTxt(response,text.toString());
}
/* 導(dǎo)出txt文件
* @author
* @param response
* @param text 導(dǎo)出的字符串
* @return
*/
public static void exportTxt(HttpServletResponse response, String text,String name){
response.setCharacterEncoding("utf-8");
//設(shè)置響應(yīng)的內(nèi)容類(lèi)型
response.setContentType("text/plain");
//設(shè)置文件的名稱(chēng)和格式
response.addHeader("Content-Disposition","attachment;filename="
+ "data.txt");
BufferedOutputStream buff = null;
ServletOutputStream outStr = null;
try {
outStr = response.getOutputStream();
buff = new BufferedOutputStream(outStr);
buff.write(text.getBytes("UTF-8"));
buff.flush();
buff.close();
} catch (Exception e) {
//LOGGER.error("導(dǎo)出文件文件出錯(cuò):{}",e);
} finally {try {
buff.close();
outStr.close();
} catch (Exception e) {
//LOGGER.error("關(guān)閉流對(duì)象出錯(cuò) e:{}",e);
}
}
}
Springboot 文件處理導(dǎo)入導(dǎo)出
簡(jiǎn)單記錄下使用Springboot進(jìn)行文件與后端交互、excel前臺(tái)導(dǎo)出等內(nèi)容
這里用到了:elelemt-ui\HTML\vue\Springboot框架
后臺(tái)導(dǎo)入
HTML:
? ? ? ? <el-button-group> ? ? ? ? ? ? <el-button @click="importExcel()" size="small" type = "primary">導(dǎo)入</el-button> ? ? ? ? ? ? <el-button @click="exportExcel()" size="small">導(dǎo)出</el-button> ? ? ? ? </el-button-group>
Javascript:響應(yīng)importExcel彈窗,文件選擇,遍歷發(fā)送給后端
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", //請(qǐng)求的url地址
dataType: "json", //返回格式為json
async: false,//請(qǐng)求是否異步,默認(rèn)為異步,這也是ajax重要特性
data: fd, //參數(shù)值
type: "POST", //請(qǐng)求方式
contentType: false,// 不設(shè)置Content-Type請(qǐng)求頭
processData: false,// 不處理發(fā)送的數(shù)據(jù)
success: function (res) {
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
}
});
}
})
},Java:接收前端FormData()中包含的file\type\params字段,利用file在業(yè)務(wù)中使用POI或者Easy這樣的做導(dǎo)入功能開(kāi)發(fā)
@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");
}前臺(tái)導(dǎo)入
HTML:
? ? ? ? ? ? <a v-on:click="importExcel()" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" > ? ? ? ? ? ? ? ? 從excel導(dǎo)入... ? ? ? ? ? ? </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">
//循環(huán)讀取文件觸發(fā)parseXlsxObject方法操作業(yè)務(wù)
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);
}
//實(shí)現(xiàn)導(dǎo)入到前端的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['長(zhǎng)度'],
crc: value['crc校檢'],
rate: value['頻率'],
state: value['啟用狀態(tài)']
}
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>前臺(tái)導(dǎo)出
HTML:
? ? ? ? ? ? <a v-on:click="exportExcel()" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" > ? ? ? ? ? ? ? ? 導(dǎo)出到excel... ? ? ? ? ? ? </a>
Javascript:響應(yīng)導(dǎo)出按鈕,將list通過(guò)xls的方法aoa_to_sheet導(dǎo)出為excel文檔
exportExcel: function () {
var settingsArray = [['地址位','模式','起始地址','長(zhǎng)度','crc校檢','頻率','啟用狀態(tài)']];
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), '導(dǎo)出.xlsx');
},
<script>
/**
* 通用的打開(kāi)下載對(duì)話(huà)框方法,沒(méi)有測(cè)試過(guò)具體兼容性
* @param url 下載地址,也可以是一個(gè)blob對(duì)象,必選
* @param saveName 保存文件名,可選
*/
function openDownloadDialog(url, saveName)
{
if(typeof url == 'object' && url instanceof Blob)
{
url = URL.createObjectURL(url); // 創(chuàng)建blob地址
}
var aLink = document.createElement('a');
aLink.href = url;
aLink.download = saveName || ''; // HTML5新增的屬性,指定保存文件名,可以不要后綴,注意,file:///模式下不會(huì)生效
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);
}
// 將一個(gè)sheet轉(zhuǎn)成最終的excel文件的blob對(duì)象,然后利用URL.createObjectURL下載
function sheet2blob(sheet, sheetName) {
sheetName = sheetName || 'Sheet1';
var workbook = {
SheetNames: [sheetName],
Sheets: {}
};
workbook.Sheets[sheetName] = sheet;
// 生成excel的配置項(xiàng)
var wopts = {
bookType: 'xlsx', // 要生成的文件類(lèi)型
bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開(kāi)啟生成速度會(huì)下降,但在低版本IOS設(shè)備上有更好的兼容性
type: 'binary'
};
var wbout = XLSX.write(workbook, wopts);
var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
// 字符串轉(zhuǎn)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>總結(jié):本篇主要記錄了
(1)前端上傳文件給后端multipart格式的方法
(2)前端利用xls.js從excel文檔導(dǎo)入數(shù)據(jù)到j(luò)son數(shù)組變量的方法
(3)前端利用xls.js將json數(shù)組導(dǎo)出到excel文檔下載的方法
上述代碼可以?xún)?yōu)化,暫時(shí)貼成這樣,以后有這樣的需求可以快速cv使用。
后續(xù)有時(shí)間可以多熟悉xls.js,Apache的POI和阿里巴巴的EasyExcel,都是相關(guān)的內(nèi)容
最后再貼一個(gè)用EasyExcel后臺(tái)將后臺(tái)生成的List數(shù)據(jù)導(dǎo)出的方法,可以用
window.location.href= [后臺(tái)導(dǎo)出的地址] 這種方式進(jìn)行后端導(dǎo)出,注意設(shè)置response的格式
try (ServletOutputStream out = response.getOutputStream()) {
//這三行不可缺,否則會(huì)被前端解析成亂碼數(shù)據(jù),而不是文件
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();
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中FileWriter的用法及wirte()重載方法詳解
這篇文章主要介紹了Java中FileWriter的用法及wirte()重載方法詳解,FileWriter是Java編程語(yǔ)言中的一個(gè)類(lèi),用于將字符寫(xiě)入文件,它提供了一種簡(jiǎn)單而方便的方式來(lái)創(chuàng)建、打開(kāi)和寫(xiě)入文件,通過(guò)使用FileWriter,我們可以將字符數(shù)據(jù)寫(xiě)入文本文件,需要的朋友可以參考下2023-10-10
SpringBoot 嵌入式web容器的啟動(dòng)原理詳解
這篇文章主要介紹了SpringBoot 嵌入式web容器的啟動(dòng)原理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-11-11
java基本教程之Thread中start()和run()的區(qū)別 java多線(xiàn)程教程
這篇文章主要介紹了Thread中start()和run()的區(qū)別,Thread類(lèi)包含start()和run()方法,它們的區(qū)別是什么?下面將對(duì)此作出解答2014-01-01
淺談一下Java多線(xiàn)程斷點(diǎn)復(fù)制
這篇文章主要介紹了淺談一下Java多線(xiàn)程斷點(diǎn)復(fù)制,當(dāng)程序執(zhí)行中斷時(shí)(出現(xiàn)錯(cuò)誤、斷電關(guān)機(jī)),仍可以從上次復(fù)制過(guò)程中重新開(kāi)始(不必從頭開(kāi)始復(fù)制),需要的朋友可以參考下2023-04-04
java循環(huán)練習(xí)的簡(jiǎn)單代碼實(shí)例
本篇文章介紹了,java中循環(huán)練習(xí)的一些簡(jiǎn)單代碼實(shí)例。需要的朋友參考下2013-04-04
Java開(kāi)發(fā)工具-scala處理json格式利器-json4s詳解
這篇文章主要介紹了開(kāi)發(fā)工具-scala處理json格式利器-json4s,文章中處理方法講解的很清楚,有需要的同學(xué)可以研究下2021-02-02

