jxls根据模板导出Excel(二)

说明:本文是jxls根据模板导出Excel直接下载。

使用版本:jxls V2.10.0

excel模板版本:.xlsx格式

jxls官网地址:https://jxls.sourceforge.net/index.html

1、pom引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
           <groupId>org.jxls</groupId>
           <artifactId>jxls</artifactId>
           <version>2.10.0</version>
       </dependency>
       <dependency>
           <groupId>org.jxls</groupId>
           <artifactId>jxls-poi</artifactId>
           <version>2.10.0</version>
       </dependency>
       <dependency>
           <groupId>org.jxls</groupId>
           <artifactId>jxls-jexcel</artifactId>
           <version>1.0.8</version>
       </dependency>
       <dependency>
           <groupId>org.apache.commons</groupId>
           <artifactId>commons-jexl</artifactId>
           <version>2.1.1</version>
       </dependency>

  2、Controller调用方法

1
2
3
4
5
6
7
@PostMapping("/export")
    public AjaxResult export(HttpServletResponse response, Data data) throws IOException {
        String fileName = "test.xlsx";
        Map<String, Object> model  = dataService.getExportData(data,fileName);//拼接需要导出的内容
        response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        return JxlsUtils.exportExcelWithOS(response.getOutputStream(),fileName, model);
    }

  3、拼接数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Map<String, Object> getExportData(Data data,String fileName) {
        Map<String, Object> model = new HashMap<String, Object>(); // 绑定数据
        try {
            //可绑定单个参数,Excel模板中单元格直接用${test1}获取
            model.put("test1", "ttt");
             
            //可绑定list,使用${item.参数名}获取,需在列表首个单元格中增加批注
            List<Data1> taskItems = new ArrayList<Data1>();//Data1为某个数据类
            for (int i=0;i<5;i++) {
                Data1 d=new Data1;
                //d.setA("111");
                taskItems.add(d);
            }
 
            model.put("taskItems", taskItems);
 
        }catch (Exception ex){
            logger.error(ex.getMessage());
            System.out.println(ex.getMessage());
        }
        return model;
    }

  4、Excel导出方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlEngine;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.io.*;
import java.util.HashMap;
import java.util.Map;
 
 
public class JxlsUtils {
    static{
        
    }
 
    /**
     * 根据模板生成文件,直接下载
     * @param os 流数据
     * @param templateFileName 模板文件名称
     * @param model 填充数据
     * @throws IOException
     */
    public static AjaxResult exportExcelWithOS(OutputStream os , String templateFileName, Map<String, Object> model) throws IOException{
        // 获取模板文件
        InputStream is = new FileInputStream(new File(模板文件路径地址 + templateFileName));
        try {
            // 输出
            Context context = PoiTransformer.createInitialContext();
            if (model != null) {
                for (String key : model.keySet()) {
                    context.putVar(key, model.get(key));
                }
            }
            JxlsHelper.getInstance().setUseFastFormulaProcessor(false).setEvaluateFormulas(true).processTemplate(is, os, context);
        }
        catch (Exception ex){
            System.out.println(ex.getMessage());
            logger.error(ex.getMessage());
            return AjaxResult.error(ex.getMessage());
        }finally {
            is.close();
        }
        return AjaxResult.success();
    }
}

  5、Excel模板,创建xlsx格式模板

添加批注,第一个单元格添加范围批注,jx:area(lastCell="K3")

list列表增加jx:each(items="taskItems" var="item" lastCell="K3")

 

之前写过另一种方法,先根据模板生成Excel,然后调用方法导出,可参考:https://www.cnblogs.com/webttt/p/14283481.html

 

posted on   七七2020  阅读(805)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2019-06-20 c# 获取月份的天数
2018-06-20 laravel excel导出调节列宽度,对某列中数据颜色处理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示