`
shuai1234
  • 浏览: 971618 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

jxls 使用模板文件导出生成excel

    博客分类:
  • java
 
阅读更多

jxls官方网站http://jxls.sourceforge.net/ 
jxls采用基于excel模板的方式来导出excel,支持
支持写sql语句导数据
简单属性访问
强大的表达式
报表导出
报表标签使用
列隐藏
动态样式
jdbc resultset导出
在一个单元格上使用多个bean的属性
合并单元格
动态分组

等等,底层采用的poi来操作excel,所以要下载poi,下列表是依赖包
* POI (3.5 or later)
* Commons BeanUtils
* Commons Collections
* Commons JEXL
* Commons Logging
* Commons Digester
使用模板的直接好处就是减少了设置excel相应单元格样式,复杂表格不好编码,手动填充数据,减少编码出错率等诸多不便之处。


简单的使用就不用做例子了,直接上一个难一点的。该功能最终的导出效果图如下

要求:1.导出的excel的表头是动态的且支持单元格合并,2.支持分组,通过设置合并单元格的属性,能自动将相同数据纵向合并单元格

所操作excel的模板图如下

测试用例所使用的简单bean

public class ExcelColumn {
 private String value;
 private int row;
 private int col;

 public ExcelColumn(String value, int row, int col) {
  super();
  this.value = value;
  this.row = row;
  this.col = col;
 }
 //getter/setter
}

public class Column {
 private String sumweight;
 private String count;
 //getter/setter
}

public class FundsVO {
 private String sumweight;
 private String count;
 //getter/setter
}

public class Head {

 private String name;
 //getter/setter
}
public class Record {
 private String wasteType;
 private Collection<ValueBean> valuebeans;
 //getter/setter
}
public class ValueBean { 
 private String collector;
 private Collection<FundsVO> fund;
 //getter/setter
}

测试用例主体方法

 @Test
 public void dymicColumnTest() throws ParsePropertyException, InvalidFormatException, IOException {

  List<Head> heads = new ArrayList<Head>();
  Head col1 = new Head("南山");
  Head col2 = new Head("龙岗");
  heads.add(col1);
  heads.add(col2);

  List<Column> cols = new ArrayList<Column>();
  Column co1 = new Column();
  co1.setSumweight("垃圾净重量");
  co1.setCount("车次");
  cols.add(co1);
  cols.add(co1);
  List<Collection<ValueBean>> data = new ArrayList<Collection<ValueBean>>();
  data.add(new ArrayList<ValueBean>());
  data.add(new ArrayList<ValueBean>());
  for (int k = 0; k < 2; k++) {

   for (int i = 0; i < 3; i++) {

    ValueBean con1 = new ValueBean();
    con1.setCollector("收集者" + k);
    Collection<FundsVO> fund = new ArrayList<FundsVO>();
    for (int j = 0; j < 2; j++) {
     FundsVO f1 = new FundsVO();
     f1.setCount("1" + i + j);
     f1.setSumweight("10" + j + i);
     fund.add(f1);
    }
    con1.setFund(fund);
    data.get(k).add(con1);
   }
  }

  Collection<Record> records = new ArrayList<Record>();
  Record r1 = new Record();
  r1.setWasteType("生活垃圾");

  r1.setValuebeans(data.get(0));

  records.add(r1);
  Record r2 = new Record();
  r2.setWasteType("污水");
  r2.setValuebeans(data.get(1));
  records.add(r2);

  Map map = new HashMap();
  map.put("records", records);
  map.put("heads", heads);
  map.put("cols", cols);
  String templateFileName = "D:\\workspace\\jxlsdemo\\src\\hi\\magicdetective\\dynmiccolumn\\dynmic.xls";
  String destFileName = "D:\\workspace\\jxlsdemo\\src\\hi\\magicdetective\\dynmiccolumn\\dynmic_output.xls";
  XLSTransformer transformer = new XLSTransformer();
  //注册自定义合并单元格转换器
  transformer.registerCellProcessor(new MultPropertyCellProcessor(new String[] { "record.wasteType" }));
  transformer.transformXLS(templateFileName, map, destFileName);
 }

 

package hi.magicdetective.dynmiccolumn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import net.sf.jxls.parser.Cell;
import net.sf.jxls.processor.CellProcessor;

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * 多属性合并单元格转换器
 * @author ydw
 *
 */
public class MultPropertyCellProcessor implements CellProcessor {
 /**
  * 合并属性集
  */
 private String[] keys;
 /**
  * 合并数据集
  */
 private Map<String, List<ExcelColumn>> mergedMap = new HashMap<String, List<ExcelColumn>>();
 /**
  * 合并属性的起始行列
  */
 private Map<String, ExcelColumn> first = new HashMap<String, ExcelColumn>();

 public MultPropertyCellProcessor(String[] keys) {
  this.keys = keys;
 }

 /**
  *  刚开始不明白这个Map namedCells参数的含义,通过跟踪源代码发现是下面类调用的
  *  SimpleRowTransformer
  *  private void applyCellProcessors(Sheet sheet, Cell cell) {
     for (int i = 0; i < cellProcessors.size(); i++) {
         CellProcessor cellProcessor = (CellProcessor) cellProcessors.get(i);
         cellProcessor.processCell(cell, sheet.getNamedCells());
     }
 }
  */
 @Override
 public void processCell(Cell cell, Map namedCells) {

  for (String key : keys) {
   if (cell.getStringCellValue().contains(key)) {
    first.put(key,
      new ExcelColumn(key, cell.getPoiCell().getRowIndex(), cell.getPoiCell().getColumnIndex()));
   }
  }
  //同行列,实际数据,不是表达式值
  for (String key : keys) {
   int firstRow = first.get(key) == null ? -1 : first.get(key).getRow();
   int firstCol = first.get(key) == null ? -1 : first.get(key).getCol();
   if (cell.getPoiCell().getRowIndex() == firstRow && cell.getPoiCell().getColumnIndex() == firstCol
     && !cell.getStringCellValue().contains(key)) {
    String value = cell.getStringCellValue();
    //由属性+值构成键
    String tmpKey = key + "_" + value;
    if (mergedMap.containsKey(tmpKey)) {
     mergedMap.get(tmpKey).add(new ExcelColumn(value, firstRow, firstCol));
    } else {
     List<ExcelColumn> list = new ArrayList<ExcelColumn>();
     list.add(new ExcelColumn(value, firstRow, firstCol));
     mergedMap.put(tmpKey, list);
    }

   }

   merged(cell.getPoiCell().getSheet(), mergedMap);
  }

 }

 private void merged(Sheet sheet, Map<String, List<ExcelColumn>> map) {
  Set<Entry<String, List<ExcelColumn>>> set = map.entrySet();
  for (Entry<String, List<ExcelColumn>> entry : set) {
   String tmpKey = entry.getKey();
   int firstRow = 9999;
   int lastRow = -1;
   int colindex = 0;
   for (ExcelColumn col : map.get(tmpKey)) {
    colindex = col.getCol();
    if (col.getRow() < firstRow)
     firstRow = col.getRow();
    if (col.getRow() > lastRow)
     lastRow = col.getRow();
   }
   CellRangeAddress range = new CellRangeAddress(firstRow, lastRow, colindex, colindex);
   sheet.addMergedRegion(range);

  }
 }
}


分享到:
评论
1 楼 白小默 2019-07-03  
你好 可以提供下源码DEMO吗,不知为何,我导出来的excel文件大小为0,excel2007打不开

相关推荐

    jxls使用模板实现导出excel!

    Java编程语言在处理数据导出,特别是在生成Excel文件时,提供了多种库,其中之一就是jxls。jxls是一个强大的工具,它允许我们使用Apache POI库的功能,但通过使用JSP标签和简单的模板来简化Excel文件的创建过程。...

    jxls利用模板生成excel文件

    **Jxls:基于模板生成Excel文件的神器** 在IT行业中,数据处理和报告生成是常见的需求,特别是当需要将大量数据导出为易于查看和分析的格式时,Excel表格成为了首选。而`jxls`正是一个Java库,它提供了一种高效、...

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

    - 示例Java代码,演示了如何使用JXLS库读取模板、加载数据并生成Excel文件。 通过分析这些示例,你可以更深入地理解JXLS的工作机制,并学习如何将其应用到自己的项目中。例如,你可能会看到如何处理动态表格大小、...

    使用 jxls2.X 导出excel文件

    "使用jxls2.X导出Excel文件"的主题涉及了如何利用Java来生成和操作Excel文档,尤其适用于需要动态生成内容的场景。在这个项目案例中,开发者使用了jxls库的最新版本(jxls2),它是一个强大的工具,能够帮助程序员将...

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

    本项目专注于解决这一问题,通过使用`jxls2`库,能够实现复杂Excel模板的导出,包括单元格的合并,满足多种报表导出需求。现在我们将详细探讨这个项目的核心技术和应用场景。 首先,`jxls2`是一个强大的Java库,它...

    jxls导出模板

    jxls是一个基于Java的库,它允许开发者使用Apache POI库来扩展XLS(X)模板,从而动态生成Excel文件。 jxls的核心概念是通过模板和Java对象之间的映射关系,将业务数据填充到预定义的Excel模板中。这种方式使得开发者...

    jxls-poi导出excel示例代码文件

    这里我们将深入探讨`jxls-poi`这个库,它是如何帮助我们从JSON数据生成Excel文件的。 `jxls`是一个Java库,它扩展了Apache POI项目,使得我们可以使用简单的模板语法来读写Excel文件。`jxls-poi`是`jxls`的一个分支...

    jxls模板导出Excel教程

    jxls模板导出Excel教程 jxls是一种基于模板的报表生成工具,可以快速生成复杂的Excel报表。通过使用jxls,可以将报表生成过程简化,使其变得更加高效和灵活。 jxls的主要特点是使用模板来生成报表,用户可以根据...

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

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

    SpringBoot(33) 整合JXLS实现Excel导入导出

    JXLS会根据模板和提供的数据来生成Excel文件。 3. **编写Java代码**:创建一个服务类,定义方法来处理Excel的导入和导出。导入操作通常涉及读取Excel文件并将其转换为Java对象;导出则相反,将Java对象转换为Excel...

    用Jxls实现数据导入excel实例

    Jxls库的核心功能在于提供了一种声明式的方式来处理Excel模板,通过使用Apache POI库来操作Excel文件。它的主要优点是将数据和样式分离,让开发者可以专注于业务逻辑,而无需关心底层Excel表格的细节。 首先,我们...

    jxls模板导出Excel所需jar包

    "jxls使用模板导出excel"这个压缩包可能包含了以下核心组件的jar文件: 1. jxls主库:如`jxls.jar`,提供了核心的模板处理功能。 2. Apache POI库:如`poi-ooxml-schemas.jar`, `poi-ooxml.jar`, `poi.jar`等,用于...

    jxls 基于模版导出excel

    jxls是一个强大的库,它允许开发者使用模板技术来生成Excel文档,极大地简化了这一过程。jxls的核心理念是将Excel模板与Java对象绑定,通过模板语言(如Freemarker)来动态填充数据,从而实现数据的自动化导出。 **...

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

    而当我们需要在Web应用程序中实现动态生成和导出Excel文件时,一种高效的方法是利用模板和特定的库,如jxls。本文将深入探讨如何使用jxls库,结合xls或xlsx模板,来实现Excel文件的导出和下载。 首先,了解jxls。...

    通过jxls和poi导出excel的dome

    本示例着重讲解如何利用Java的两个库——jxls和Apache POI,来实现动态生成Excel文件,以满足各种定制化的导出需求。 首先,Apache POI是一个流行的开源Java API,它允许开发者创建、修改和显示Microsoft Office...

    JXLS 导出exce基础示例

    JXLS,全称Java eXcel Library for Sheets,是一个基于Apache POI库的工具,它提供了一种直观的方式来操作Excel模板,将Java对象的数据绑定到模板的单元格中,从而生成定制化的Excel文件。这种方式使得开发者可以...

    使用jxls标签导出Excel说明

    在使用JXLS时,需要在Excel模板文件中使用规定的语法来访问对象属性。例如,使用${department.name}来访问Department对象的name属性。JXLS引擎会通过关键字department在当前bean映射下搜索这个bean,然后尝试获取这...

    jxls+springmvc实现excel模板导出

    在本场景中,它可能是接收用户请求导出Excel的端点,处理请求,调用业务逻辑,然后使用jxls库填充模板并生成Excel文件。Spring MVC的ModelAndView或ResponseEntity对象可以用来设置响应内容类型为"application/vnd....

    JxlsDemo 1.0.6导出Excel文档Demo

    4. **生成Excel文件**:执行填充操作后,JXLS会根据模板和数据生成一个新的Excel文件。 在实际应用中,JXLS的灵活性和效率使得它在Web应用、大数据报告生成等领域非常受欢迎。它可以处理复杂的条件格式、数据验证...

    (简单)JFinal实现Demo - 导出Excel 使用模板导出(POI + JXLS).zip

    本示例"(简单)JFinal实现Demo - 导出Excel 使用模板导出(POI + JXLS)"提供了一种高效的方法来生成复杂的Excel表格,无需通过编程逐个控制单元格样式。以下是对这个Demo的详细解释: 首先,JFinal是一个基于Java...

Global site tag (gtag.js) - Google Analytics