使用java將資料寫入檔案,並下載到客戶端
阿新 • • 發佈:2019-01-27
最近做了一個功能,覺得挺有意思,決定記錄下來,以前也見過類似的功能,以為很高階,其實很簡單。
第一步:寫一個建立檔案的工具類
public class CSVUtils{ /** * CSV檔案生成方法 * @param head * @param dataList * @param outPutPath * @param filename * @return */ public static File createCSVFile(List<Object> head, List<List<Object>> dataList, String outPutPath,String filename) { File csvFile = null; BufferedWriter csvWtriter = null; try { csvFile = new File(outPutPath + File.separator + filename + ".csv"); File parent = csvFile.getParentFile(); if (parent != null && !parent.exists()) { parent.mkdirs(); } csvFile.createNewFile(); // UTF-8使正確讀取分隔符"," csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( csvFile), "UTF-8"), 1024); // 寫入檔案頭部 writeRow(head, csvWtriter); // 寫入檔案內容 for (List<Object> row : dataList) { writeRow(row, csvWtriter); } csvWtriter.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { csvWtriter.close(); } catch (IOException e) { e.printStackTrace(); } } return csvFile; } /** * 寫一行資料方法 * @param row * @param csvWriter * @throws IOException */ private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException { // 寫入檔案頭部 for (Object data : row) { StringBuffer sb = new StringBuffer(); String rowStr = sb.append("\"").append(data).append("\",").toString(); csvWriter.write(rowStr); } csvWriter.newLine(); } }
第二步:將資料按照格式寫到檔案,並且存放在伺服器某個位置
public File createCSVFile(HttpServletRequest request,ObeEvent obeEventParam){ PageHelper.startPage(obeEventParam.getPageNum(), obeEventParam.getPageSize()); List<ObeEvent> eventList = obeEventMapper.selectByObeId(obeEventParam); // 設定表格頭 Object[] head = {"裝置編號", "事件時間", "事件型別", "事件詳情"}; List<Object> headList = Arrays.asList(head); // 設定資料 List<List<Object>> dataList = new ArrayList<List<Object>>(); List<Object> rowList = null; for (int i = 0; i < eventList.size(); i++) { rowList = new ArrayList<Object>(); ObeEvent obeEvent = eventList.get(i); rowList.add(obeEvent.getObeId()); rowList.add("\t"+DateUtil.toDateTimeString(obeEvent.getObeTime())); rowList.add(obeEvent.getEventType().replace("\"","\"\"")); String eventType = obeEvent.getEventType(); String obeData = obeEvent.getObeData(); JSONObject jsonObj = (JSONObject) JSONObject.parse(obeData); List<String> asList = Arrays.asList(eventType.substring(1, eventType.length()-1). replaceAll("\"", "").split(",")); JSONObject json = new JSONObject(); for(String str : asList) { JSONObject obeEventDetail = jsonObj.getJSONObject(str.replaceAll("\"", "")); json.put(str, obeEventDetail); } rowList.add(json.toString().replaceAll("\"","\"\"")); dataList.add(rowList); } // 匯出檔案路徑 String downloadFilePath = "attachments2" + File.separator + "obeEvent" + File.separator + "download" + File.separator; // 匯出檔名稱 String datetimeStr = DateUtil.toString(new Date(), "yyyyMMddHHmmss"); String fileName = "事件列表_"+ obeEventParam.getObeId()+"_" + datetimeStr; // 匯出CSV檔案 File csvFile = CSVUtils.createCSVFile(headList, dataList,downloadFilePath, fileName); return csvFile;//返回這個檔案 }
第三步:將返回的檔案,以流的方式返回前端
public @ResponseBody Result<Object> exportObeEventDataExcel(HttpServletRequest request, HttpServletResponse response,@RequestBody ObeEvent obeEvent){ try { File csvFile = obeService.createCSVFile(request,obeEvent); // 以流的形式下載檔案。 InputStream fis = new BufferedInputStream(new FileInputStream(csvFile)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 設定response的Header response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode( csvFile.getName(), "UTF-8")); response.addHeader("Content-Length", "" + csvFile.length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); return Result.returnResult(); } catch (IOException e) { String message = "export ObeEvent Data Excel failed . "; LOGGER.error(message, e); return Result.returnErrorResult(message); } }
為了方便大家看,有些地方換行了,大家注意下;
程式碼沒什麼難度,這裡就不講解了。