java、springboot?接口導(dǎo)出txt方式
java、springboot 接口導(dǎo)出txt
就寫兩個方法
@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)出的文件存儲目錄 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)出文件文件出錯:{}",e); } finally {try { buff.close(); outStr.close(); } catch (Exception e) { //LOGGER.error("關(guān)閉流對象出錯 e:{}",e); } } }
Springboot 文件處理導(dǎo)入導(dǎo)出
簡單記錄下使用Springboot進行文件與后端交互、excel前臺導(dǎo)出等內(nèi)容
這里用到了:elelemt-ui\HTML\vue\Springboot框架
后臺導(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", //請求的url地址 dataType: "json", //返回格式為json async: false,//請求是否異步,默認為異步,這也是ajax重要特性 data: fd, //參數(shù)值 type: "POST", //請求方式 contentType: false,// 不設(shè)置Content-Type請求頭 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)入功能開發(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"); }
前臺導(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); } //實現(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['長度'], 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>
前臺導(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通過xls的方法aoa_to_sheet導(dǎo)出為excel文檔
exportExcel: function () { var settingsArray = [['地址位','模式','起始地址','長度','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> /** * 通用的打開下載對話框方法,沒有測試過具體兼容性 * @param url 下載地址,也可以是一個blob對象,必選 * @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:///模式下不會生效 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轉(zhuǎn)成最終的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設(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)化,暫時貼成這樣,以后有這樣的需求可以快速cv使用。
后續(xù)有時間可以多熟悉xls.js,Apache的POI和阿里巴巴的EasyExcel,都是相關(guān)的內(nèi)容
最后再貼一個用EasyExcel后臺將后臺生成的List數(shù)據(jù)導(dǎo)出的方法,可以用
window.location.href= [后臺導(dǎo)出的地址] 這種方式進行后端導(dǎo)出,注意設(shè)置response的格式
try (ServletOutputStream out = response.getOutputStream()) { //這三行不可缺,否則會被前端解析成亂碼數(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(); }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SPRINGMVC JSON數(shù)據(jù)交互如何實現(xiàn)
這篇文章主要介紹了SPRINGMVC JSON數(shù)據(jù)交互如何實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06idea ssm項目java程序使用十六進制rxtx包向串口發(fā)送指令的方法
這篇文章主要介紹了idea ssm項目java程序向串口發(fā)送指令并且使用十六進制 rxtx包,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08解析Orika的MapperFacade 屬性賦值的使用問題
在我們實際開發(fā)中,常常會有對象與對象之間的轉(zhuǎn)化,或者把一個對象的數(shù)據(jù)轉(zhuǎn)化到另一個數(shù)據(jù)之中,如果我們手動的一個一個的set就會比較麻煩,代碼段看起來也會比較長。而Orika的MapperFacade就是解決這個問題的,實現(xiàn)對象屬性的復(fù)制2021-12-12詳解如何配置springboot跳轉(zhuǎn)html頁面
這篇文章主要介紹了詳解如何配置springboot跳轉(zhuǎn)html頁面,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09解決Spring Data Jpa 實體類自動創(chuàng)建數(shù)據(jù)庫表失敗問題
這篇文章主要介紹了解決Spring Data Jpa 實體類自動創(chuàng)建數(shù)據(jù)庫表失敗問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09