1. 程式人生 > >POI動態匯出Excel

POI動態匯出Excel

針對各個表的資料匯出,實現的程式碼往往相似,出於這個目的,開啟自己程式碼簡略之旅。本文是針對.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;
	}

}