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

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

  1. JAVA实现创建Excel表并导出(转发)

    <span style="font-family:Verdana, Arial, Helvetica, sans-serif;line-height:25.2px;background ...

  2. 使用Layui、Axios、Springboot(Java) 实现EasyExcel的导入导出(浏览器下载)

    实现EasyExcel的导入导出(浏览器下载) 实现三个按钮的功能,但是却花费了一天的时间包括总结. 使用到的技术:springboot layui axios EasyExcel mybatis-p ...

  3. JAVA实现Excel导出数据(以写好的Excel模版导出)

    工作中经常会有将后台数据以Excel导出的功能. 简单的方法有将response的contentType设置为application/vnd.ms-excel: 或在JSP页面直接设置成: <% ...

  4. JXLS (Excel导入、导出工具使用)

    JXLS (Excel导入.导出工具使用) 1:简介: jxls是一个简单的.轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局.java中成熟的excel导出工具有p ...

  5. JAVA对Excel的导入导出

    今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...

  6. Java基于注解和反射导入导出Excel

    代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...

  7. [poi使用]使用excel模版导出excel

    ​ Apache POI是基于Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)处理各种文件格式的开源项目.简而言之,您可以使用Java读写MS ...

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

    java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava  经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...

  9. POI3.10 根据Excel模版导出数据测试

    1:所需jar包 2:Mysql数据库表内容如下: 3:代码结构如下: (1)User.java public class User { private int id; private String ...

随机推荐

  1. C语言提高 (1) 第一天 数据类型本质与内存四区

    (物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...

  2. Top English interview Q&A

    http://www.hjenglish.com/new/p581292/ vocabulary endeavour [ɪn'devər] relevant ['reləvənt] , efficie ...

  3. nginx反向代理时保持长连接

    ·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 如果我们使用了nginx去作为 ...

  4. MyBatis中动态SQL元素的使用

    掌握MyBatis中动态SQL元素的使用 if choose(when,otherwise) trim where set foreach <SQL>和<include> 在应 ...

  5. CF914A Perfect Squares

    CF914A Perfect Squares 题意翻译 给定一组有n个整数的数组a1,a2,…,an.找出这组数中的最大非完全平方数. 完全平方数是指有这样的一个数x,存在整数y,使得x=y^2y2  ...

  6. chrome隐身模式无法播放flash的解决办法

    困扰很多天的chrome无法播放flash的问题终于解决了 因为之前一直用隐身模式,一直不能播放flash,重装chrome,重装插件,还是不行 结果今天发现正常模式是可以播放的,所以找了一下chro ...

  7. spring boot系列--spring security (基于数据库)登录和权限控制

    先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecurity 3 publ ...

  8. 用Python实现简单的服务器

    socket接口是实际上是操作系统提供的系统调用.socket的使用并不局限于Python语言,你可以用C或者JAVA来写出同样的socket服务器,而所有语言使用socket的方式都类似(Apach ...

  9. OpenLayers3基础教程——OL3 介绍control

    概述: 本文讲述的是Ol3中的control的介绍和应用. OL2和OL3 control比較: 相比較Ol2的control,OL3显得特别少,下图分别为Ol2和Ol3的control: Ol2的c ...

  10. Linux Unix shell 编程指南学习笔记(第三部分)

    第十三章  登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...