需求描述
生成包含多个Sheet页的Excel表格,并且每个Sheet的表头是动态的。
设计方案
一个workBook可以分为多个Sheet页,每一个Sheet页面又可以分为title,entity,data 3个部分。
详解
title:是一个ExportParams类实例,可以用于设置sheet页名和表格名
ExportParams userExportParams = new ExportParams("明细","方案1");
结果:方案1为Sheet页名,明细为表格最上面一行的题目。
entity:表头,可以是一个类,也可以是一个List。
动态表头需要生成一个List;静态表头可以使用对类加注解的方式。
ExcelExportEntity entity1 = new ExcelExportEntity("姓名","name");ExcelExportEntity entity1 = new ExcelExportEntity("年龄","age"); ExcelExportEntity entity1 = new ExcelExportEntity("班级","class"); entityList.add(entity1);
data:表格中的数据,一个List<Map<K,V>>。
表格中的每一行数据都是一个Map<K,V>,多行数据就成了一个List。
dataMap.put("name","张三");dataMap.put("age","17");dataMap.put("class","高三1班");
Sheet:一个有固定Key值的Map<String,Object>。
多个Sheet页可以用一个List<Map<String,Object>>来进行存储。
sheetMap.put("title", userExportParams );sheetMap.put("entityList", entityList);sheetMap.put("data", dataMap);
注意:“title”,“entityList”,"data"等key值是固定不变的,不能进行改动,每个Sheet页都必须包含这三个元素。
输出
可以输出到磁盘文件,也可以输出到二进制流。
//输出到文件Workbook workbook = new HSSFWorkbook();for(Map<String,Object> map : sheetList) {ExcelExportService server = new ExcelExportService();ExportParams param = (ExportParams) map.get("title");@SuppressWarnings("unchecked")List<ExcelExportEntity> entity = (List<ExcelExportEntity>) map.get("entityList");Collection<?> data = (Collection<?>) map.get("data");server.createSheetForMap(workbook, param, entity, data);}File targetFile = new File("D:\\excel\\temp.xls");FileOutputStream fos = new FileOutputStream(targetFile);workbook.write(fos);fos.close();