java+jxls利用excel模版进行导出

  大多时候会出现需要导出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;
    }

在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;
    }
}

  所以在模板中${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

时间: 2024-10-05 01:45:24

java+jxls利用excel模版进行导出的相关文章

MVC模式下基于SSH三大框架的java web项目excel表格的导出(不依赖另外的jar包)

最近工作中碰到了需要将web页面的表格内容导出到excel表格并下载到本地的需求.以下是在利用网上资源.与同事探讨下,完成的代码. 首先我们需要有定义好的实体类.以下是截取了项目中用到的部分代码. 1 public class QyggDocuments implements java.io.Serializable { 2 3 private static final long serialVersionUID = -2543382529255041149L; 4 5 private Stri

Excel导出学习之道:Java Web利用POI导出Excel简单例子

采用Spring mvc架构: Controller层代码如下 [java] view plaincopy @Controller public class StudentExportController{ @Autowired private StudentExportService studentExportService; @RequestMapping(value = "/excel/export") public void exportExcel(HttpServletReq

使用jxls技术导入Excel模版数据(转自其他博客)

第一步:先确定好Excel导入的格式以及各表格字段值的含义 第二步:定义好解析的XML--videoConfig.xml <?xml version="1.0" encoding="UTF-8"?> <workbook> <worksheet name="Sheet1"> <section startRow="0" endRow="0"/> <loop

Java通过POI技术操作Excel(3)----数据导出

在之前的博客中,总结了Excel模板生成和Excel数据录入,然后剩最后一个模块,数据库中数据读取,在之前的基础上我们来看这一模块,应该已经非常容易了,接下来简单的介绍一下: 这里我们仍然以jsp+servlet为例,对SqlServer2005数据库进行操作,如下都是基本步骤: 1.连接数据库:2.根据sql语句获取数据库中值:3.将值进行导出操作: 首先,我们来记性数据库的连接,这个相信接触过java的人都不会陌生,我就不赘述了 1 public class DataBase { 2 pri

java将html导出成word(利用的poi包导出)

//导出到word public void exportWord(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception { DBTool tool = null ; try { /*** 查询数据库获得数据 **/ ArrayList records = form.getRecords(); if(

Java使用IText(VM模版)导出PDF

Java使用IText(VM模版)导出PDF: public String createPDF(ProjectManageBase projectManageBase) { Map map = new HashMap();// velocity模板中的变量 try { //模版vm的路径 String tmPath = ServletActionContext.getServletContext() .getRealPath("/pdf/vm"); String pdfPath = S

java实现excel的导入导出(poi详解)[转]

java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava 经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个阿帕奇公司的一个项目,后来被扩充了.是比较好用的excel导出工具. 下面来认识一下这个它吧. 我们知道要创建一张excel你得知道excel由什么组成,比如说sheet也就是一个工作表格,例如一行,一个单元格,单元格格式,单元格内容格式…这些都对应着poi里面的一个类. 一个excel表格: HSS

利用OpenXml读取、导出Excel

OpenXml是通过 XML 文档提供行集视图.由于OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表.视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML. 效果图: 使用它的时候,首选的下载安装这个程序集,下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=30425 安装好了在项目当中引用如下2个 前台弹出框用的是 jBox这个js插件,我用了ajax请求的方式来上传

excel的导入导出的实现

1.创建Book类,并编写set方法和get方法 1 package com.bean; 2 3 public class Book { 4 private int id; 5 private String name; 6 private String type; 7 // public int a; 8 9 public String getType() { 10 System.out.println("调用了类型方法"); 11 return type; 12 } 13 14 pu