第二章——jXLS Area(區域)

1    介紹

Area是jXLS中的一個主要概念。本質上,Area表明Excel文件中須要轉換的一個矩形區域。每一個Area有一組與之關聯的轉換命令和一組嵌套子區域。每一個子區域也是一個Area,有本身的一組命令和嵌套子區域。頂層的Area沒有父區域(沒有嵌套在任意其它Area中)。java

2    構建Area的方式

jXLS使用AreaBuilder接口構建Area,jXLS提供了兩個實現類:XmlAreaBuilder和XlsCommentAreaBuilder。函數

XmlAreaBuilder是基於XML配置文件構建Area,XlsCommentAreaBuilder是基於Excel模板中的單元格註釋構建Area。默認,jXLS使用XlsCommentAreaBuilder構建Area。能夠經過JxlsHelper.setAreaBuilder()方法切換構建Area的方式。其實,這兩種構建方式都是基於解析各自的配置使用Java API構建Area,所以,有三種構建Area的方式:ui

  • Java API
  • Excel標記
  • XML配置

2.1    使用Java API構建Area(推薦)

Area的實現類爲XlsArea,XlsArea有如下構造函數:spa

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和命令的代碼:code

// 建立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註釋中。註釋內容以下所示:orm

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

<AREA_LAST_CELL>定義區域的最後一個單元格引用。該標記定義一個頂級區域從標記註釋所在單元格開始,結束於<AREA_LAST_CELL>xml

接下來,讓咱們看看第一章的員工模板:對象

單元格A1的註釋中定義了一個區域:blog

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"/>
相關文章
相關標籤/搜索