ROJDAR 2025-01-21 15:13 采纳率: 30%
浏览 17
已结题

POI导出数据到excel如何动态的换行

模板中的数据有固定的,也有动态的,都在一个map中,如何能够对动态的那部分进行自动换行呢?
模板:

img

代码:

 @Override
    public void export(HttpServletResponse response, AGrainCustodianTransferRecord x) {
        if (ObjectUtils.isEmpty(x.getBarnId())) {
            throw new CheckedException("仅支持导出某一个仓房的数据,当然并未设置导出的仓房");
        }

        List<AGrainCustodianTransferRecord> list = selectAGrainCustodianTransferRecordList(x);
        if (CollectionUtils.isEmpty(list)) {
            throw new RuntimeException("导出数据不能为空!");
        }

        List<Map<String, Object>> dataList = new ArrayList<>();
        // 创建一个 Map 来包含数据列表
        Map<String, Object> dataMap = new HashMap<>();
        for (AGrainCustodianTransferRecord record : list) {
            Map<String, Object> map = Maps.newHashMap();
            dataMap.put("barnNumber", ObjectUtils.isEmpty(dataMap.get("barnNumber")) ? record.getBarnNumber() : dataMap.get("barnNumber"));
            dataMap.put("usedTime", ObjectUtils.isEmpty(dataMap.get("usedTime")) ? record.getBarnNumber() : dataMap.get("usedTime"));
            dataMap.put("custodian", ObjectUtils.isEmpty(dataMap.get("custodian")) ? record.getBarnNumber() : dataMap.get("custodian"));
            dataMap.put("leader", ObjectUtils.isEmpty(dataMap.get("leader")) ? record.getBarnNumber() : dataMap.get("leader"));
            map.put("transferTime", record.getTransferTime());
            map.put("transferBy", record.getTransferBy());
            map.put("transferPage", record.getTransferPage());
            map.put("receiver", record.getReceiver());
            map.put("guardian", record.getGuardian());
            map.put("notes", record.getNotes());
            dataList.add(map);
        }
        dataMap.put("recordList", dataList);

        try {
            //设置workbook
            String absolutePath = new File("zcl-modules/zcl-barn/src/main/resources/template/test.xlsx").getAbsolutePath();
            TemplateExportParams params = new TemplateExportParams(absolutePath);
            Workbook workbook = ExcelExportUtil.exportExcel(params, dataMap);

            // 设置响应规则
            response.setContentType("application/force-download");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode("保管员移交记录.xlsx", "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 写回答

3条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据你的描述和代码,看起来你想要将动态数据插入到Excel模板中的指定位置,并在每个数据项填充完毕后自动跳到下一行。为了实现这个功能,你需要根据数据动态创建相应的行数并在模板中为每个动态数据提供一个位置。你的模板中已经预留了一些位置用于动态数据,但似乎并没有明确指定如何根据数据动态换行。为此,我为你提供了一些建议和可能的修改方法。

    假设你已经有了需要插入的动态数据列表(例如List<AGrainCustodianTransferRecord>),你可以遍历这个列表并将数据插入到模板中的对应位置。具体实现时需要注意以下几点:

    1. 确定动态数据在模板中的位置:在模板中为每个动态数据预留一个占位符,比如${recordList},并确保它与代码中处理的数据结构相匹配。你可以使用POI的模板功能来设置这些占位符的位置和格式。
    2. 遍历动态数据列表并填充模板:在代码中遍历动态数据列表(例如List<AGrainCustodianTransferRecord>),每次遍历处理一条记录的数据,并填充到模板中的相应位置。你需要使用POI的API来定位模板中的占位符并替换为实际的数据。在填充数据时,可以使用POI的单元格样式功能来设置自动换行等样式属性。
    3. 动态调整行高和列宽:根据数据的长度动态调整行高和列宽,以确保数据能够正确显示并适应Excel单元格的大小。你可以使用POI的API来设置行高和列宽。

    具体的代码实现可能比较复杂,需要根据你的具体需求和模板结构进行调整。你可能需要熟悉POI的API和模板功能,并根据你的需求进行定制化的开发。如果你需要更具体的帮助或示例代码,我可以进一步协助你进行调试和优化。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月21日
  • 创建了问题 1月21日