博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java+jxls利用excel模版进行导出
阅读量:5134 次
发布时间:2019-06-13

本文共 4587 字,大约阅读时间需要 15 分钟。

  大多时候会出现需要导出excel的功能,利用poi可以实现简单的导出,可以说poi的功能非常强大可以做到细节的定制化操作,但相对于在office操作excel,利用poi完全生成excel会显得非常复杂,细节代码会特别多。在这个时候我们可以事先利用offfice制定好一个模版文件,在利用jxls来通过模版文件来实现复杂excel的导出。

  模版的制作和一般excel的编写是一样的,在需要填充的网格利用{}来进行取出java中传进来的变量值,如图:

 

在java中:

InputStream is =getFileInputStream(templateFileName);//获取模板输入流XLSTransformer transformer = new XLSTransformer();HSSFWorkbook resultWorkbook =transformer.transformMultipleSheetsList(is,prints/*要打印的list*/, sheetNames/*sheet的名称list*/, "print"/*excel的bean名称*/, new HashMap(), 0);

  在excel中,jxls会将要打印的list通过我们定义的bean名称取出进行遍历,在源码中

public HSSFWorkbook transformMultipleSheetsList(InputStream is, List objects, List newSheetNames, String beanName, Map beanParams, int startSheetNum) throws ParsePropertyException {        HSSFWorkbook hssfWorkbook = null;        try {            if (beanParams != null && ((Map)beanParams).containsKey(beanName)) {                throw new IllegalArgumentException("Selected bean name '" + beanName + "' already exists in the bean map");            }            if (beanName == null) {                throw new IllegalArgumentException("Bean name must not be null");            }            if (beanParams == null) {                beanParams = new HashMap();            }            POIFSFileSystem fs = new POIFSFileSystem(is);            hssfWorkbook = new HSSFWorkbook(fs);            for(int sheetNo = 0; sheetNo < hssfWorkbook.getNumberOfSheets(); ++sheetNo) {                String spreadsheetName = hssfWorkbook.getSheetName(sheetNo);                if (!this.isSpreadsheetToRemove(spreadsheetName)) {                    if (this.isSpreadsheetToRename(spreadsheetName)) {                        hssfWorkbook.setSheetName(sheetNo, this.getSpreadsheetToReName(spreadsheetName));                    }                    HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(sheetNo);                    if (startSheetNum == sheetNo && objects != null && !objects.isEmpty()) {                        for(int i = 0; i < objects.size(); ++i) {                            Object bean = objects.get(i);                            String beanKey = beanName;                            if (i != 0) {                                beanKey = beanName + i;                                HSSFSheet newSheet = hssfWorkbook.createSheet((String)newSheetNames.get(i));                                Util.copySheets(newSheet, hssfSheet, beanName, beanKey);                                Util.copyPageSetup(newSheet, hssfSheet);                                Util.copyPrintSetup(newSheet, hssfSheet);                            } else {                                hssfWorkbook.setSheetName(sheetNo, (String)newSheetNames.get(i));                            }                            ((Map)beanParams).put(beanKey, bean);//在此次将我们传入的list通过map的形式放入beanParams                        }                    }                } else {                    hssfWorkbook.removeSheetAt(sheetNo);                    --sheetNo;                }            }        } catch (IOException var16) {            var16.printStackTrace();        }        if (hssfWorkbook != null) {            for(int i = 0; i < hssfWorkbook.getNumberOfSheets(); ++i) {                Util.setPrintArea(hssfWorkbook, i);            }        }        this.transformWorkbook(hssfWorkbook, (Map)beanParams);//通过模板和beanParams生产excel        return hssfWorkbook;    }
View Code

   在excel中通过beanParams的Map形式来进行取值,有点类似于freemarker语法,但不同于freemarker

  在此事例中,我定义了一个类(domain)来存放list,类的形式如下(即要打印的list的元素是以下类)

public class ExcelPrintDomain implements Serializable {    private List lista = new ArrayList();    private Object domaina;      private ServletContext context;    private int pageNo;       public ExcelPrintDomain() {    }    public ExcelPrintDomain(ServletContext context) {        this.context = context;    }    public void addDomain(Object obj) {        this.domains.add(obj);    }    public void addLista(Object obj) {        this.lista.add(obj);    }    public int getPageNo() {        return this.pageNo;    }    public void setPageNo(int pageNo) {        this.pageNo = pageNo;    }    public List getLista() {        return this.lista;    }    public void setLista(List lista) {        this.lista = lista;    }    public Object getDomaina() {        return this.domaina;    }    public void setDomaina(Object domaina) {        this.domaina = domaina;    }}
View Code

  所以在模板中${print.domaina.orgName}代表的是取出domain里面的domaina里面的key为orgName的value值,

  ${print.lista.ec01002}代表的是在遍历中取出domain中的lista包含的Map里面的key为ec01002的value值。

 

转载于:https://www.cnblogs.com/many-object/p/8404427.html

你可能感兴趣的文章
转载 C#文件中GetCommandLineArgs()
查看>>
list control控件的一些操作
查看>>
精读《useEffect 完全指南》
查看>>
SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本
查看>>
DrawerLayout实现双向侧滑
查看>>
MySQL入门很简单-触发器
查看>>
LVM快照(snapshot)备份
查看>>
绝望的第四周作业
查看>>
一月流水账
查看>>
数论四大定理
查看>>
npm 常用指令
查看>>
20几个正则常用正则表达式
查看>>
TextArea中定位光标位置
查看>>
非常棒的Visual Studo调试插件:OzCode 2.0 下载地址
查看>>
判断字符串在字符串中
查看>>
hdu4374One hundred layer (DP+单调队列)
查看>>
类间关系总结
查看>>
properties配置文件读写,追加
查看>>
Linux环境下MySql安装和常见问题的解决
查看>>
lrzsz——一款好用的文件互传工具
查看>>