大多时候会出现需要导出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. Python——Day1(笔记代码)

    #print('Hello World')"""n1=input('请输入用户名:')print(n1)n2=input('请输入密码:')print(n2)" ...

  2. django创建第一个子文件夹

    1.首先安装python, 我安装了Python2.7的版本,安装在了D:\Python25\2.接着安装django,我下载了django 1.6的版本.3. 安装完了之后,打开cmd,然后可以检验 ...

  3. [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)

    传送门 题目描述 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m ...

  4. [poj 2411]Mondriaan's Dream (状压dp)

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...

  5. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  6. FFT卷积相加模板

    struct Complex { double r,i; Complex(double _r,double _i):r(_r),i(_i){} Complex(){} Complex operator ...

  7. web.xml 中context-param元素

    context-param元素含有一对参数名和参数值,用作应用的ServletContext上下文初始化参数.参数名在整个Web应用中必须是惟一的 param-name 子元素包含有参数名,而para ...

  8. 【MongoDB】The basic operation of Index in MongoDB

    In the past four blogs, we attached importance to the index, including description and comparison wi ...

  9. iOS开发之autoLayout constraint

    前言 ios设备的尺寸越来越多,针对一款app可能要适配到多种设备.多种尺寸.所以.我们期望我们的app可以autoLayout.本文主要介绍在Xcode中使用constraint.未来会不定期对此文 ...

  10. LeetCode题解 || Longest Substring Without Repeating Characters (O(n)算法)问题

    problem: Given a string, find the length of the longest substring without repeating characters. For ...