1. 程式人生 > >使用java將資料寫入檔案,並下載到客戶端

使用java將資料寫入檔案,並下載到客戶端

最近做了一個功能,覺得挺有意思,決定記錄下來,以前也見過類似的功能,以為很高階,其實很簡單。

第一步:寫一個建立檔案的工具類

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);
        }
    }

為了方便大家看,有些地方換行了,大家注意下;
程式碼沒什麼難度,這裡就不講解了。