【开发实践】使用POI实现导出带有复杂表头的的excel文件

一、需求分析

公司业务部门需要,根据一些数据,加上表头,导出需要的excel表格。效果如下:

二、代码实现

【依赖准备】

XML 复制代码
        <!-- POI -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>

对于excel样式,笔者的做法是,读取设置好的xlsx模板样式,设置导出表格的样式。

poi导出的各类样式设置

笔者的样式设置:

java 复制代码
    public static void setPrintSetupInfoMargin(Sheet templeteSheet, Sheet outputSheet, String type) {
        PrintSetup psTemplete = templeteSheet.getPrintSetup();
        PrintSetup psOutput = outputSheet.getPrintSetup();

        //页眉边距设置
        psOutput.setHeaderMargin(psTemplete.getHeaderMargin());
        psOutput.setFooterMargin(psTemplete.getFooterMargin());
        //设置宽、高页数以适合纸张
        psOutput.setFitWidth(psTemplete.getFitWidth());
        psOutput.setFitHeight(psTemplete.getFitHeight());
        //设置纸张尺寸
        psOutput.setPaperSize(psTemplete.getPaperSize());
        //设置页码开始
        psOutput.setPageStart(psTemplete.getPageStart());
        //设置是否横向打印
        psOutput.setLandscape(psTemplete.getLandscape());
        //设置是按顺序从左到右还是自上而下
        psOutput.setLeftToRight(psTemplete.getLeftToRight());
        //设置是否处于草稿模式
        psOutput.setDraft(psTemplete.getDraft());
        //设置比例
        psOutput.setScale(psTemplete.getScale());
        //页边距设置
        psOutput.setHeaderMargin(psTemplete.getHeaderMargin());
        psOutput.setFooterMargin(psTemplete.getFooterMargin());
        if (".xls".equals(type)) {
            psOutput.setScale((short) (psTemplete.getScale()+5));
            outputSheet.setMargin(HSSFSheet.TopMargin, templeteSheet.getMargin(SXSSFSheet.TopMargin));
            outputSheet.setMargin(HSSFSheet.BottomMargin, templeteSheet.getMargin(SXSSFSheet.BottomMargin));
            outputSheet.setMargin(HSSFSheet.RightMargin, templeteSheet.getMargin(SXSSFSheet.RightMargin));
            outputSheet.setMargin(HSSFSheet.LeftMargin, templeteSheet.getMargin(SXSSFSheet.LeftMargin));
        }else {
            outputSheet.setMargin(SXSSFSheet.TopMargin, templeteSheet.getMargin(SXSSFSheet.TopMargin));
            outputSheet.setMargin(SXSSFSheet.BottomMargin, templeteSheet.getMargin(SXSSFSheet.BottomMargin));
            outputSheet.setMargin(SXSSFSheet.RightMargin, templeteSheet.getMargin(SXSSFSheet.RightMargin));
            outputSheet.setMargin(SXSSFSheet.LeftMargin, templeteSheet.getMargin(SXSSFSheet.LeftMargin));
        }

        //页面打印选项设置(根据模板的选择来设置)
        outputSheet.setFitToPage(templeteSheet.getFitToPage());
        //页脚设置
        Footer psTempletefooter = templeteSheet.getFooter();
        Footer psOutputfooter = outputSheet.getFooter();
        psOutputfooter.setCenter(psTempletefooter.getCenter());
        //页眉设置省略。。。

        //设置标题(实现打印时每一页都有同个头部标题)
        outputSheet.setRepeatingRows(templeteSheet.getRepeatingRows());
        outputSheet.setRepeatingColumns(templeteSheet.getRepeatingColumns());

    }

根据模板设置长宽:

java 复制代码
//设置行宽度、行高度
for (int i = 0; i < items.get(0).length + 3; i++) {
    sheet.setColumnWidth(i, tempSheet.getColumnWidth(i));
}

设置表头样式:

java 复制代码
//设置合并区域
sheet.addMergedRegion(new CellRangeAddress(startLine + 2, startLine + 3, itemLists.length - 1, itemLists.length - 1));

效果图片:

手动控制分页的情况:

java 复制代码
//设置分页符
sheet.setRowBreak(currNowCow - 1);

效果如下:


项目涉密,不能贴完整代码,谢谢理解哈!

相关推荐
掐指一算乀缺钱18 分钟前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑23 分钟前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
就这个java爽!28 分钟前
JAVA网络编程【基于TCP和UDP协议】超详细!!!
java·开发语言·网络·tcp/ip·udp·eclipse·idea
一叶飘零_sweeeet32 分钟前
为什么 Feign 要用 HTTP 而不是 RPC?
java·网络协议·http·spring cloud·rpc·feign
天下无贼!39 分钟前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
飞翔的佩奇1 小时前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
懒洋洋大魔王1 小时前
7.Java高级编程 多线程
java·开发语言·jvm
茶馆大橘1 小时前
【黑马点评】已解决java.lang.NullPointerException异常
java·开发语言
星辰@Sea1 小时前
服务注册中心对比及使用场景分析
java·云原生
马剑威(威哥爱编程)1 小时前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization