开发者

Java使用EasyExcel生成动态表头和多Sheet数据的Excel实例

目录
  • Java使用EasyExcel生成动态表头和多Sheet数据的Excel
    • 1、动态表头+数据Excel
    • 2、动态表头Excel
  • 总结

    Java使用EasyExcel生成动态表头和多Sheet数据的Excel

    由于业务需求,Excel的表头需要固定表头+动态表头,不同Sheet使用不同的动态表头进行Excel导出,这里还是使用EasyExcel进行数据导出,对关键部分代码会进行释义:

    1、动态表头+数据Excel

     String fileName = "设备台账" + DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT);
        //根据模版id进行分组,不同模板下的数据,导出为不同Sheet的数据
        Map<Long, DeviceLedgerTemplateEntity> templateMap = deviceTemplateList.stream().collect(Collectors.toMap(DeviceLedgerTemplateEntity::getLedgerTemplateId, v -> v));
        int i = 0;
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ";" + "filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
        for (Map.Entry<Long, List<DeviceLedgerImportVO>编程;> deviceMap : deviceTemplateMap.entrySet()) {
           Long templateId = deviceMap.getKey();
           List<List<String>> headList = new ArrayList<>();
           List<List<String>> dataList = new ArrayList<>();
           if (templateMap.containsKey(templateId)) {
              DeviceLedgerTemplateEntity templateEntity = templateMap.get(templateId);
              List<FormDTO> formList = jsONArray.parseArray(templateEntity.getFormItems(), FormDTO.class);
              //动态生成多个Sheet的表头
              getHeadList(headList, formList);
              List<DeviceLedgerImportVO> deviceList = deviceTemplateMap.get(templateId);
              //动态填充多个Sheet的数据
              getDataList(dataList, deviceList);
              //循环输出sheet和表头以及表格内容
              WriteSheet sheet = EasyExcel.writerSheet(i, "Sheet" + (i + 1)).head(headList).build();
              excelpythonWriter.write(dataList, sheet);
          }
          i++;
       }
       excelWriter.finish();
    • getHeadList 动态生成表头
      private void getHeadList(List<List<String>> headList, List<FormDTO> formList) {
            //生成Excel中表头
            //固定表头
            Field[] fields = DeviceLedgerImportVO.class.getDeclaredFields();
            for (Field field : fields) {
                boolean bool = field.isAnnotationPresent(ExcelProperty.class);
                if (bool) {
                    String value = Arrays.stream(field.getAnnotation(ExcelProperty.class).value()).findFirst().get();
                    List<String> filedList = new ArrayList<>();
                    filedList.www.devze.comadd(value);
                    headList.add(filedList);
                }
            }
            //动态表头
            formList.stream().forEach(form -> {
                List<String> filedList = new ArrayList<>();
                filedList.add(form.getLabel());
                headList.add(filedList);
            });
        }
    • getDataList 动态生出数据
       private void getDataList(List<List<String>> dataList, List<DeviceLedgerImportVO> deviceList) {
            //生成Excel中值
            deviceList.stream().forEach(device -> {
                //固定表头下的数据
                List<String> valueList = new ArrayList<>(http://www.devze.com);
                valueList.add(device.getDeviceSn());
                valueList.add(device.getDeviceName());
                valueList.add(device.getDeviceTypeName());
                valueList.add(device.getLocation());
                valueList.add(device.getStatus());
                //动态表头下的数据
                List<FormDTO> formList = JSONArray.parseArray(device.getFormItems(), FormDTO.class);
                if (CollectionUtil.isNotEmpty(formList)) {
                    formList.stream().forEach(form -> valueList.add(form.getValue()));
                }
                dataList.add(valueList);
            });
       }
    • Sheet1数据:

    Java使用EasyExcel生成动态表头和多Sheet数据的Excel实例

    • Shee2数据:

    Java使用EasyExcel生成动态表头和多Sheet数据的Excel实例

    也可以将Excel导出那部分写到工具类,懒的抽出来了,也懒得写Demo了,大概逻辑差不多,需要修改headList和dataList也根据索引导出每个Sheet的数据,在此,提供工具类:

    注意:需要修改headList和dataList,不可直接使用上面的headList和dataList方法

      public static void writeDynamicBATchExcel(HttpServletResponse response, String fileName, String sheetName, List<List<String>> headList, List<List<Object>> dataList) throws Exception {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ";" + "filename*=utf-8''" + fileName + ".xlsx");
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            //循环输出sheet和表头以及表格内容
            for (int i = 0; i < dataList.size(); i++) {
                WriteSheet sheet = EasyExcel.writerSheet(i, "Sheet" + (i + 1)).head(Collections.singletonList(headList.get(i))).build();
                excelWriter.write(dataList.get(i), sheet);
            }
            excelWriter.finish();
        }

    2、动态表头Excel

    如果只生成动态表头模版,不需要数据的话,getHeadList()不变,仅供参考

       public void downloadDeviceLedger(DeviceLedgerSearchDTO param, HttpServletResponse response) throws IOException {
            //查询模版
            DeviceLedgerTemplateEntity templateEntity = deviceLedgerTemplateService.queryDeviceLedgerTemplate(param.getLedgerTemplateId());
            List<FormDTO> formList = JSONArray.parseArray(templateEntity.getFormItems(), FormDTO.class);
            String fileName = "设备台账" + DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT);
            List<List<String>> resultList = new ArrayList<>();
            getHeahttp://www.devze.comdList(resultList, formList);
            EasyExcelUtils.writeDynamicExcel(response, fileName, "设备台账", resultList, Collections.EMPTY_LIST);
        }

    EasyExcelUtils.writeDynamicExcel工具类:

      public static void writeDynamicExcel(HttpServletResponse response, String fileName, String sheetName, List<List<String>> headList, List<List<Object>> dataList) throws IOException {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ";" + "filename*=utf-8''" + fileName + ".xlsx");
            EasyExcel.write(response.getOutputStream())
                    // 设置动态头
                    .head(headList)
                    .sheet(sheetName)
                    .doWrite(dataList);
        }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜