jxls读取模板导出Excel学习笔记

jxls读取模板导出Excel学习笔记

​ jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。除此以外,java中成熟的excel导出工具有poi、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。

jxls的运行效率相对于 jxl、poi要慢,但导出数据量较小的时候使用它,可以加快编码的速度,毕竟用起来简单方便。

源码方法

最核心的方法是 jxls-core 的jar包中XLSTransformer 类,里面有transformXLS() 重载的三种形式,我只摘出了方法签名部分,如下:

/** 参数1:模板文件路径
  * 参数2:填入表格的对象数据
  * 参数3:输出文件的路径
  * 这个方法读取模板,写入数据,写入输出文件一起完成
  */
public void transformXLS(String srcFilePath, Map beanParams, String destFilePath)  
/** 参数1:模板文件输入流
  * 参数2:填入表格的对象数据
  * 返回工作簿对象,后续的write()写入输出文件流需要手动进行
  */
public Workbook transformXLS(InputStream is, Map beanParams)
/** 与第二个方法类似,返回工作簿对象,后续的write()写入输出文件流需要手动     
  * 进行。看起来应该是支持往多个sheet页中填入数据
  */
public Workbook transformXLS(InputStream is, List templateSheetNameList, List sheetNameList, List beanParamsList)

编码使用

定义好要填入表格的对象,通过beanParams传入transformXLS()

Map<String,Object> map = new HashMap<String,Object>();   
map.put("department", MyDepartment);  
transformer.transformXLS(srcFilePath, map, destFilePath);  

编写excel输出格式

a. 使用下面的语句来访问Excel单元格中简单的bean属性:

​${department.name}  // 注意department是Map中的key

Map中可以放多个队形,每个对象用各自的 name.perproty 访问即可。

访问任何深度的对象属性都是可以的。例如

${bean.bean1.bean2.bean3.bean4.bean5.bean6.bean7}

b. 多个属性在一个单元格中在一个单元格,我们可以连接几个属性。例如:

Employee: ${employee.name} - ${employee.age} years old

这样,我们得到的输出是:

Employee: John - 35 years 

c. : 用于迭代, 属性有2个, 一个是items, 一个是var, 类似java中的foreach循环,items表示集合,var表示集合中的单个对象。

如果你把jx:forEach标签的开始标签和结束标签放在同一行的话,JXLS会在同一行上重复在jx:forEach

标签的开始标签和结束标签之间的Excel单元格。 如果你想要用jx:forEach标签重复Excel的行,那么你必须把jx:forEach标签的开始标签和结束标签放在不同的行,把要重复的行包含在中间,jx:forEach标签本身所在行的所有单元格都会被忽略。

​ forEach标签的筛选功能 : 你可以用jx:forEach标签的‘select’属性来选择把哪些记录包含在循环中,例如,如果我们想只包含工资高于 2000元的员工,我们可以使用下面的语句:

<jx:forEach items="${employees}" var="employee" select="${employee.payment > 2000}"> 
  {employee.name} | {employee.payment} | ${employee.bonus} 
</jx:forEach>

items的值,employees对应放入map中的key,value是我们的数据对象。

更多用法可以参考百度文库

1.2 示例

a. bean

public class Fruit {   
    private String name; // 水果名称  
    private float price; // 水果价格  
    // getter setter
}

b. 核心工具类

public class ExcelUtil {  
    /** 
     * 根据模板生成Excel文件. 
     * @param templateFileName 模板文件. 
     * @param list 模板中存放的数据. 
     * @param resultFileName 生成的文件. 
     */  
    public void createExcel(String templateFileName, List<?> list, String resultFileName){  
        try {   
            //创建XLSTransformer对象  
            XLSTransformer transformer = new XLSTransformer();  

            //获取java项目编译后根路径  
            URL url = this.getClass().getClassLoader().getResource("");  

            //得到模板文件路径  
            String srcFilePath = url.getPath() + templateFileName;  
            Map<String,Object> map = new HashMap<String,Object>();   
            map.put("list", list);  
            String destFilePath = url.getPath() + resultFileName;  

            //生成Excel文件  
            transformer.transformXLS(srcFilePath, map, destFilePath);  
        } catch (Exception e) {  
            throw new RuntimeException("error happens...", e);  
        }  
    }  
}  

c. 测试类

public class Client {   
    public static void main(String[] args) {  
        List<Fruit> list = new ArrayList<Fruit>();  
        list.add(new Fruit("苹果",20.0f));  
        list.add(new Fruit("桔子",30.0f));  
        String templateFileName = "template.xlsx";  
        String resultFileName = "result.xlsx";  
        new ExcelUtil().createExcel(templateFileName,list,resultFileName);  
    }  
}  

d. Excel表格
模板表格
模板表格
导出的表格
导出的表格

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页