文档章节

第二章——jXLS Area(区域)

Leech
 Leech
发布于 2018/07/11 17:14
字数 1167
阅读 278
收藏 0

1    介绍

Area是jXLS中的一个主要概念。本质上,Area代表Excel文件中需要转换的一个矩形区域。每个Area有一组与之关联的转换命令和一组嵌套子区域。每个子区域也是一个Area,有自己的一组命令和嵌套子区域。顶层的Area没有父区域(没有嵌套在任意其它Area中)。

2    构建Area的方式

jXLS使用AreaBuilder接口构建Area,jXLS提供了两个实现类:XmlAreaBuilder和XlsCommentAreaBuilder。

XmlAreaBuilder是基于XML配置文件构建Area,XlsCommentAreaBuilder是基于Excel模板中的单元格注释构建Area。默认,jXLS使用XlsCommentAreaBuilder构建Area。可以通过JxlsHelper.setAreaBuilder()方法切换构建Area的方式。其实,这两种构建方式都是基于解析各自的配置使用Java API构建Area,因此,有三种构建Area的方式:

  • Java API
  • Excel标记
  • XML配置

2.1    使用Java API构建Area(推荐)

Area的实现类为XlsArea,XlsArea有以下构造函数:

public XlsArea(AreaRef areaRef, Transformer transformer);

public XlsArea(String areaRef, Transformer transformer);

public XlsArea(CellRef startCell, CellRef endCell, Transformer transformer);

public XlsArea(CellRef startCellRef, Size size, List<CommandData> commandDataList, Transformer transformer);

public XlsArea(CellRef startCellRef, Size size);

public XlsArea(CellRef startCellRef, Size size, Transformer transformer);

为了构建顶级Area,必须提供一个Transformer实例,因此,Area可以使用该Transformer进行转换。你必须使用字符串作为单元格范围或创建一个CellRef单元格引用对象定义一个单元格区域,并设置区域Size。下面是一段构造一组嵌套模板XlsArea和命令的代码:

// 创建Transformer实例
// ...
// 创建顶级区域
XlsArea xlsArea = new XlsArea("Sheet1!A1:G15", transformer);
// 创建'department'区域
XlsArea departmentArea = new XlsArea("Sheet1!A2:G13", transformer);
// 创建'EachCommand'迭代departments
EachCommand departmentEachCommand = new EachCommand("department", "departments", departmentArea);
// 创建'employee'区域
XlsArea employeeArea = new XlsArea("Sheet1!A9:F9", transformer);
// 为'IfCommand'创建区域
XlsArea ifArea = new XlsArea("Sheet1!A18:F18", transformer);
// 使用指定区域创建'if'命令
IfCommand ifCommand = new IfCommand("employee.payment <= 2000", ifArea, new XlsArea("Sheet1!A9:F9", transformer));
// 添加'if'命令实例到employee区域
employeeArea.addCommand(new AreaRef("Sheet1!A9:F9"), ifCommand);
// 创建employee 'each'命令,添加到department区域
Command employeeEachCommand = new EachCommand( "employee", "department.staff", employeeArea);
departmentArea.addCommand(new AreaRef("Sheet1!A9:F9"), employeeEachCommand);
// 添加department 'each'命令到顶级区域
xlsArea.addCommand(new AreaRef("Sheet1!A2:F12"), departmentEachCommand);

2.2    使用Excel标记构建Area

你可以在Excel模板中使用特定标记构建Area。标记放置在区域中的第一个单元格的Excel注释中。注释内容如下所示:

jx:area(lastCell = "<AREA_LAST_CELL>")

<AREA_LAST_CELL>定义区域的最后一个单元格引用。该标记定义一个顶级区域从标记注释所在单元格开始,结束于<AREA_LAST_CELL>

接下来,让我们看看第一章的员工模板:

单元格A1的注释中定义了一个区域:

jx:area(lastCell="E3")

因此,我们有一个区域覆盖单元格范围A1:E3。为了解析标记并创建XlsArea对象,我们应该使用XlsCommentAreaBuilder类:

// 获取模板输入流
InputStream is = ObjectCollectionDemo.class.getResourceAsStream("模板.xls");
// 创建POI Workbook
Workbook workbook = WorkbookFactory.create(is);
// 使用POI Workbook创建PoiTransformer
PoiTransformer transformer = PoiTransformer.createTransformer(workbook);
// 创建XlsCommentAreaBuilder实例
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
// 使用AreaBuilder构造一个Area列表
List<Area> xlsAreaList = areaBuilder.build();
// 获取主Area
Area xlsArea = xlsAreaList.get(0);

以下2行代码的主要工作是构建区域:

AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> xlsAreaList = areaBuilder.build();

首先,你通过实例化XlsCommentAreaBuilder构建一个AreaBuilder实例。第二步,调用areaBuilder.build()方法从模板构造一个Area对象列表。在获得顶级区域列表之后,可以使用它们进行Excel转换。

其实,第一章中使用的jXLS API的JxlsHelper类使用XlsCommentAreaBuilder作为默认AreaBuilder实现,所以我们直接在Excel模板中编写注释,jXLS自然会为我们创建区域。

2.3    使用XML配置构建Area

第一步,创建XML配置文件定义Area。

<xls>
    <area ref="Sheet1!A1:E3">
        <each items="employees" var="employee" ref="Sheet1!A1:E3">
            <area ref="Sheet1!A1:E3"/>
        </each>
    </area>
</xls>

根元素是xls。然后列出大量顶级area。

这里只有一个顶级区域A1:E3在Sheet1 Sheet中。

<area ref="Sheet1!A1:E3">

在area中,我们定义了相关的命令元素。此处,我们使用each xml元素定义了each命令。使用ref属性关联每个命令相关的区域。

<each items="employees" var="employee" ref="Sheet1!A1:E3">

在each命令中有一个嵌套区域参数:

<area ref="Sheet1!A1:E3"/>

 

© 著作权归作者所有

共有 人打赏支持
Leech
粉丝 20
博文 196
码字总数 399079
作品 0
武汉
架构师
私信 提问
第三章——jXLS Excel标记

jXLS的Excel标记分为3种: Bean属性标记 区域标记 命令标记 jXLS提供XlsCommentAreaBuilder类从Excel单元格注释读取标记。XlsCommentAreaBuilder实现通用AreaBuilder接口。AreaBuilder接口如...

Leech
2018/07/13
0
0
机器学习的最佳学习路线原来只有四步

AI这个词相信大家都非常熟悉,近几年来人工智能圈子格外热闹,光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。 在机器学习领域,Python已...

ufv59to8
2018/05/12
0
0
OSPF中的nssa与stub

NSSA原理简介 众所周知,OSPF路由协议是目前因特网中应用最为广泛一种IGP,而NSSA则是在该协议发展过程中产生的一种新的属性,她的英文全称是"not-so-stubby" area,一个充满了幽默味道的名字...

技术小甜
2017/11/16
0
0
Accelerator/RxSwift-document-translation

RxSwift-文档翻译 翻译后的完整项目地址 对RxSwift 官方playground的翻译,playGround基于2016年12月1日版本 重要提示:使用Rx.playground: 打开Rx.xcworkspace. 编译 RxSwift-macOS 项目 ...

Accelerator
2016/12/27
0
0
《Pro ASP.NET MVC 3 Framework》学习笔记之二十一【Area及URL架构的最佳实践】

使用Areas MVC框架支持在areas(区域)里面组织一个web应用程序,每一个area呈现应用程序的一个功能段,比如管理,订单,客户支持等等。这对于一个大的项目是非常有用的,因为将所有的control...

mszhangxuefei
2012/02/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

钢铁侠自曝:特斯拉“哨兵模式” 来了!

北京时间1月23日消息,特斯拉车主可能很快就可以查看和记录汽车在无人看管时受到的损坏。 一位特斯拉车主在Twitter上向特斯拉CEO埃隆·马斯克(Elon Musk)抱怨称,他的车门凹进去了一大块,希...

Linux就该这么学
9分钟前
1
0
Java基础教程,第十一讲,阻止继承与抽象类

上一节课我们学习了Java中的继承语法,以及如何继承中的方法重写和super()关键字,今天我们将学习一下如何阻止继承以及抽象类。 课程内容 阻止继承:final类和方法 有些时候我们希望阻止某个...

程序员补给栈
22分钟前
0
0
mount命令

mount命令可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了。 mount [-t vfstype] [-o options] device dir loop:用来...

Danni3
28分钟前
1
0
推荐一款接口 API 设计神器!

今天栈长给大家推荐一款接口 API 设计神器,传说中的,牛逼哄洪的 Swagger,它到底是什么?今天为大家揭开谜底! Swagger是什么? 官网:https://swagger.io/ Swagger 如官网所示,它是最好的...

Java技术栈
38分钟前
7
0
AMD直奔5nm!这一步棋下得妙

AMD今年将推出采用7nm工艺的第二代EPYC霄龙、第三代Ryzen锐龙处理器,其中后者已经在CES 2019上公开首秀,性能追评i9-9900K,功耗则低得多。 虽然被称为“女友”的GlobalFoundries临时决定放...

linuxCool
44分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部