java根据模板导出excel

前言:

       最近项目中需要根据excle模板生成想要的excle文件,网上查阅资料后通过Jxls 库提供的方法得到解决,这里记录一下方法。文章末尾会附源码地址。

      Jxls 文档地址

首先新建excle模板,如图

我们希望数据能动态加入,预期结果就像这样

接下来在我们的模板中加入jxls表达式,点击表格中我们用到范围中的第一个格子,鼠标右键---->插入批注,如图

  

 

说明:我们通过插入批注的方式来定义我们表格中所用到的表达式,表格中带右上角有红色标志的地方为加入批注,这里标题也弄成动态赋值,方便大家学习。

        jx:area(lastCell="D3")   定义我们用到的表格的范围 lastCall="D3" 这里表示我们用到的范围为A1到D3。

问题:  为什么是A1开始?因为第一行我们由于标题需要,所以进行了合并  其实我们最开始的位置因该是A1 ,也就是说只要表达式写在那个格子里面,就默认从当前格子开始,合并的就从合并的第一个格子开始算,lastCell 值为多少就默认为到哪个格子结束。

           为什么D3就要定义为结束?因为我们的模板所用的范围只到了D3 。

       jx:each(items="list" var="item" lastCell="D3")      想到与for循环 items="集合名称" ,  var="对象" ,lastCell="D3" 循环结束的位置。

 

更多表达式参见Jxls 文档地址

 

接下来创建maven项目,pom.xml引入依赖

<!--对象 get set插件 便于简写对象属性get set 方法  非必须-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <!--必须-->
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-poi</artifactId>
            <version>1.1.0</version>
        </dependency>

        <!--      日志包  非必须  避免控制台提示日志相关警告信息-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>

学生对象Student.java,这里使用了lombok表达式, 加入@Data注解后省去了get、set  以及构造方法的书写,不用的可以自行加入对应方法

@Data
public class Student {
    private String name;
    private int age;
    private String sex;
    private String className;

}

打印类print.java


import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class Print {
    /**
     * 打印方法
     * @throws Exception
     */
    public static void print() throws Exception {
        //准备数据
        List<Student> list = new ArrayList<Student>();
        for (int i = 0; i < 20; i++) {
            Student stu = new Student();
            stu.setAge(i);
            stu.setClassName("一年级");
            stu.setName("张三" + i);
            stu.setSex("男");
            list.add(stu);
        }
        //获取模板文件,你自己当前模板的位置  我这里为当前项目下
        //如果为系统路径 为: InputStream is = new FileInputStream("F://student.xlsx");
        InputStream is = Print.class.getClassLoader().getResourceAsStream("student.xlsx");
        //根据模板生成的文件保存路径  我这里保存在本地D盘
        OutputStream os = new FileOutputStream("D://student.xlsx");
        //绑定数据
        Context context = new Context();
        context.putVar("title", "学上统计表");
        context.putVar("list", list);
        //生成
        JxlsHelper.getInstance().processTemplate(is, os, context);
    }
    
    public static void main(String[] args) throws Exception {
        print();
    }

}

特别注意的地方就是数据绑定那里,如果你是对象取值就为对象.属性。运行main方法,去保存的路径下查看生成的文件,效果如图

最后希望能帮助大家!源码中加入了 图片的插入,有兴趣的可以看一下。

源码地址https://gitee.com/xu0123/java.git

根据excel模板动态导出数据库数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值