1、介绍
jXLS 是用于生成 Excel 报表的小型 Java 类库,jXLS 使用特殊标记在 Excel 模板中定义输出格式和数据布局。使用jXLS时,我们只需要定义要输出excel格式的模板,然后用很少量的代码配置jXLS引擎就可使用。
2、主要概念
2.1 Area
Area 代表 Excel 文件中的矩形区域。可以使用单元格范围或使用开始单元格和区域大小(行和列数)定义矩形区域。Area 包括特定范围的所有 Excel 单元格。
每个 Area 可以关联一组命令,jXLS 引擎处理区域时执行和区域相关的命令。Area 可以嵌套子区域。每个子区域也是一个 Area,也可以包含自己的命令和自己的子区域。
Area定义的方式主要有以下几种:
- excel模板中添加批注语法
- XML配置
- 使用jXLS JAVA API
2.2 Command
命令代表一个或多个 Area 的转换动作。Command 接口如下所示:
public interface Command {
String getName();
List<Area> getAreaList();
Command addArea(Area area);
Size applyAt(CellRef cellRef, Context context);
void reset();
}
Command 的主要方法是 Size applyAt(CellRef cellRef, Context context)。该方法在单元格 cellRef 执行命令动作。context 类似于一个 map,用于为命令传递数据。该方法返回转换后区域的大小作为 Size 对象。
当前,jXLS 提供以下内置命令:
- Each
- If
- Image
2.3 Transformer
Transformer 接口允许 Area 与特定 Excel 实现无关。这意味着通过提供不同的 Transformer 接口实现,我们可以使用不同的底层 Java->Excel 库。
Transformer 接口如下所示:
public interface Transformer {
void transform(CellRef srcCellRef, CellRef targetCellRef, Context context, boolean updateRowHeight);
void setFormula(CellRef cellRef, String formulaString);
Set<CellData> getFormulaCells();
CellData getCellData(CellRef cellRef);
List<CellRef> getTargetCellRef(CellRef cellRef);
void resetTargetCellRefs();
void resetArea(AreaRef areaRef);
void clearCell(CellRef cellRef);
List<CellData> getCommentedCells();
void addImage(AreaRef areaRef, byte[] imageBytes, ImageType imageType);
void write() throws IOException;
TransformationConfig getTransformationConfig();
void setTransformationConfig(TransformationConfig transformationConfig);
boolean deleteSheet(String sheetName);
void setHidden(String sheetName, boolean hidden);
void updateRowHeight(String srcSheetName, int srcRowNum, String targetSheetName, int targetRowNum);
}
尽管 Transformer 接口看起来有很多方法,但大多数方法已经在 AbstractTransformer 基础抽象类中实现,如果需要提供新 Java->Excel 实现,只需继承抽象类即可。
当前,jXLS 提供两种 Transformer 接口实现:
- PoiTransformer
- JexcelTransformer
PoiTransformer 使用 Apache POI 类库生成 Excel 文件。JexcelTransformer 基于较老的 Java Excel API 类库。
3、示例
3.1 引入jXLS依赖
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
3.2 定义一个实体类
public class OfferFormBO {
/**
* 应聘者ID
*/
private String personCID;
/**
* 录用人员
*/
private String name;
/**
* 应聘职位
*/
private String jobName;
/**
* 审批信息
*/
List<ApprovalBO> approvalBOList;
}
public class ApprovalBO {
/**
* 审批人姓名
*/
private String name;
/**
* 审批人邮箱
*/
private String email;
/**
* 审批时间
*/
private String time;
/**
* 审批意见
*/
private String optition;
}
3.3 创建一个excel模板
excel模板是规定最终生成excel文件的形式,在模板中我们可以自定义自己想要的格式,然后利用${}这种形式在单元格内填充内容。
根据上述实体类属性创建模板格式如下:
在模板中,我们定义了两个批注:
- 单元格A1定义的批注 jx:area(lastCell=“D8”) 定义模板根区域为A1:D8;
- 单元格A8定义的批注 jx:each(items=“approvalBOList” var=“ApprovalBO” lastCell=“D8”) 使单元格A8:D8(由lastCell 属性定义)执行jXLS Each命令,该命令使该区域被克隆,并从approvalBOList(由items定义)集合中取每一个ApprovalBO(由var定义),并在ApprovalBO的属性中取值。
3.4 使用jXLS模板代码
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
try {
// ClassPathResource resource = new ClassPathResource("1.xls");
// 读取模板
InputStream is = App.class.getClassLoader().getResourceAsStream("1.xls");
// 新建文件
File file = new File("d:/1.xls");
// 流
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
//ByteArrayOutputStream os = new ByteArrayOutputStream();
// 定义数据 使用Context类型
Context context = new Context();
context.putVar("personCID", "111");
context.putVar("name", "222");
context.putVar("jobName", "挖掘机");
List<ApprovalBO> approvalBOList = new ArrayList<>();
ApprovalBO approvalBO1 = new ApprovalBO();
ApprovalBO approvalBO2 = new ApprovalBO();
ApprovalBO approvalBO3 = new ApprovalBO();
approvalBO1.setName("张哈哈");
approvalBO1.setEmail("123@456");
approvalBO1.setTime("2099-10-32 18:00");
approvalBO1.setOptition("同意");
approvalBO2.setName("张笑笑");
approvalBO2.setEmail("123@456");
approvalBO2.setTime("2099-10-32 19:00");
approvalBO2.setOptition("不同意");
approvalBO3.setName("张哭哭");
approvalBO3.setEmail("123@456");
approvalBO3.setTime("2099-10-32 20:00");
approvalBO3.setOptition("再考虑");
approvalBOList.add(approvalBO1);
approvalBOList.add(approvalBO2);
approvalBOList.add(approvalBO3);
context.putVar("approvalBOList", approvalBOList);
// 数据写入模板
JxlsHelper.getInstance().processTemplate(is, os, context);
// os.toByteArray();
}catch (Exception e){
e.printStackTrace();
}
}
最终写入效果:
基本入门结束。
项目demo地址:
https://gitee.com/zzffox/jXLSdemo.git
参考链接:
https://my.oschina.net/leeck/blog/1844426