1、首先準備好數據。這裡的數據不是直接從資料庫中查到的數據而是將查到的數據複製一份,兩者的數據互不影響,這樣有利於複製之後的數據可以修改。 ① 定義一個從資料庫中查到的數據的方法(service層的實現類方法),這裡省略mapper映射文件和dao層介面的方法 /** * 參數是實體類,根據參數條件 ...
1、首先準備好數據。這裡的數據不是直接從資料庫中查到的數據而是將查到的數據複製一份,兩者的數據互不影響,這樣有利於複製之後的數據可以修改。
① 定義一個從資料庫中查到的數據的方法(service層的實現類方法),這裡省略mapper映射文件和dao層介面的方法
/** * 參數是實體類,根據參數條件獲取所有的數據。forEach方法只是迴圈遍歷獲取的元素,可以根據業務需求修改元素的屬性值 * / public List<User> export(User user) { List<User> userList = userDao.selectAll(user); userList.stream().forEach(e->{ // 密碼回顯字元表示 e.setPassword(e.getPassword().replaceAll(e.getPassword(), "******")); }); return userList; }
② 定義一個複製數據的方法,方法中可以使用Spring框架提供的BeanUtils包的copyProperties方法來複制對象的屬性
/** * 複製屬性的方法 */ public List<User> queueExcel(User user) { List<User> userList = export(user); List<User> exportList = new ArrayList<>(); userList.stream().forEach(e->{ // 定義一個user對象,以供接受對象的屬性 User user = new User();
//對象屬性複製 BeanUtils.copyProperties(e, user); exportList.add(user); }); return exportList; }
2、準備好了數據,就需要定義好一個方法,方法的內容是:與數據對應的表頭;文件Excel導出到response中。
@RequestMapping(value = "/queueExcel",method = RequestMethod.POST) @ResponseBody public void queueExcel(@RequestBody User user, HttpServletResponse response){ try{ List<User> exportList = userService.queueExcel(user); LinkedHashMap<String, String> columnMap = new LinkedHashMap<>(); columnMap.put("userId", "工號"); columnMap.put("username", "用戶名"); columnMap.put("realName", "真實姓名"); columnMap.put("password", "用戶密碼"); columnMap.put("gender", "性別"); //設置導出文件名稱 String fileName = "測試.xlsx"; //導出Excel到HttpServletResponse utils.excel.ExcelUtil.exportExcelToHttpServletResponse(exportList, columnMap, fileName, response); response.getOutputStream().flush(); } catch (Exception me) { me.printStackTrace(); } }
3、上述缺少一個導出Excel文件到HttpServletResponse對象中,這時需要在定義好的包下創建類和方法。
/** * 導出Excel到HttpServletResponse * * @param dataList 數據列表 * @param columnMap 輸出列及其中文列名,按順序輸出 * @param fileName 文件名 * @param <T> */ public static <T> void exportExcelToHttpServletResponse(List<T> dataList, LinkedHashMap<String, String> columnMap, String fileName, HttpServletResponse response) { if (null == dataList) { return; } try { //寫到位元組輸出流 ByteArrayOutputStream byteArrayOutputStream = exportExcelOutputStream(dataList, columnMap); if (null == byteArrayOutputStream) { return; } //導出文件流到HttpServletResponse //防止亂碼,設置HttpServletResponse編碼 response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); //設置頁面禁止緩存 response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); //設置下載文件名 response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1")); //文件輸出流寫入HttpServletResponse byteArrayOutputStream.writeTo(response.getOutputStream()); } catch (Exception e) { e.printStackTrace(); } }
4、好像又缺少了一個寫到位元組流的方法
/** * 導出為Excel輸出流 * * @param dataList 數據列表 * @param columnMap 輸出列及其中文列名,按順序輸出 * @param <T> * @return oss文件url */ public static <T> ByteArrayOutputStream exportExcelOutputStream(List<T> dataList, LinkedHashMap<String, String> columnMap) { ByteArrayOutputStream byteArrayOutputStream = null; if (null == dataList) { return null; } try { // 通過工具類創建writer,創建xlsx格式 ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(true); // if (null != columnMap) { //設置列標題 for (Map.Entry<String, String> entry : columnMap.entrySet()) { writer.addHeaderAlias(entry.getKey(), entry.getValue()); } //根據列標題,篩選過濾數據列 ArrayList<Map<String, Object>> rows = new ArrayList<>(); Map<String, Object> tempMap1 = null; Map<String, Object> tempMap2 = null; String column; for (T data : dataList) { tempMap1 = BeanUtil.beanToMap(data); tempMap2 = new LinkedHashMap<>(); for (Map.Entry<String, String> entry : columnMap.entrySet()) { column = entry.getKey(); tempMap2.put(column, tempMap1.get(column)); } rows.add(tempMap2); } //輸出篩選過濾後的數據 writer.write(rows); } else { //不過濾列,直接輸出數據 writer.write(dataList); } //寫到位元組輸出流 byteArrayOutputStream = new ByteArrayOutputStream(); writer.flush(byteArrayOutputStream); //關閉writer,釋放記憶體 writer.close(); } catch (Exception e) { e.printStackTrace(); } // return byteArrayOutputStream; }