Area是jXLS中的一個主要概念。本質上,Area表明Excel文件中須要轉換的一個矩形區域。每一個Area有一組與之關聯的轉換命令和一組嵌套子區域。每一個子區域也是一個Area,有本身的一組命令和嵌套子區域。頂層的Area沒有父區域(沒有嵌套在任意其它Area中)。java
jXLS使用AreaBuilder接口構建Area,jXLS提供了兩個實現類:XmlAreaBuilder和XlsCommentAreaBuilder。函數
XmlAreaBuilder是基於XML配置文件構建Area,XlsCommentAreaBuilder是基於Excel模板中的單元格註釋構建Area。默認,jXLS使用XlsCommentAreaBuilder構建Area。能夠經過JxlsHelper.setAreaBuilder()方法切換構建Area的方式。其實,這兩種構建方式都是基於解析各自的配置使用Java API構建Area,所以,有三種構建Area的方式:ui
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);
你能夠在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天然會爲咱們建立區域。
第一步,建立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"/>