jxls2.3-简明教程
jxls是⼀个简单的、轻量级的excel导出库,使⽤特定的标记在excel模板⽂件中来定义输出格式和布局。java中成熟的excel导出⼯具有pol、jxl,但他们都是使⽤java代码的⽅式来导出excel,编码效率很低且不⽅便维护。
另外,jxls2.3的运⾏效率也相当不错,经过测试,在禁⽤⽇志输出的情况下,导出excel单表66535条记录仅仅3000毫秒,与poi⼏乎没什么⼤的差距。
excel模板⽰例:
Excel模板标记在jxls中的作⽤分为三部分:
1. bean属性标记
2. XLS Area定义标记
3. XLS Command表⽰标记
bean属性标记
jxls使⽤ Apache JEXL表达式语⾔来解析定义在excel模板中的表达式。JEXL与JSTL相似,并对JSTL进⾏了扩展。eg:${department.chief.age} //属性可以是⽆限深度
${utils:dateFmt(date,"yyyy-MM-dd")} //⾃定义⼯具函数
XLS Area定义标记
XLS Area 是JxlsPlus中的⼀个重要概念,它代表excel模板中需要被解析的矩形区域,由A1到最后⼀个单元格表⽰,有利于加快解析速度。XLS Area 使⽤excel注释标注表⽰,它需要被定义在excel 模板的第⼀个单元格(A1):
jx:area(lastCell = "<AREA_LAST_CELL>")
这个标记定义了excel模板需要被解析的矩形区域为:A1到<AREA_LAST_CELL>。
XLS Command表⽰标记
XLS Command 使⽤excel注释标注表⽰,命令格式如下:
jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2",
... "<command_areaN>"])
<command_name> 是库⾃带的命名或是⽤户⾃定义并注册到XlsCommentAreaBuilder的命令。
each 命令是最常⽤的XLS命令,形如:
jx:each(items="employees" var="employee" lastCell="D4")
each 可以有如下⼀些属性:
items 上下⽂中集合的变量名;
var 在遍历集合的时候每⼀条记录的变量名;
area 该XLS Command的解析区域;
direction 数据在excel中填充的⽅向,默认(DOWN)向下;
select 其值为⼀个表达式,⽤来过滤数据。
jexl⾃定义⼯具函数
如果你需要⾃定jexl来处理数据,你可以从Transformer对象获取JexlEngine引⽤,并对其配置。
下⾯的例⼦实现了将⼀个⾃定义jexl函数注册到utils命名空间下:
JxlsHelper jxlsHelper = Instance();
Transformer transformer = ateTransformer(is, os);
JexlExpressionEvaluator evaluator = (TransformationConfig().getExpressionEvaluator();
Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put("utils", new JxlsUtils()); //添加⾃定义功能
demo
⼯程⽬录:
Employee.java
public class Employee {
private String name;
private Date birthDate;
private BigDecimal payment;
private BigDecimal bonus;
// getter and setter
}
建⽴excel模板:
⼯具类JxlsUtils.java
public class JxlsUtils {
public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {  Context context = new Context();
if (model != null) {
for (String key : model.keySet()) {
context.putVar(key, (key));
}
}
JxlsHelper jxlsHelper = Instance();
Transformer transformer = ateTransformer(is, os);
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) TransformationConfig()
.getExpressionEvaluator();
Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put("utils", new JxlsUtils()); // 添加⾃定义功能
jxlsHelper.processTemplate(context, transformer);
}
// ⽇期格式化
public String dateFmt(Date date, String fmt) {
if (date == null) {
return "";
}
try {
SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);
return dateFmt.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return "";
bigdecimal格式化两位小数}
// if判断
public Object ifelse(boolean b, Object o1, Object o2) {
return b ? o1 : o2;
}
}
⼊⼝ObjectCollectionDemo.java
public class ObjectCollectionDemoXlsx {
static Logger logger = Logger(ObjectCollectionDemoXlsx.class);
public static void main(String[] args) throws ParseException, IOException {
logger.info("Running Object Collection demo");
List employees = generateSampleEmployeeData();
OutputStream os = new FileOutputStream("target/object_collection_output.xlsx");
Map model=new HashMap();
model.put("employees", employees);
model.put("nowdate", new Date());
InputStream inputStream = ClassLoader()
.getResourceAsStream("jxls-template/object_collection_template.xlsx");
os.close();
}
public static List generateSampleEmployeeData() throws ParseException {
List employees = new ArrayList();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd", Locale.US);
employees.add( new Employee("Elsa", dateFormat.parse("1970-Jul-10"), 1500, 0.15) );
employees.add( new Employee("Oleg", dateFormat.parse("1973-Apr-30"), 2300, 0.25) );
employees.add( new Employee("Neil", dateFormat.parse("1975-Oct-05"), 2500, 0.00) );
employees.add( new Employee("Maria", dateFormat.parse("1978-Jan-07"), 1700, 0.15) );
employees.add( new Employee("John", dateFormat.parse("1969-May-30"), 2800, 0.20) );        return employees;
}
}
⽣成效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。