Jxls is based on the following main concepts
XlsArea
Command
Transformer
Let’s discuss each of these concepts in detail.
XlsArea represents a rectangular area in an Excel file. It may be defined using a cell range or by specifying a start cell and a size (number of columns and rows) of the area. XlsArea includes all the Excel cells in the specified range.
Each XlsArea may have a set of Commands associated with it which will be executed during the area processing by Jxls engine. XlsArea may have child areas which are nested in it. Each child area is also XlsArea with its own Commands and may have its own child areas.
XlsArea can be defined using the following ways
You can find more details and usage examples in here
Command represents a transformation action on a single or multiple XlsAreas.
The corresponding Java interface looks like this
public interface Command { String getName(); List<Area> getAreaList(); Command addArea(Area area); Size applyAt(CellRef cellRef, Context context); void reset(); }
The main method of any Command is Size applyAt(CellRef cellRef, Context context) . The method applies the Command action at cell cellRef passing the data with context variable. Context works like a map and is used to pass the data to a command. The method returns the new dimensions of the transformed area as a Size object.
Currently Jxls provides the following built-in commands
You can also define custom commands as explained in Custom-Command
The passing data to a Command is performed through the Context object which works as a map with keys referred in XLS template and values set to the data.
Transformer interface allows XlsArea to interact with Excel independently of any specific implementation. It means that by providing different implementations of Transformer interface we can use different underlying Java-to-Excel libraries.
The interface looks like this
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); }
Although it looks like a lot of methods but many of them are already implemented in the base abstract class AbstractTransformer and can be just inherited if one needs to support a new java-to-excel implementation.
Jxls provides a built-in implementation of the Transformer interface PoiTransformer which is based on the well-known Apache POI library.