JXLS 导出多sheet,带页眉页脚

java 复制代码
    /**
     * 生成多sheet Excel
     * 带自定义页眉页脚
     *
     * @param templatePath
     * @param sheetList
     * @return
     * @throws IOException
     */
    public static byte[] generateMultiSheet(String templatePath, List<JxlsHelper2.SheetContext> sheetList) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //设置页眉页脚等布局
        try (InputStream is = new ClassPathResource(templatePath).getInputStream()) {
            XSSFWorkbook wb = new XSSFWorkbook(is);
            for (JxlsHelper2.SheetContext sheetContext : sheetList) {
                if (StringUtils.isEmpty(sheetContext.getName())) {
                    continue;
                }
                XSSFSheet sheet = wb.getSheet(sheetContext.getName());
                if (sheet != null) {
                    translateHeaderTemplate(sheet, sheetContext.getContext());
                }
            }
            wb.write(baos);
            //渲染数据
            ByteArrayOutputStream targetStream = new ByteArrayOutputStream();
            try (InputStream templateStream = new ByteArrayInputStream(baos.toByteArray())) {
                JxlsHelper2 jxlsHelper = JxlsHelper2.getInstance();
                Transformer transformer = jxlsHelper.createTransformer(templateStream, targetStream);
                jxlsHelper.processTemplate(sheetList, transformer);

            }

            return targetStream.toByteArray();
        }
    }
复制代码
重写 package org.jxls.util.JxlsHelper;
java 复制代码
    /**
     * jx:area(lastCell="R3" multisheet ="sheets")
     *
     * @param sheetList
     * @param transformer
     * @throws IOException
     */
    public void processTemplate(List<SheetContext> sheetList, Transformer transformer) throws IOException {
        areaBuilder.setTransformer(transformer);
        List<Area> xlsAreaList = areaBuilder.build();
        for (Area xlsArea : xlsAreaList) {
            String sheetName = xlsArea.getStartCellRef().getSheetName();
            Optional<SheetContext> optional = sheetList.stream().filter(s -> Objects.equals(sheetName, s.getName())).findAny();
            if (optional.isPresent()) {
                xlsArea.applyAt(new CellRef(xlsArea.getStartCellRef().getCellName()), optional.get().getContext());
            }
        }
        if (processFormulas) {
            for (Area xlsArea : xlsAreaList) {
                setFormulaProcessor(xlsArea);
                xlsArea.processFormulas();
            }
        }
        if (isHideTemplateSheet()) {
            List<String> sheetNameTemplate = getSheetsNameOfMultiSheetTemplate(xlsAreaList);
            for (String sheetName : sheetNameTemplate) {
                transformer.setHidden(sheetName, true);
            }
        }
        if (isDeleteTemplateSheet()) {
            List<String> sheetNameTemplate = getSheetsNameOfMultiSheetTemplate(xlsAreaList);
            for (String sheetName : sheetNameTemplate) {
                transformer.deleteSheet(sheetName);
            }
        }
        transformer.write();
    }

增加DTO

java 复制代码
    @Data
    @AllArgsConstructor
    public static class SheetContext {
        /**
         * sheet name
         */
        private String name;
        private Context context;
    }

调用:

java 复制代码
            List<JxlsHelper2.SheetContext> sheetList = new ArrayList<>();
            Context context = new Context();
            for (String key : contextMap.keySet()) {
                context.putVar(key, contextMap.get(key));
            }
            sheetList.add(new JxlsHelper2.SheetContext("Sheet1", context));

            //
            Map<String, Object> contextMap2 = defaultExcelReportProvider.getContextMap("7777", "333", "测试", data);
            Context context2 = new Context();
            for (String key : contextMap2.keySet()) {
                context2.putVar(key, contextMap2.get(key));
            }
            sheetList.add(new JxlsHelper2.SheetContext("Sheet2", context2));
            byte[] bytes = JxlsUtil.generateMultiSheet(getExcelTemplatePath(), sheetList);
相关推荐
wuminyu12 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ13 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy14 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo15 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup16 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
9523616 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.16 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-194316 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心122116 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px16 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋