JXLS 2.4.0系列教程(三)——嵌套循环是怎么做到的

注:本文代码在第一篇文章基础上修改而成,请务必先阅读第一篇文章。

http://www.cnblogs.com/foxlee1024/p/7616987.html

本文也不会过多的讲解模板中遍历表达式的写法和说明,请先阅读第二篇文章。

http://www.cnblogs.com/foxlee1024/p/7617120.html

  原本第三篇文章我打算写sheet分页的实现的,后来发现难度比第四篇循环嵌套复杂一点点,我们本着循序渐进的原则,所以先讲讲怎么实现循环嵌套。

说明是嵌套循环?说白了就是大循环套小循环,请看下图:

  我们设想一下,有一条哆啦A梦的流水生产线,生产线上在生成这哆啦A梦。我们知道,哆啦A梦的口袋中有很多不同的道具,那么我们在生成的时候就把这些道具预先放进哆啦A梦的口袋吧。

  每一个产品的哆啦A梦拥有的道具都是不一样的,这样我们在表中就需要到了两个循环,第一层是哆啦A梦名称和拥有的道具,第二层循环是拥有的道具名称和道具功能。

  Main方法中导出的代码和原来没什么不同,所以我们先看看哆啦A梦的javabean是怎么设计的。

public class Doraemon {
    private String name; // 哆啦A梦的名字
    private List<Tool> tools; // 拥有的道具,这是一个链表,存放的是Tool类

    public Doraemon(String name, List<Tool> tools) {
        super();
        this.name = name;
        this.tools = tools;
    }

    public Doraemon() {
    }

    /** 以下省略所有get/set方法,请自行添加 */
}

  接下来我们看看Tool类:

public class Tool {
    private String toolName; // 道具名
    private String toolFunction; // 道具功能

    public Tool(String toolName, String toolFunction) {
        super();
        this.toolName = toolName;
        this.toolFunction = toolFunction;
    }

    public Tool() {
    }

    /** 以下省略所有get/set方法,请自行添加 */
}

  现在大家看明白了吗?其实就是在Doraemon 类中加入了一个List链表,泛型为Tool。可以预想的是,只要一层层创建好哆啦A梦这个对象(包括他的道具)后,再把多个多啦A梦放进一个链表中,然后传给Jxls工具就可以生成excel报表了。

  现在我们看看Main方法是怎么写的,除了生成哆啦A梦对象的代码外,其他完全没有改动。

public class TestMain2 {

    public static void main(String[] args) throws Exception {
        String templatePath = "E:/template6.xls";
        OutputStream os = new FileOutputStream("E:/out6.xls");

        Tool tool1 = new Tool("任意门","想去哪就去哪");
        Tool tool2 = new Tool("竹蜻蜓","想飞哪就飞哪");
        Tool tool3 = new Tool("空气炮","空气炮");
        Tool tool4 = new Tool("翻译饼干","翻译饼干");

        List<Doraemon> list = new ArrayList<Doraemon>();

        //制作一个哆啦A梦
        Doraemon doraemon1 = new Doraemon();
        //制作一号哆啦A梦的道具
        List<Tool> toolList1 = new ArrayList<Tool>();
        toolList1.add(tool1);
        toolList1.add(tool2);
        //设定一号哆啦A梦信息
        doraemon1.setName("哆啦A梦一号");
        doraemon1.setTools(toolList1);

        //制作一个哆啦A梦
        Doraemon doraemon2 = new Doraemon();
        //制作二号哆啦A梦的道具
        List<Tool> toolList2 = new ArrayList<Tool>();
        toolList2.add(tool3);
        toolList2.add(tool4);
        toolList2.add(tool1);
        //设定二号哆啦A梦信息
        doraemon2.setName("哆啦A梦二号");
        doraemon2.setTools(toolList2);

        list.add(doraemon1);
        list.add(doraemon2);

        Map<String, Object> model = new HashMap<String, Object>();
        model.put("data", list);    

        JxlsUtils.exportExcel(templatePath, os, model);
        os.close();
        System.out.println("完成");
    }
}

  Main方法不多解释,就是new出一个新的哆啦A梦后给他set入对应的数据(包括名字和拥有的道具),然后把一众哆啦A梦放进一个链表中,再传进model中。

  重点是我们看看模板应该怎么写。

  第一句不用多说,设定模板区域(我随便写的,可以写大一点):

jx:area(lastCell="I7")

  第二句是第一层循环,items是Main方法中model放入的键名,里面存放有装着生产线所有哆啦A梦对象的一个链表。他的var值是dora,在获取产品名称时就要写成${dora.name}。lastCell的值写C4,D4都行。

jx:each(items="data" var="dora" lastCell="D4")

  第三句是第二层循环,是哆啦A梦对象(Doraemon)里的tools属性,是个链表。由于上一层循环中Doraemon对象已经在var值中被命名成dora,所以第二层循环的items写成dora.tools。并且var值为tool。这就意味着Doraemon对象tools属性中的单条遍历记录被命名成tool。所以就可以在表达式中用${tool.toolName}方法获取道具的名字(toolName)了。

jx:each(items="dora.tools" var="tool" lastCell="D4")

  不明白的同学请仔细品味一下,items相当于一个链表List,而var相当于链表中存放的单个对象。要使用这些对象就要给他们在var中命名。

  写好这三句注解后,就可以回到main方法中执行代码了。

时间: 2024-08-02 01:33:44

JXLS 2.4.0系列教程(三)——嵌套循环是怎么做到的的相关文章

JXLS 2.4.0系列教程(二)——循环导出一个链表的数据

请务必先看上一篇文章,本文在上一篇文章的代码基础上修改而成. JXLS 2.4.0系列教程(一)--最简单的模板导出 上一篇文章我们介绍了JXLS和模板导出最简单的应用,现在我们要更进一步,介绍在模板中循环导出链表中的数据,在日常开发中,循环导出应该才是最常用的功能吧! 首先,我们要建立一个类模拟javabean对象.我们定义一个person类,里面有id,name和age. public class Person { String id; String name; Integer age; p

Enterprise Library 5.0 系列教程

1. Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (初级) 2. Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) 3. Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 4. Microsoft Enterpr

CRL快速开发框架系列教程三(更新数据)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

[译]JavaFX 2.0+系列教程-使用内置的布局面板(6)-网格面板(GridPane)

[译]JavaFX 2.0+系列教程-使用内置的布局面板(6)-网格面板(GridPane) 网格面板 GridPane 使你可以创建灵活的基于行和列的网格来放置节点.节点可以放在任意一个单元格中.如果你需要的话,你也可以设置一个节点跨越多个单元格(行或者列).网格面板对于创建表单或者其他以行和列来组织的界面来说是非常有用的. 图 1-8 显示了一个网格面板,它包含了一个图标.标题.子标题.文本和一个饼状图.在图中,属性 gridLinesVisible 被用来设置显示网格线,它能展示出行和列的

[译]JavaFX 2.0+系列教程-使用内置的布局面板(4)-垂直盒子(VBox)

[译]JavaFX 2.0+系列教程-使用内置的布局面板(4)-垂直盒子(VBox) 垂直盒子 VBox 和水平盒子 HBox 很类似,只是其包含的节点是在单列中进行排列.图 1-4 显示了一个VBox的示例. 图 1-4 VBox示例 内边距(Padding)属性可以设置节点到VBox边缘的空隙.空间(Spacing)属性可以设置节点之间的间隙.边缘(Margin)属性可以为每个节点增加额外的环绕空间. 代码片段 例 1-3 创建了一个VBox,其中包含了一系列的选项. 例 1-3 创建VBo

[译]JavaFX 2.0+系列教程-使用内置的布局面板(3)-水平盒子(HBox)

[译]JavaFX 2.0+系列教程-使用内置的布局面板(3)-水平盒子(HBox) 水平盒子 HBox 为多个节点排列在一行中提供了一个简单的方法. 图 1-2 是HBox的一个示例. 图 1-2 HBox示例 内边距(Padding)属性可以设置节点到HBox边缘的空隙.空间(Spacing)属性可以设置节点之间的间隙.样式(Style)属性可以设置背景颜色. 代码片段 例 1-2 创建了一个HBox,实现了一个工具栏(ToolBar)的效果,其中包含了两个按钮. 例 1-2 创建HBox

[译]JavaFX 2.0+系列教程-使用布局(1)

JavaFX 2.0+系列教程-使用布局(1) 这个系列的教程主要是介绍如何在JavaFX应用程序中使用布局面板来创建用户界面. 主要包括以下3个主题: 使用内置的布局面板 - 介绍内置的布局面板,以及为每个面板提供简单的示例. 设置节点大小和对齐的技巧 - 提供了为节点覆盖默认大小和位置的示例. 使用CSS来修饰布局面板 - 介绍如何使用CSS来自定义布局面板. [译]JavaFX 2.0+系列教程-使用布局(1),布布扣,bubuko.com

[译]JavaFX 2.0+系列教程-使用内置的布局面板(2)-边框面板(BorderPane)

[译]JavaFX 2.0+系列教程-使用内置的布局面板(2)-边框面板(BorderPane) 边框面板 BorderPane 将面板划分为5个区域来放置界面元素:上.下.左.右.中. 图 1-1 显示了边框面板的布局示意图.每个区域的大小是没有限制的.在你使用边框面板时,如果不需要某个区域,你只要不为该区域设置内容,该区域则不会被分配显示空间,自然也就不会显示. 图 1-1 边框面板布局示意图 边框面板是我们经常见到的一个非常经典的布局效果:上面是菜单栏和工具栏,下面是状态栏,左边是导航面板

[译]JavaFX 2.0+系列教程-使用布局(2)-使用内置的布局面板(1)

JavaFX 2.0+系列教程-使用布局(2)-使用内置的布局面板(1)(Layout Pane) 本系列教程主要介绍JavaFX SDK中布局和容器相关类,我们称之为面板(Pane).使用布局面板能够非常简单的管理JavaFX应用程序中的界面元素(Node). 我们可以为每个界面元素设置位置和大小来进行手动布局,但是更简单的选择是使用布局面板.JavaFX SDK中提供了一系列的布局面板,使得可以简单的设置和管理一些经典布局,比如行(Row).列(Column).堆栈(Stack)和瓷砖(Ti