jxls根据模板导出Excel(二)

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

使用版本:jxls V2.10.0

excel模板版本:.xlsx格式

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

1、pom引用

 <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调用方法

@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、拼接数据

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导出方法

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 2023-06-20 16:43  七七2020  阅读(615)  评论(0编辑  收藏  举报

导航