jXLS入门使用

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.jxlsgroupId>
            <artifactId>jxlsartifactId>
            <version>2.10.0version>
        dependency>

        <dependency>
            <groupId>org.jxlsgroupId>
            <artifactId>jxls-poiartifactId>
            <version>2.10.0version>
        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文件的形式,在模板中我们可以自定义自己想要的格式,然后利用${}这种形式在单元格内填充内容。
根据上述实体类属性创建模板格式如下:
jXLS入门使用_第1张图片
在模板中,我们定义了两个批注:

  • 单元格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();
        }
    }

最终写入效果:
jXLS入门使用_第2张图片
基本入门结束。
项目demo地址:
https://gitee.com/zzffox/jXLSdemo.git
参考链接:
https://my.oschina.net/leeck/blog/1844426

你可能感兴趣的:(java)