POI動態匯出Excel
阿新 • • 發佈:2018-12-15
針對各個表的資料匯出,實現的程式碼往往相似,出於這個目的,開啟自己程式碼簡略之旅。本文是針對.xls的excel檔案。
1、思路描述
①、確定各個模板的.xls檔案格式
②、定義模板的存在的引數,如第一行的引數,第二行的引數等
③、excel檔案中針對行 列定位方式,如 (0, 0, 0,0)
④、處理從資料庫獲取的資料格式key-value 如 name 小明
列入如下圖,本篇幅就圍繞下圖展開:
2、程式碼如下:(向前端返回的下載路徑)
controller類的方法
@ApiOperation(value = "匯出地址資料") @PostMapping(value="/exportAddresses") public ApiResponse<Object> exportAddresses(){ ApiResponse<Object> resp = new ApiResponse<Object>(); // 資料庫表對應的欄位 String[] titles = new String[] {"id","name","pid","code","description"}; List<Map<String,Object>> objList = new ArrayList<>(); // 資料庫表對應的資料 List<AddressVo> list = addressService.exportAddresses(); for(AddressVo item : list){ Map<String,Object> tempMap = new HashMap<>(); tempMap.put("id", item.getId()); tempMap.put("name", item.getName()); tempMap.put("pid", item.getPid()); tempMap.put("code", item.getCode()); tempMap.put("description", item.getDescription()); objList.add(tempMap); } String path = FileUtil.exportExcel("地址樹",titles,objList); System.out.println("path="+path); if(path == null){ resp.error("匯出失敗!"); } resp.ok("匯出成功!").setData(path); return resp; }
FileUtil 類
public class FileUtil <T> { // 掛在專案的某資料夾下 public static final String REPORT_PATH ="templates"+ File.separator; /** * 匯出資料 * @auther xuguocai * @param fileName 檔名 * @param titles 欄位名 * @param result 匯出資料 * @throws IOException */ public static String exportExcel(String fileName,String[] titles,List<Map<String,Object>> result){ HSSFWorkbook wb; FileOutputStream fos; String tempName = fileName; try { Date date = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); fileName +="_"+df.format(date)+".xls"; fos = new FileOutputStream(FileUtil.REPORT_PATH + fileName); wb= new HSSFWorkbook(); HSSFSheet sh = wb.createSheet(); // 設定列寬 for(int i = 0; i < titles.length-1; i++){ sh.setColumnWidth( i, 256*15+184); } // 第一行表頭標題,CellRangeAddress 引數:行 ,行, 列,列 HSSFRow row = sh.createRow(0); HSSFCell cell = row.createCell(0); cell.setCellValue(new HSSFRichTextString(tempName)); cell.setCellStyle(fontStyle(wb)); sh.addMergedRegion(new CellRangeAddress(0, 0, 0,titles.length-1)); // 第二行 HSSFRow row3 = sh.createRow(1); // 第二行的列 for(int i=0; i < titles.length; i++){ cell = row3.createCell(i); cell.setCellValue(new HSSFRichTextString(titles[i])); cell.setCellStyle(fontStyle(wb)); } //填充資料的內容 i表示行,z表示資料庫某表的資料大小,這裡使用它作為遍歷條件 int i = 2, z = 0; while (z < result.size()) { row = sh.createRow(i); Map<String,Object> map = result.get(z); for(int j=0;j < titles.length;j++) { cell = row.createCell(j); if(map.get(titles[j]) !=null) { cell.setCellValue(map.get(titles[j]).toString()); }else { cell.setCellValue(""); } } i++; z++; } wb.write(fos); fos.flush(); fos.close(); return FileUtil.REPORT_PATH + fileName; }catch (Exception e){ e.printStackTrace(); } return null; } }