`

JXLS使用 按 模板 单sheet和 多sheet excel生成

 
阅读更多

JXLS使用(一)——Simple Sheet

JXLS是一个简单易用的一个用于生成和读入Excel的工具,有兴趣的朋友可以到Jxls的官网上面下载最新版本的Jxls,目前Jxls最新的版本是0.9.5,下载的Zip包里面有一个Doc和Example,不过,官网所提供的东西太过简单,如果,需要详细了解Jxls的功能和使用方法的话,可以仔细研究其源代码。

将Jxls源代码导入到Eclipse的环境中就可以查看和分析其源代码了,导入Eclipse的方法是:
1)将下载的压缩包里面的Src目录下面的jxls-core和jxls-reader两个文件夹拷贝到一个目录下面(也可以不用拷贝)
2)在DOS下面进入jxls-core目录下面,输入命令:mvn -eclipse:eclipse。jxls-reader的生成方式也是一样的
3)打开Eclipse,将生成的两个项目导入
使用jxls的时候其实就使用两个类就够了:XLSTransformer和Util,至少在我目前的使用过程中只使用到这么两个类。

jxls的使用方法:
1)将jxls的jar文件放到我们的程序目录下面,如果,使用Maven的话,直接在Project的pom.xml里面配置依赖就可以了
2)根据需要生成的Excel文件或者Report的格式,设置一个jxls的Template文件,Template其实就是一个特殊的一些Excel文件,里面包含了一些jxls的Tag标签。
jxls的Tag其实有点想jstl标签库的使用方式,在取出一个对象的值的时候可以利用下面这样的Tag来将值输出:${object1.property1};如果需要将一个Map输出到Excel的时候定义方式如下:${map.get('property1')};
3)声明一个XLSTransformer对象,生成方式就是使用new操作符
XLSTransformer transformer = new XLSTransformer();
4)得到Template的FIle:
String xlsTemplateFileName = this.getClass().getClassLoader().getResource("template.xls");
5)利用XLSTransformer的类的方法生成Excel文件
String xlsFileName = "c:"+File.separator+"resule.xls";
Map beans = new HashMap();
beans.put("newBeans1","new beans1");
beans.put("newBeans2","new beans2");

transformer.transformXLS(xlsTemplateFileName , beans, xlsFileName);

XLSTransformer类的transformXLS方法的定义如下:
public void transformXLS(String srcFilePath, Map beanParams, String destFilePath) throws ParsePropertyException, IOException其中:
srcFilePath:是Template文件的全文件名(包含路径)
beanParams:需要传入Excel里面的一个Map,jxls根据Template里面的定义和Map里面的对象对Template进行解析,将Map里面的对象值填入到Excel文件中
destFilePath:需要生成的Excel文件的全文件名(包含路径)

注:jxls虽然提供了Example,但是,都过于简单,如果想详细了解jxls,可以仔细研究jxls-core,其实没有必要查看其全部代码,如果只是想了解其具体操作,可以详细查看类XLSTransformerTest,即XLSTransformer的测试代码。

 

jxls使用(二)——Multiple Sheets

jxls在生成Excel文件时,提供一个批量生成Excel Sheet的功能,即可以一次生成一个包含多个Sheet的Excel文件。但是,jxls在处理这类操作的时候会出现性能问题,当一次形成的Excel的Sheet数量超过500个的时候就会出现很严重的性能问题,运算到最后,系统会提示OutOfMemeroyError,这种问题的出现是由于jxls的实现方式决定的。

如果,仔细查看jxls的源代码就会发现,无论是处理单个Sheet还是处理多个Sheet的时候,在XLSTransformer类的Transform处理的时候都是在内存中对Sheet进行处理,然后,在生成WorkBook。假如,需要一次形成的Sheet为500以上的时候,势必会出现严重的性能问题。

针对以上的问题,如果我们的应用需要形成500Sheet以上的Excel时,我们可以采用人为干预的方式,即在进行处理前对Beans的个数进行限制,最好将Beans的个数限制在200个以内,即每次只生成包含200个Sheet的WorkBook,在WorkBook形成以后,再对WorkBook进行合并,然后,将合并的WorkBook输出形成Excel文件,这样处理的时候,对一个Excel的总的Sheet也需要进行控制,否则在运算的过程中也会出现OutOfMemeroyError,最好控制在3000个以内,如果,超过3000个建议形成多个Excel文件,下面我通过一个具体的企业应用来说明怎么来进行操作。

我这个应用是Payslip导出的一个应用,具体要求是:
按照Division和Costcenter来组织Payslip卡片,每个Costcenter下面的员工组织到一个Excel文件里面

在具体实现的过程发现有一个Costcenter下面的员工数量超过了3000,开始是想是否能够一次将这个Costcenter下面的Payslip全部形成,结果遭到了可耻的失败。经过不断的测试以后,得到了以上的两个临界点的数字。下面说明一下我的具体实现:
1)从数据库按照Costcenter取出Payslip,得到一个payslipList对象。具体就是组装出取数据的SQL Script,利用JDBCTemplate取出数据。
2)形成Costcenter对应的Excel文件的名称,如果,得到的List的size大于3000,则每3000个记录形成一个Excel文件
3)将得到的List按照200进行分块处理,每200处理一次
4)利用jxls提供的方法transformMultipleSheetsList()对数据进行处理,得到一个HSSFWorkbook对象
5)合并得到的HSSFWorkbook,输出形成Excel文件
具体代码如下:

java 代码
  1. publicvoid exportPayslip(String costcenterCode) throws IOException{
  2. List payslipList = payslipDao.getPaylipByCostcenter(String costcenterCode);
  3. String xlsFileName;
  4. if (payslipList.size() <= 3000){
  5. xlsFileName = "c:"+File.separator+costcenterCode+".xls";
  6. transformXLSFile(payslipList ,xlsFileName );
  7. } else {
  8. for (int i =0;i<(int)Math.ceil((double)payslipList.size()/3000;i++)){
  9. xlsFileName = "c:"+File.separator+costcenterCode+"_"+new Integer(i+1).toString()+".xls";
  10. int k = ((i+1)*3000 < payslipList.size()) ? (i+1)*3000 : resultList.size();
  11. List resultList = payslipList.subList(i*3000,k);
  12. transformXLSFile(resultList ,xlsFileName );
  13. }
  14. }
  15. }
  16. privatevoid transformXLSFile(List resultList,String fileName){
  17. XLSTransformer transformer = new XLSTransformer();
  18. HSSFWorkBook resultWorkBook = null;
  19. for (int i = 0;i<(int)Math.ceil((double)resultList.size()/200;i++)){
  20. List payslipMaps = new ArrayList();
  21. List sheetNames = new ArrayList();
  22. InputStream xlsTemplateIO = new BufferedInputStream(getClass().getResourceAsStream("payslip.xls"));
  23. int k = ((i+1)*200 < resultList.size()) ? (i+1)*200 : resultList.size();
  24. payslipMaps = resultList.subList(i*200,k);
  25. for (int j=0;j
  26. Map payslip = (Map)resultList.get(i);
  27. String sheetName = paysli.get("EMPLOYEE_ID");
  28. sheetNames.add(sheetName);
  29. }
  30. HSSFWorkbook workBook = transformer.transformMultipleSheetsList(xlsTemplateIO , payslipMaps , sheetNames, "map", new HashMap(), 0);
  31. if (i == 0){
  32. resultWorkBook = workBook;
  33. } else {
  34. for (int h = 0;h < workBook.getNumberOfSheets();h++){
  35. HSSFSheet newSheet = resultWorkBook.createSheet( (String) sheetNames.get(i) );
  36. HSSFSheet hssfSheet = workBook.getSheetAt(h);
  37. Util.copySheets(newSheet, hssfSheet);
  38. Util.copyPageSetup(newSheet, hssfSheet);
  39. Util.copyPrintSetup(newSheet, hssfSheet);
  40. }
  41. }
  42. saveWorkbook(resultWorkbook, fileName);
  43. xlsTemplateIO.close();
  44. }
  45. }
  46. privatevoid saveWorkbook(HSSFWorkbook resultWorkbook, String fileName) throws IOException{
  47. OutputStream os = new BufferedOutputStream(new FileOutputStream(fileName));
  48. resultWorkbook.write(os);
  49. os.flush();
  50. os.close();
  51. }

 

以上代码有部分代码需要被放在try/catch语句里面,确保Stream能够被关闭,否则,会影响程序的运行性能。代码只代表个人的一种实现方式。

以上代码有一个地方需要说明,就是jxls的transformMultipleSheetsList()方法,该方法的声明如下:

java 代码
  1. public HSSFWorkbook transformMultipleSheetsList(InputStream is, List objects, List newSheetNames, String beanName, Map beanParams, int startSheetNum) throws ParsePropertyException {

该方法里面的参数说明如下:
1)is:即Template文件的一个输入流
2)newSheetNames:即形成Excel文件的时候Sheet的Name
3)objects:即我们传入的对应每个Sheet的一个Java对象,这里传入的List的元素为一个Map对象
4)beanName:这个参数在jxls对我们传入的List进行解析的时候使用,而且,该参数还对应Template文件中的Tag,例如,beanName为map,那么在Template文件中取值的公式应该定义成${map.get("property1")};如果beanName为payslip,公式应该定义成${payslip.get("property1")}
5)beanParams:这个参数在使用的时候我的代码没有使用到,这个参数是在如果传入的objects还与其他的对象关联的时候使用的,该参数是一个HashMap类型的参数,如果不使用的话,直接传入new HashMap()即可
6)startSheetNo:传入0即可,即SheetNo从0开始

以上代码的原理与操作Simple Sheet的时候差别不大,主要是Template的文件的取值公式和调用的方法有所改变而已。关键是在大数据量操作的时候注意对处理的数据进行分块处理即可,否则,系统运行性能将很难保证。以上代码,在我实际的使用过程中速度还是比较理想的,16000条数据的导出时间是15分钟左右。

分享到:
评论

相关推荐

    使用JXLS+Excel模板制作灵活的excel导出

    在IT行业中,生成灵活的Excel导出是许多应用程序的核心需求,尤其在数据分析、报表生成以及数据交换场景下。...通过熟悉和掌握JXLS,开发者能够轻松应对各种复杂的Excel生成需求,为用户提供高质量的Excel报告服务。

    Excel报表导出,复杂Excel模板导出(带单元格合并),jxls2

    除了单一Sheet的导出,`jxls2`还支持多Sheet的报表导出,这意味着可以在一个Excel文件中包含多个独立的数据集,这对于报告的组织和阅读非常有帮助。例如,可以将不同部门的数据分别放在不同的Sheet中,或者按照时间...

    使用 jxls2.X 导出excel文件源码

    `jxls2` 是一个Java库,它允许开发者使用简单的Excel模板来动态地生成或读取Excel文件。本篇文章将深入探讨如何使用 `jxls2` 库来导出Excel文件,同时参考《使用 jxls2.X 导出excel文件源码》这篇博客文章中的案例...

    使用xls或xlsx模板(jxls语法)导出Excel并下载的Demo

    总结起来,使用jxls库和Excel模板可以简化Web应用中动态Excel文件的生成过程,提高了开发效率和代码的可读性。通过掌握以上知识点,你可以轻松地实现在Java应用中导出和下载Excel文件的功能。在实际操作中,结合具体...

    利用jxls操作excel模板文件

    在Java开发中,处理Excel...通过以上步骤,你就可以在Java项目中灵活地利用Jxls库来处理Excel模板文件,实现数据的导入导出和报表生成等功能。熟练掌握Jxls的使用,能极大地提高开发效率,让Excel操作变得简单易行。

    Java根据模板导出Excel报表并复制模板生成多个Sheet页

    本工具类使用的场景为根据提供的模板来导出Excel报表并且可根据提供的模板Sheet页进行复制,从而实现多个Sheet页的需求。 知识点一:POI技术 POI(Poor Obfuscation Implementation)是一款Java API,用于读写...

    jxls模板导出Excel所需jar包

    - **多sheet处理**:一个模板文件可以包含多个sheet,jxls可以分别处理每个sheet的数据。 总的来说,jxls是一个强大且灵活的工具,它可以简化Java程序中的Excel导出工作。通过模板方式,开发者可以专注于数据逻辑,...

    jxls实现多sheet的报表导出-附件资源

    jxls实现多sheet的报表导出-附件资源

    JxlsDemo:Jxls多sheet页demo

    Jxls多sheet页demo 1.解决了多sheet页导出时候模板定义页无法删除,无法隐藏 2.新增冻结窗口接口 example: //JxlsHelper helper = JxlsHelper.getInstance(); //helper.setSourceSheetName("template"); //helper....

    JXLS 导出exce基础示例

    最后,JXLS会根据模板和上下文填充数据,生成一个新的Excel文件`output.xlsx`。 在实际应用中,JXLS支持更复杂的数据处理,比如条件格式化、循环引用、数据分组等。此外,它还支持多sheet操作,可以同时处理多个...

    JXL使用模板通过el表达式生成excel文件

    首先,你需要创建一个Excel模板文件,这个模板包含你想要在生成的Excel中展示的数据结构和样式。在模板中,你可以预定义单元格的格式,如字体、颜色、边框等,同时可以使用占位符来表示将要填充的数据。 **步骤2:...

    使用Apache开源POI和jXLS两种API生成报表

    jXLS 使用模板来生成报表,模板可以是 Excel 文件、Word 文件等。jXLS 通过读取模板文件,获取其中的数据,然后根据模板生成报表。jXLS 提供了一个灵活的报表生成机制,可以根据不同的数据源生成报表。 使用 jXLS ...

    JxlsDemo 1.0.6导出Excel文档Demo

    "JxlsDemo 1.0.6导出Excel文档Demo" 提供了一个使用JXLS库进行Excel文件生成的实例,该库特别适用于批量数据处理和复杂的格式化操作。 JXLS 是一个开源Java库,它允许开发者使用Apache POI库来简化Excel模板的创建...

    JXLS 2.4.0 excel 导出 可以运行在 JDK 1.6

    在进行导出时,JXLS 2.4.0的“直接运行”功能意味着使用者无需进行复杂的配置或设置,只需提供必要的数据和模板,就可以快速生成Excel文件。这简化了开发流程,提高了工作效率。 压缩包中的文件“JexcelTemple”...

    导出excel_jxls1.0.2

    总的来说,"导出Excel_jxls1.0.2"是一个强大的工具,它简化了在Java应用中生成复杂Excel报告的过程,允许开发者专注于数据逻辑和模板设计,而无需关心底层的文件处理细节。通过学习和掌握jxls,你可以更高效地处理...

    java web使用jxls导出excel功能

    Java Web使用Jxls导出Excel功能是一项常见的需求,特别是在数据报表和数据分析的场景下。Jxls是一个Java库,它提供了一种方便的方式来处理和导出Excel文件,无需编写复杂的Java代码来操作每一个单元格。本篇文章将...

    jxls和poi导出excel的架包

    - 调用`jxls`提供的工具类,如`JxlsHelper`,将模板和数据模型合并,生成最终的Excel文件。 通过结合使用`jxls`和`Apache POI`,你可以实现更灵活、更高效的Excel导出功能。例如,你可以创建一个包含多个表格、...

    使用Apache开源POI和jXLS两种API生成报表.pdf

    jXLS允许使用预先设计的Excel模板,通过替换占位符来填充数据。模板中的数据区域使用特殊的注释标记。 3.2 根据模板生成图表 虽然POI更适合直接创建图表,但jXLS可以通过预先在模板中创建图表,然后更新数据系列,...

    jxl 读取Excel模板并写入数据通用工具类

    在使用这个工具类时,首先调用`readTemplate`方法加载Excel模板,然后创建一个`Map`对象存储要写入的数据,最后调用`writeData`方法,传入工作簿、数据映射和输出文件路径,将填充好的数据写入新的Excel文件。...

    jxls1.0.6的jar包.zip

    1. **模板引擎**: jxls允许开发者使用Excel作为模板来生成报告,通过简单的指令如`和`&gt;&gt;`,可以实现动态数据绑定和复杂的逻辑操作。 2. **数据遍历**: 支持使用Java集合和Map对象的数据进行循环,自动填充到Excel...

Global site tag (gtag.js) - Google Analytics