在上一篇中了解了JXLS的工作原理后,这次来对上篇结尾的问题进行分析。
因为一个JXLS报表模板中的表达式往往对应一个或者多个JAVA对象数据(实例集合或者实例)比如${stus}和${grade}两个。
所以在接到新需求中,要创建新的report,这样不可避免的要创建新对应的JAVA Bean。那有没有一种方法可以动态的去创建JAVA类呢(所谓动态则是不需要物理存在的java类文件),我们可以配置一些类的属性在文件或数据库中,然后动态的去创建一个类,根据配置设置类的属性,以及设置好属性的值。
后来发现其实CGLIB这个类库(在很多开源框架中使用)已经实现了这些功能(BeanGenerator)。
下面代码是一个简单的封装
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import net.sf.cglib.beans.BeanGenerator; import net.sf.cglib.beans.BeanMap; import net.sf.jxls.exception.ParsePropertyException; import net.sf.jxls.transformer.XLSTransformer; /** * The class which use to generate dynamic bean for jxls display. */ public class ReportJXLSGenerateBeanHelper { /** * Generate single DTO Bean. * @param properties properties list for a single DTO bean * @return DTO bean (Object type) */ public Object generateObject(final Map<String, Class<?>> properties) { BeanGenerator generator = new BeanGenerator(); Set<String> keySet = properties.keySet(); for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) { String key = (String) iterator.next(); generator.addProperty(key, (Class<?>) properties.get(key)); } return generator.create(); } /** * Getter value. * @param obj DTO Object * @param property property * @return property value */ public Object getValue(final Object obj, final String property) { BeanMap beanMap = BeanMap.create(obj); return beanMap.get(property); } /** * Setter value. * @param obj DTO Object * @param property property * @param rawValue property value * @throws Exception */ public void setValue(final Object obj, final String property, final Object rawValue){ Object value = rawValue; if (value == null) { value = ""; } BeanMap beanMap = BeanMap.create(obj); try { beanMap.put(property, value); } catch (ClassCastException e) { LogServices.app.info("ReportJXLSGenerateBeanHelper.setValue():" + e.getMessage()); } } /** * generate report. * @param templateFile report template * @param beans * @param outputPath * @throws IOException * @throws InvalidFormatException * @throws ParsePropertyException */ public void exportExcel(final String templateFile, final Map<String, Object> beans, final String outputPath) throws ParsePropertyException, InvalidFormatException, IOException { XLSTransformer transformer = new XLSTransformer(); LogServices.app.debug2("generate report begin" + Calendar.getInstance().getTime().toString()); transformer.transformXLS(templateFile, beans, outputPath); LogServices.app.debug2("generate report end" + Calendar.getInstance().getTime().toString()); } }
这个帮助类中有4个方法:
1. exportExcel 想必很熟悉,就是用来生成目标报表文件
2. generateObject 这个就是自动生产一个Object,他的参数是一个Map类型,每一对KAY VALUE即是这个Object中的一个属性和类型,比如:
Map<String, Class<?>> fieldMap = new HashMap<String, Class<?>>(); fieldMap.put("vendorName", Class.forName("java.lang.String")); fieldMap.put("productName", Class.forName("java.lang.String"));
有个属性叫vendorname是String类型,另外一个是productName是个String类型(集合也是支持的,比如List)。
3. setValue 设置对象某个属性的值
4. getValue 取得对象某个属性的值
接下来用这个方法可以达到获取一个对象集合的目的
/** * Return single DTO bean list. * @param fieldMap * @param resultList rs from the DB * @return dtoBeanList * @throws ClassCastException * @throws Exception */ public List<Object> getSingleDTOBeanList(Map<String, Class<?>> fieldMap, List<ListOrderedMap> resultList) throws ClassCastException, Exception { List<Object> dtoBeanList = new ArrayList<Object>(); for (Iterator<ListOrderedMap> iterator = resultList.iterator(); iterator.hasNext();) { ListOrderedMap listOrderedMap = iterator.next(); Object object = generateObject(fieldMap); Iterator<?> iter = fieldMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<String, Class<?>> entry = (Map.Entry<String, Class<?>>) iter.next(); Object key = entry.getKey(); setValue(object, key.toString(), listOrderedMap.get(key.toString().toUpperCase())); } dtoBeanList.add(object); } return dtoBeanList; }
OK 到了这里大家应该都明白了,剩下的工作就是怎么管理我们的配置,这里用到的是DB配置
RPT_JXLS_OID | PROP_SEQ | PROP_NAME | DATA_TYPE |
3702 | 1 | vendorName | String |
3702 | 2 | productName | String |
这里值得注意的是PROP_NAME得和SQL中结果中的别名一样(忽略大小写)。
有了上面的基础,以后有新的需求只要配置这张表和新建相应XLS模板即可,不用物理创建对应的JAVA类了。
相关推荐
**jxls:强大的Java报表生成库** 在Java开发中,生成报表是一项常见的需求,而`jxls`就是一款专门用于创建动态Excel报表的开源库。它允许开发者使用标准的Java编程方式来定义复杂的Excel模板,并将数据填充到这些...
jXLS 通过提供了一个基于模板的报表生成机制,可以生成具有不同结构和格式的报表。 使用 Apache 开源 POI 和 jXLS 两种 API 可以生成报表。POI 提供了一个纯 Java 实现的 Office 文档格式解析和生成工具,可以对...
**jxls1.0.5报表工具详解** jxls是一个基于Java的库,它扩展了Apache POI库的功能,使得用户能够用简单的Excel模板来创建复杂的动态报告。jxls1.0.5是该工具的一个版本,它提供了一系列增强功能和改进,帮助开发者...
标题中的“jxls报表生成利器,比起jxl,poi牛逼得很”暗示了本文将讨论在Java环境下生成Excel报表的工具,重点在于jxls和Apache POI库的对比。jxls是一个基于Apache POI的扩展库,使得在处理Excel模板时更加方便高效...
jxls模板导出Excel教程 jxls是一种基于模板的报表生成工具,可以快速生成复杂的Excel报表。通过使用jxls,可以将报表生成过程简化,使其变得更加...* 提高jxls的可扩展性和灵活性,使其能够满足更多的报表生成需求。
通过学习和实践这个“jxls报表demo”,开发者可以掌握如何有效地使用`jxls`进行动态报表生成,提升工作效率,为业务系统提供更直观的数据呈现方式。同时,了解如何将Excel转换为HTML,也有助于增强对Web开发中数据...
在IT行业中,生成灵活的Excel导出是许多应用程序的核心需求,尤其在数据分析、报表生成以及数据交换场景下。本文将详细介绍如何使用JXLS库结合Excel模板来实现这一功能。 JXLS(Java Excel Library)是一个强大的...
在Java开发中,导出Excel数据是一项常见的任务,特别是在数据分析、报表生成或数据导出等场景。`jxls`是一个非常实用的库,它允许开发者使用JSP标签和Java编程方式来处理Excel模板,从而方便地生成和导出Excel文件。...
**Jxls:基于模板生成Excel文件的神器** 在IT行业中,数据处理和报告生成是常见的需求,特别是当需要将大量数据导出为易于查看和分析的格式时,Excel...如果你需要在Java应用中生成Excel报表,`jxls`绝对值得一试。
而jXLS则强调模板驱动的方法,简化了报表生成流程,特别是在数据与展示逻辑分离的情况下。选择哪个库取决于具体需求,如需高度自定义和灵活性,POI可能更合适;若追求简洁和模板化,jXLS则是个不错的选择。
jxls教程 使用Java操作Excel,创建模板生成 jxls教程 使用Java操作Excel,创建模板生成
在实际应用中,jxls可以广泛应用于报表生成、数据导出、批量数据处理等场景。例如,在财务系统中,可以用jxls动态生成各类报表,如资产负债表、利润表等;在电商系统中,可以方便地将订单数据导出为Excel,供用户...
这个工具极大地简化了在Java应用程序中生成复杂Excel表格的过程,尤其适合那些需要根据数据源动态生成报表的情况。在“jxls自己写的简单实例”中,我们将探讨如何利用Jxls实现横向和纵向排序的功能。 **Jxls工作...
通过使用jxls,开发者可以使用Java模板语言(如JEXL)来动态地生成复杂的Excel报告,而无需编写大量的低级代码。 首先,jxls-core-1.0.1.jar是jxls的核心库,包含了主要的功能和API。这个库提供了将Java集合或POJOs...
**官方jxls-2.4.1** ...总的来说,jxls-2.4.1是一个高效且灵活的工具,可以帮助开发者快速地生成基于Excel的数据报告,简化了Java应用与Excel之间的交互,尤其适合处理复杂的数据转换和格式化任务。
- **报告生成**:Jxls适用于需要根据数据库或其他数据源生成定制化Excel报告的场合,例如财务报表、销售统计等。 - **数据导入导出**:可以方便地将Java对象转换为Excel格式,用于数据交换或用户界面的数据输入。 ...
基于jxls标签导出Excel的方式可以简化Excel报表的生成过程,并且可以实现复杂的报表功能。jxls标签可以直接写在Excel模板中,并可以与POI结合使用,生成复杂的Excel报表。 JXLS是一个Java库,用于生成Excel报表。它...
首先,`jxls2`是一个强大的Java库,它扩展了Apache POI库的功能,使得开发者能够以声明式的方式来定义Excel模板,并将Java对象的数据填充到模板中,生成动态的Excel报表。这种工作方式极大地简化了Excel导出的编程...
jxls在很多领域都有应用,如报表生成、数据导出、批量数据处理等。特别是在金融、教育、数据分析等行业,需要频繁生成或处理Excel报表时,jxls能显著提高开发效率。 **总结** jxls-2.2.9.zip这个压缩包中包含的是...