java、springboot?接口導(dǎo)出txt方式
java、springboot 接口導(dǎo)出txt
就寫兩個(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)容類型 response.setContentType("text/plain"); //設(shè)置文件的名稱和格式 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ì)話框方法,沒(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', // 要生成的文件類型 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文檔下載的方法
上述代碼可以優(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)文章
SPRINGMVC JSON數(shù)據(jù)交互如何實(shí)現(xiàn)
這篇文章主要介紹了SPRINGMVC JSON數(shù)據(jù)交互如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java?延時(shí)隊(duì)列及簡(jiǎn)單使用方式詳解
這篇文章主要介紹了Java延時(shí)隊(duì)列簡(jiǎn)單使用方式,通過(guò)本文學(xué)習(xí)知道延時(shí)隊(duì)列是什么可以用來(lái)干什么,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08idea ssm項(xiàng)目java程序使用十六進(jìn)制rxtx包向串口發(fā)送指令的方法
這篇文章主要介紹了idea ssm項(xiàng)目java程序向串口發(fā)送指令并且使用十六進(jìn)制 rxtx包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08解析Orika的MapperFacade 屬性賦值的使用問(wèn)題
在我們實(shí)際開(kāi)發(fā)中,常常會(huì)有對(duì)象與對(duì)象之間的轉(zhuǎn)化,或者把一個(gè)對(duì)象的數(shù)據(jù)轉(zhuǎn)化到另一個(gè)數(shù)據(jù)之中,如果我們手動(dòng)的一個(gè)一個(gè)的set就會(huì)比較麻煩,代碼段看起來(lái)也會(huì)比較長(zhǎng)。而Orika的MapperFacade就是解決這個(gè)問(wèn)題的,實(shí)現(xiàn)對(duì)象屬性的復(fù)制2021-12-12詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面
這篇文章主要介紹了詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java中instanceof關(guān)鍵字實(shí)例講解
大家好,本篇文章主要講的是Java中instanceof關(guān)鍵字實(shí)例講解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題
這篇文章主要介紹了解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09