Springboot——jxls实现同sheet多个列表展示

文章目录

前言

在之前的博客中Springboot------使用jxls实现excel模板导出excel,具体说明了jxls框架的基本使用。

除了最简单的单列表展示外,jxls还具有同sheet页展示多个列表的能力,接下来一起继续探究。

制定模板

1、限定模板数据的范围

采取下面的批注,指定需要渲染显示的报表范围。

这里的范围只考虑第一行的范围!

命令如下所示:

复制代码
jx:area(lastCell="H15")

2、设定报表展示项

报表一,只显示单条数据。

报表二,进行列表展示,并设置批注,如下所示:

复制代码
jx:each(items="dataList2" var="item" lastCell="C8")

报表三,与报表二中的批注一样,只是接收参数变量名不同。批注如下所示:

复制代码
jx:each(items="dataList3" var="item" lastCell="C12")

编写测试类

1、将xls模板文件放于 resource 下的 doc文件夹中

2、导入依赖文件

xml 复制代码
<!-- excel 填充 -->
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.8.1</version>
</dependency>
<dependency>
    <groupId>net.sf.jxls</groupId>
    <artifactId>jxls-core</artifactId>
    <version>1.0.6</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>2.8.1</version>
</dependency>

3、编写接口和导出逻辑

java 复制代码
@RequestMapping("/ss")
public void download(HttpServletRequest request,HttpServletResponse response) throws Exception {

    Map<String, Object> map = new HashMap();
    map.put("name1","xiangjiao");
    map.put("age1","10");
    map.put("are1","中国");

    // 报表二
    List<Map<String, Object>> dataList = new ArrayList();
    for (int i = 0; i < 10; i++) {
        Map<String, Object> params = new HashMap<>();
        params.put("name2","1_"+i);
        params.put("age2","xj_"+i);
        params.put("are2",22);
        dataList.add(params);
    }
    // ${item.num}
    map.put("dataList2",dataList);

    // 报表三
    List<Map<String, Object>> dataList3 = new ArrayList();
    for (int i = 0; i < 10; i++) {
        Map<String, Object> params = new HashMap<>();
        params.put("name2","1_"+i);
        params.put("age2","xj_"+i);
        params.put("are2",22);
        dataList3.add(params);
    }
    // ${item.num}
    map.put("dataList3",dataList3);

    export(map,"test.xls","666.xls",response);
}

public static void export(Map<String, Object> dataMap, String reportName,String fileName, HttpServletResponse response) throws IOException {
    Resource resource = new ClassPathResource("/doc" +File.separator+ reportName);
    InputStream in = resource.getInputStream();
    // 这里的context是jxls框架上的context内容
    Context context = PoiTransformer.createInitialContext();
    context.toMap().putAll(dataMap);
    Workbook workbook = WorkbookFactory.create(in);
    // Changing name of the first sheet
    workbook.setSheetName(0, "sheet1");
    PoiTransformer transformer = PoiTransformer.createTransformer(workbook);
    OutputStream out = response.getOutputStream();
    transformer.setOutputStream(out);

    // 文件名 - 解决中文乱码问题
    String filename = URLEncoder.encode(fileName, "UTF-8");
    // 设置响应编码
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/x-download");
    response.setHeader("Content-Disposition", "attachment;filename=" + filename);

    JxlsHelper.getInstance().processTemplate(context, transformer);
    in.close();

    out.flush();
    out.close();
}

效果预览

结论

jxls能够完美的实现样式自定义单数据多报表集成。

相关推荐
傻瓜搬砖人36 分钟前
SpringBoot整合Junit-Redis-打包
spring boot·redis·junit
Arya_aa3 小时前
数据字典模块–MapStruct对象转换与加密处理
spring boot
RuoyiOffice3 小时前
2026 年开源 BPM/工作流引擎大盘点:Flowable vs Camunda vs Activiti vs Turbo——谁才是企业级首选?
java·spring boot·后端·开源·流程图·ruoyi·anti-design-vue
贫民窟的勇敢爷们4 小时前
Spring Boot+Vue电商系统开发实战:架构设计与核心实现
vue.js·spring boot·后端
星光开发者4 小时前
基于springboot电动汽车租赁管理系统-计算机毕设 附源码 11217
javascript·spring boot·mysql·django·php·html5·express
苍煜5 小时前
SpringBoot Spring事务完整版详解:@Transactional注解实操 + 七大事务传播机制用法
spring boot·spring·oracle
ffqws_5 小时前
Spring Boot 配置读取全解析:从 application.yml 到 Java 对象的完整链路
java·数据库·spring boot
RuoyiOffice5 小时前
SpringBoot+Vue3 实现 OA 公文外来文与归档台账:外部收文、BPM办理、三类公文统一归档
spring boot·微服务·uni-app·vue·ruoyi·anti-design-vue·ruoyioffice
callJJ16 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
海兰16 小时前
【第27篇】Micrometer + Zipkin
人工智能·spring boot·alibaba·spring ai