jxls官方网站http://jxls.sourceforge.net/
jxls采用基于excel模板的方式来导出excel,支持
支持写sql语句导数据
简单属性访问
强大的表达式
报表导出
报表标签使用
列隐藏
动态样式
jdbc resultset导出
在一个单元格上使用多个bean的属性
合并单元格
动态分组
等等,底层采用的poi来操作excel,所以要下载poi,下列表是依赖包
* POI (3.5 or later)
* Commons BeanUtils
* Commons Collections
* Commons JEXL
* Commons Logging
* Commons Digester
使用模板的直接好处就是减少了设置excel相应单元格样式,复杂表格不好编码,手动填充数据,减少编码出错率等诸多不便之处。
简单的使用就不用做例子了,直接上一个难一点的。该功能最终的导出效果图如下
要求:1.导出的excel的表头是动态的且支持单元格合并,2.支持分组,通过设置合并单元格的属性,能自动将相同数据纵向合并单元格
所操作excel的模板图如下
测试用例所使用的简单bean
public class ExcelColumn {
private String value;
private int row;
private int col;
public ExcelColumn(String value, int row, int col) {
super();
this.value = value;
this.row = row;
this.col = col;
}
//getter/setter
}
public class Column {
private String sumweight;
private String count;
//getter/setter
}
public class FundsVO {
private String sumweight;
private String count;
//getter/setter
}
public class Head {
private String name;
//getter/setter
}
public class Record {
private String wasteType;
private Collection<ValueBean> valuebeans;
//getter/setter
}
public class ValueBean {
private String collector;
private Collection<FundsVO> fund;
//getter/setter
}
测试用例主体方法
@Test
public void dymicColumnTest() throws ParsePropertyException, InvalidFormatException, IOException {
List<Head> heads = new ArrayList<Head>();
Head col1 = new Head("南山");
Head col2 = new Head("龙岗");
heads.add(col1);
heads.add(col2);
List<Column> cols = new ArrayList<Column>();
Column co1 = new Column();
co1.setSumweight("垃圾净重量");
co1.setCount("车次");
cols.add(co1);
cols.add(co1);
List<Collection<ValueBean>> data = new ArrayList<Collection<ValueBean>>();
data.add(new ArrayList<ValueBean>());
data.add(new ArrayList<ValueBean>());
for (int k = 0; k < 2; k++) {
for (int i = 0; i < 3; i++) {
ValueBean con1 = new ValueBean();
con1.setCollector("收集者" + k);
Collection<FundsVO> fund = new ArrayList<FundsVO>();
for (int j = 0; j < 2; j++) {
FundsVO f1 = new FundsVO();
f1.setCount("1" + i + j);
f1.setSumweight("10" + j + i);
fund.add(f1);
}
con1.setFund(fund);
data.get(k).add(con1);
}
}
Collection<Record> records = new ArrayList<Record>();
Record r1 = new Record();
r1.setWasteType("生活垃圾");
r1.setValuebeans(data.get(0));
records.add(r1);
Record r2 = new Record();
r2.setWasteType("污水");
r2.setValuebeans(data.get(1));
records.add(r2);
Map map = new HashMap();
map.put("records", records);
map.put("heads", heads);
map.put("cols", cols);
String templateFileName = "D:\\workspace\\jxlsdemo\\src\\hi\\magicdetective\\dynmiccolumn\\dynmic.xls";
String destFileName = "D:\\workspace\\jxlsdemo\\src\\hi\\magicdetective\\dynmiccolumn\\dynmic_output.xls";
XLSTransformer transformer = new XLSTransformer();
//注册自定义合并单元格转换器
transformer.registerCellProcessor(new MultPropertyCellProcessor(new String[] { "record.wasteType" }));
transformer.transformXLS(templateFileName, map, destFileName);
}
package hi.magicdetective.dynmiccolumn;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import net.sf.jxls.parser.Cell;
import net.sf.jxls.processor.CellProcessor;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
/**
* 多属性合并单元格转换器
* @author ydw
*
*/
public class MultPropertyCellProcessor implements CellProcessor {
/**
* 合并属性集
*/
private String[] keys;
/**
* 合并数据集
*/
private Map<String, List<ExcelColumn>> mergedMap = new HashMap<String, List<ExcelColumn>>();
/**
* 合并属性的起始行列
*/
private Map<String, ExcelColumn> first = new HashMap<String, ExcelColumn>();
public MultPropertyCellProcessor(String[] keys) {
this.keys = keys;
}
/**
* 刚开始不明白这个Map namedCells参数的含义,通过跟踪源代码发现是下面类调用的
* SimpleRowTransformer
* private void applyCellProcessors(Sheet sheet, Cell cell) {
for (int i = 0; i < cellProcessors.size(); i++) {
CellProcessor cellProcessor = (CellProcessor) cellProcessors.get(i);
cellProcessor.processCell(cell, sheet.getNamedCells());
}
}
*/
@Override
public void processCell(Cell cell, Map namedCells) {
for (String key : keys) {
if (cell.getStringCellValue().contains(key)) {
first.put(key,
new ExcelColumn(key, cell.getPoiCell().getRowIndex(), cell.getPoiCell().getColumnIndex()));
}
}
//同行列,实际数据,不是表达式值
for (String key : keys) {
int firstRow = first.get(key) == null ? -1 : first.get(key).getRow();
int firstCol = first.get(key) == null ? -1 : first.get(key).getCol();
if (cell.getPoiCell().getRowIndex() == firstRow && cell.getPoiCell().getColumnIndex() == firstCol
&& !cell.getStringCellValue().contains(key)) {
String value = cell.getStringCellValue();
//由属性+值构成键
String tmpKey = key + "_" + value;
if (mergedMap.containsKey(tmpKey)) {
mergedMap.get(tmpKey).add(new ExcelColumn(value, firstRow, firstCol));
} else {
List<ExcelColumn> list = new ArrayList<ExcelColumn>();
list.add(new ExcelColumn(value, firstRow, firstCol));
mergedMap.put(tmpKey, list);
}
}
merged(cell.getPoiCell().getSheet(), mergedMap);
}
}
private void merged(Sheet sheet, Map<String, List<ExcelColumn>> map) {
Set<Entry<String, List<ExcelColumn>>> set = map.entrySet();
for (Entry<String, List<ExcelColumn>> entry : set) {
String tmpKey = entry.getKey();
int firstRow = 9999;
int lastRow = -1;
int colindex = 0;
for (ExcelColumn col : map.get(tmpKey)) {
colindex = col.getCol();
if (col.getRow() < firstRow)
firstRow = col.getRow();
if (col.getRow() > lastRow)
lastRow = col.getRow();
}
CellRangeAddress range = new CellRangeAddress(firstRow, lastRow, colindex, colindex);
sheet.addMergedRegion(range);
}
}
}
相关推荐
Java编程语言在处理数据导出,特别是在生成Excel文件时,提供了多种库,其中之一就是jxls。jxls是一个强大的工具,它允许我们使用Apache POI库的功能,但通过使用JSP标签和简单的模板来简化Excel文件的创建过程。...
**Jxls:基于模板生成Excel文件的神器** 在IT行业中,数据处理和报告生成是常见的需求,特别是当需要将大量数据导出为易于查看和分析的格式时,Excel表格成为了首选。而`jxls`正是一个Java库,它提供了一种高效、...
- 示例Java代码,演示了如何使用JXLS库读取模板、加载数据并生成Excel文件。 通过分析这些示例,你可以更深入地理解JXLS的工作机制,并学习如何将其应用到自己的项目中。例如,你可能会看到如何处理动态表格大小、...
"使用jxls2.X导出Excel文件"的主题涉及了如何利用Java来生成和操作Excel文档,尤其适用于需要动态生成内容的场景。在这个项目案例中,开发者使用了jxls库的最新版本(jxls2),它是一个强大的工具,能够帮助程序员将...
本项目专注于解决这一问题,通过使用`jxls2`库,能够实现复杂Excel模板的导出,包括单元格的合并,满足多种报表导出需求。现在我们将详细探讨这个项目的核心技术和应用场景。 首先,`jxls2`是一个强大的Java库,它...
jxls是一个基于Java的库,它允许开发者使用Apache POI库来扩展XLS(X)模板,从而动态生成Excel文件。 jxls的核心概念是通过模板和Java对象之间的映射关系,将业务数据填充到预定义的Excel模板中。这种方式使得开发者...
这里我们将深入探讨`jxls-poi`这个库,它是如何帮助我们从JSON数据生成Excel文件的。 `jxls`是一个Java库,它扩展了Apache POI项目,使得我们可以使用简单的模板语法来读写Excel文件。`jxls-poi`是`jxls`的一个分支...
jxls模板导出Excel教程 jxls是一种基于模板的报表生成工具,可以快速生成复杂的Excel报表。通过使用jxls,可以将报表生成过程简化,使其变得更加高效和灵活。 jxls的主要特点是使用模板来生成报表,用户可以根据...
`jxls2` 是一个Java库,它允许开发者使用简单的Excel模板来动态地生成或读取Excel文件。本篇文章将深入探讨如何使用 `jxls2` 库来导出Excel文件,同时参考《使用 jxls2.X 导出excel文件源码》这篇博客文章中的案例...
JXLS会根据模板和提供的数据来生成Excel文件。 3. **编写Java代码**:创建一个服务类,定义方法来处理Excel的导入和导出。导入操作通常涉及读取Excel文件并将其转换为Java对象;导出则相反,将Java对象转换为Excel...
Jxls库的核心功能在于提供了一种声明式的方式来处理Excel模板,通过使用Apache POI库来操作Excel文件。它的主要优点是将数据和样式分离,让开发者可以专注于业务逻辑,而无需关心底层Excel表格的细节。 首先,我们...
"jxls使用模板导出excel"这个压缩包可能包含了以下核心组件的jar文件: 1. jxls主库:如`jxls.jar`,提供了核心的模板处理功能。 2. Apache POI库:如`poi-ooxml-schemas.jar`, `poi-ooxml.jar`, `poi.jar`等,用于...
jxls是一个强大的库,它允许开发者使用模板技术来生成Excel文档,极大地简化了这一过程。jxls的核心理念是将Excel模板与Java对象绑定,通过模板语言(如Freemarker)来动态填充数据,从而实现数据的自动化导出。 **...
而当我们需要在Web应用程序中实现动态生成和导出Excel文件时,一种高效的方法是利用模板和特定的库,如jxls。本文将深入探讨如何使用jxls库,结合xls或xlsx模板,来实现Excel文件的导出和下载。 首先,了解jxls。...
本示例着重讲解如何利用Java的两个库——jxls和Apache POI,来实现动态生成Excel文件,以满足各种定制化的导出需求。 首先,Apache POI是一个流行的开源Java API,它允许开发者创建、修改和显示Microsoft Office...
JXLS,全称Java eXcel Library for Sheets,是一个基于Apache POI库的工具,它提供了一种直观的方式来操作Excel模板,将Java对象的数据绑定到模板的单元格中,从而生成定制化的Excel文件。这种方式使得开发者可以...
在使用JXLS时,需要在Excel模板文件中使用规定的语法来访问对象属性。例如,使用${department.name}来访问Department对象的name属性。JXLS引擎会通过关键字department在当前bean映射下搜索这个bean,然后尝试获取这...
在本场景中,它可能是接收用户请求导出Excel的端点,处理请求,调用业务逻辑,然后使用jxls库填充模板并生成Excel文件。Spring MVC的ModelAndView或ResponseEntity对象可以用来设置响应内容类型为"application/vnd....
4. **生成Excel文件**:执行填充操作后,JXLS会根据模板和数据生成一个新的Excel文件。 在实际应用中,JXLS的灵活性和效率使得它在Web应用、大数据报告生成等领域非常受欢迎。它可以处理复杂的条件格式、数据验证...
本示例"(简单)JFinal实现Demo - 导出Excel 使用模板导出(POI + JXLS)"提供了一种高效的方法来生成复杂的Excel表格,无需通过编程逐个控制单元格样式。以下是对这个Demo的详细解释: 首先,JFinal是一个基于Java...