• jxls2.3-简明教程


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

    另外,jxls2.3的运行效率也相当不错,经过测试,在禁用日志输出的情况下,导出excel单表66535条记录仅仅3000毫秒,与poi几乎没什么大的差距。

    demo工程源码下载:https://files.cnblogs.com/files/klguang/jxls-demo.zip

    springboot-demo下载:https://files.cnblogs.com/files/klguang/jxls-springboot.zip

    excel模板示例:

    image_thumb5

    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 = JxlsHelper.getInstance();
    Transformer transformer = jxlsHelper.createTransformer(is, os);
    JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
    Map<String, Object> funcs = new HashMap<String, Object>();
    funcs.put("utils", new JxlsUtils()); //添加自定义功能
    evaluator.getJexlEngine().setFunctions(funcs);
    
    

    demo

    工程目录:

    image_thumb3

    Employee.java

    public class Employee {
        private String name;
        private Date birthDate;
        private BigDecimal payment;
        private BigDecimal bonus;
        
        // getter and setter
    }
    

    建立excel模板:

    image_thumb5

    工具类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, model.get(key));
    			}
    		}
    		JxlsHelper jxlsHelper = JxlsHelper.getInstance();
    		Transformer transformer = jxlsHelper.createTransformer(is, os);
    		JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()
    				.getExpressionEvaluator();
    		Map<String, Object> funcs = new HashMap<String, Object>();
    		funcs.put("utils", new JxlsUtils()); // 添加自定义功能
    		evaluator.getJexlEngine().setFunctions(funcs);
    		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 "";
    	}
    
    	// if判断
    	public Object ifelse(boolean b, Object o1, Object o2) {
    		return b ? o1 : o2;
    	}
    
    }
    
    

    入口ObjectCollectionDemo.java

    public class ObjectCollectionDemoXlsx {
    	static Logger logger = LoggerFactory.getLogger(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 = ObjectCollectionDemoXlsx.class.getClassLoader()
            		.getResourceAsStream("jxls-template/object_collection_template.xlsx");
            
            JxlsUtils.exportExcel(inputStream, os, model);
            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;
        }
    }
    
    

    生成效果:

    image_thumb6

  • 相关阅读:
    【华为云技术分享】华为云HiLens全面升级,端云协同多模态AI应用开发利器
    【华为云技术分享】MongoDB经典故障系列四:调整oplog大小,引起从库宕机怎么办?
    使用体验神似VS Code?三步带你了解华为云CloudIDE前世今生
    nginx 下配置禅道
    如何在HTTPS 网页中引入HTTP资源: Mixed Content?
    stocket和webstocket的区别
    [转载]input[type=file]在移动端各浏览器无法适配打开相机的问题。
    视频和图片的存储(阿里云OSS还是七牛?)
    VUE 和AngularJS 开发SPA能支持APP内嵌么
    【PHP7.1】使用OpenSSL来代替Mcrypt加解密【原创】
  • 原文地址:https://www.cnblogs.com/klguang/p/6425422.html
Copyright © 2020-2023  润新知