咔片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
导出效果图如下:

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