咔片PPT · AI自动生成演示文稿,模板丰富、排版精美 讯飞智文 · 一键生成PPT和Word,高效应对学习与办公

前言

之前做过的项目中有一个需求是导出用户的问卷答题分析结果excel,后来添加了一种矩阵题的题型,如一级标题下还可能有多个二级标题,业务复杂性也大大增加,本来直接从DB取出问卷下所有的问题和答题结果再匹配到对应的问题即可,如今所有问题取出后还要将进行父子级设置,答案也需设置到最低一级的问题上,所以原有的导出接口基本上是报废了。不过最后还是通过easypoi的分组导出功能,达到了所需的目标效果,例图如下:

以下便以easypoi做一个简单的excel二级标题导出例子。

依赖

cn.afterturn easypoi-base 4.1.0

范例代码

public class DynamicPoiTest { public static void main(String[] args) throws IOException { List entity = new ArrayList<>(); entity.add(buildExcelEntity("序号", "order", 0)); entity.add(buildExcelEntity("性别", "sex", 1)); // 设置了group的若不设置排序默认会排到最后 entity.add(buildExcelEntityByGroup("姓名", "students.name", "学生", 2)); entity.add(buildExcelEntityByGroup("性别", "students.sex", "学生", 2)); entity.add(buildExcelEntity("班级", "class", 3)); List> list = new ArrayList<>(); IntStream.range(0, 10).forEach(i -> { Map params = new HashMap<>(); params.put("order", "" + i); params.put("sex", "sex" + i); params.put("class", "class-" + i); params.put("students.sex", "man-" + i); params.put("students.name", "name-" + i); list.add(params); }); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("测试", "测试"), entity, list); try (FileOutputStream fos = new FileOutputStream("E:/IntelliJ/workspace/netty-demo/ExcelExportForMap.xls")) { workbook.write(fos); } } private static ExcelExportEntity buildExcelEntity(String name, Object key, int orderNo) { ExcelExportEntity excelEntity = new ExcelExportEntity(name, key); excelEntity.setOrderNum(orderNo); return excelEntity; } /** * 在group列下添加子列 * * @param name * @param key * @param group * @return */ private static ExcelExportEntity buildExcelEntityByGroup(String name, Object key, String group, int orderNo) { ExcelExportEntity excelEntity = new ExcelExportEntity(name, key); excelEntity.setGroupName(group); excelEntity.setOrderNum(orderNo); return excelEntity; } }

导出效果图如下:

easypoi是通过ExcelExportEntity创建时的key去匹配设置每一单元格的值,如果设置了group则group将作为一级标题名(如上图中的学生便是group,性别、姓名则为该group下的子标题),若只设置了name而没设置group(如上的序号性别列)则name将成为一级标题,ExcelExportEntity实际上是对应excel单元格的实体类,可用于设置每个单元格的宽、高、字体等各种样式。

easypoi虽然在BaseExportService.createCell时虽然会嵌套遍历设置的setList()中的list,但遍历数据映射的值时会直接转成Collection,而Map并非Collection的子类(即下源码中obj.get()后获得的然是Map),所以报类型转换错误,即上例中list里的每个map.value中都不能再包含Map(百度时发现其他人的博客直接放Map,转成其Demo的版本后发现依旧是不可行的)。遍历ExcelExportEntity中的list时其value转换源码(ExportCommonService)如下:

/** * @param entity 当前列 * @param obj 每一行excel的数据列映射,如上第一行为[order:0,sex:sex0.....] **/ public Collection getListCellValue(ExcelExportEntity entity, Object obj) throws Exception { Object value; if (obj instanceof Map) { value = ((Map) obj).get(entity.getKey()); } else { value = (Collection) entity.getMethod().invoke(obj, new Object[]{}); } return (Collection) value; } ———————————————— 版权声明:本文为CSDN博主「识1DD编程」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/z28126308/article/details/100079790