Spire.XLS for Java

Java Excel Library – Create Read Modify Print Convert Excel Documents in Java

  • Overview
  • Features
  • Support
  • What's New
  • Live Demo

Standalone Java API
to Process Excel Worksheets

Over 1,000,000 Developers Are Already Using Our Libraries
To Create Their Amazing Applications.

Spire.XLS for Java is a professional Java Excel API that enables developers to create, manage, manipulate, convert and print Excel worksheets without using Microsoft Office or Microsoft Excel.


Spire.XLS for Java supports both for the old Excel 97-2003 format (.xls) and for the new Excel 2007, Excel 2010, Excel 2013, Excel 2016 and Excel 2019 (.xlsx, .xlsb, .xlsm), along with Open Office (.ods) format. Spire.XLS for Java offers a wide range of features of operating Excel worksheets on Java applications, such as creating, reading, editing, converting and printing Excel worksheets, finding/replacing data, creating charts, inserting/extracting/deleting textboxes, creating auto filters, reading/writing hyperlinks, creating/modifying/removing tables, merging/unmerging cells and files, grouping/ungrouping rows and columns, freezing/unfreezing panes, adding digital signatures, encrypting/decrypting Excel workbooks, copy rows/columns/cells with formatting etc.

  • Convert

  • Export

  • Validate

  • Formula

  • Format

  • Chart

  • Pivot Table

  • Group

  • Merge

  • Highlight

Convert Excel to PDF

Whenever you need to share an important Excel report with a partner, it's best to convert the file to PDF to ensure it looks the same as it does on your device.

Export Data from Database to Excel

When data is exported from a database to Excel, it can be analyzed and visualized, as well as viewed and processed by users who are not database users.

Apply Data Validation

Data validation in Excel controls what kind of data can be entered into a certain cell, which ensures that all data entries are accurate and consistent.

Insert Formulas and Functions

Formula is an expression that calculates values in a cell or in a range of cells, while function is a predefined formula already available in Excel. Both formulas and functions are very useful when you need to calculate numbers or solve math problems in Excel.

Apply Conditional Formatting

Conditional formatting is a helpful feature that allows applying special formats to cells meeting specific criteria. It is often used to emphasize or differentiate data stored in worksheets.

Create a Chart

Chart is a fantastic tool to visually group and analyze data. It provides the reader with the structure of the data set and displays the data in a graphical representation, making it easier for most users to see the data.

Create a Pivot Table

Pivot table is a kind of interactive table that allow users to quickly categorize, calculate, summarize and analyze large amounts of data in a concise tabular format.

Group Rows or Columns

For worksheets with large amounts of data, grouping rows or columns that contain similar information can make the worksheet more compact and understandable.

Merge Excel Files

Merging Excel files with associated content can help us work with worksheet data more easily and also make it easier to share and read the contents of our workbooks.

Find and Highlight

You can find all cells containing a specific value and highlight them with the same background color to make the value outstanding and more easily to be found out.

JAVA

Standalone Java Component

100% independent Java Excel class library
Doesn't require Microsoft Office installed on system.

VERSION

  • Excel 97-2003
  • Excel 2007
  • Excel 2010
  • Excel 2013
  • Excel 2016
  • Excel 2019
  • OpenOffice

OPERATION

Powerful Toolset, Multichannel Support

  • Import and Export Data

  • Reports

  • Manage Comments

  • Work with Pivot Table

  • Work with Excel Charts

  • Images and Shapes

  • Find Replace Highlight

  • Manage Hyperlinks

  • Print

  • Header and Footer

  • Text and Image Watermark

  • Conditional Formatting

  • Excel Formula

  • Set auto-filters
    & Page Breaks

  • Merge Split Cells
    and Files

  • Protect, Encrypt, Decrypt

  • Add Digital Signature

CONVERSION

Convert File Documents with High Quality

  • TEXT

  • XPS

  • SVG

  • PDF

  • XML

  • Image

XLsx,XLSM,XLSB,ODS

  • CSV

  • HTML

  • PNG

  • BMP

  • JPEG

  • EMF

  • TIFF

  1. Chart

Excel

MAIN FUNCTION

Only Spire.XLS for Java, No Microsoft Office

Spire.XLS for Java is a totally independent Excel library, Microsoft Office or Microsoft Excel is not required in order to use Spire.XLS for Java.

High Quality File Conversion

Spire.XLS for Java allows converting files from Excel to PDF, HTML, ODS, CSV, Text (TXT), Image, XML, SVG, PostScript, XPS etc. And on the other hand, most of popular files can be transferred to Excel back, such as converting HTML, CSV, XLSX, XML to Excel.

Support a Rich Set of Excel Elements

Spire.XLS for Java supports a rich set of Excel elements, including comment, pivot table, charts, shapes, tables, images, hyperlinks, reports, add digital signature, text/image watermark, Excel formula and many more. Spire.XLS for Java also embeds many flexible options for displaying worksheets, such as page breaks, zoom-setting, set number formats, freeze panes, headers/footers, print excel files, print paper size and print area etc.

Easy Integration

Spire.XLS for Java can be easily integrated into Java applications.

Commercial Edition $999

Compared with Free Spire.XLS for Java, the commercial edition of Spire.XLS for Java has no limitation on the number of worksheets and rows. It is more comprehensive in processing Excel files.


Free Edition $0

Free version is limited to 5 sheets per workbook and 200 rows per sheet. This limitation is enforced during reading or writing XLS files. When converting Excel files to PDF files, you can only get the first 3 pages of PDF file.

GET STARTED

Free Trials for All Advanced Solutions

Here is a brief summary of Spire.XLS for Java features.

File Format Supports

  • Spire.XLS for Java offers support both for the old Excel 97-2003 format (.xls) and for the new Excel 2007,Excel 2010, Excel 2013, Excel 2016 and Excel 2019 (.xlsx, .xlsb, .xlsm), along with Open Office(.ods) format.
  • Load and save documents in the tab delimited file format.
  • Comprehensive support of the CSV format to interact with a variety of applications.
  • Easily extract text by saving in plain text format.

Conversion

Contents Features

Formatting Features

Page Setup Features

We guarantee one business day Forum questions Reply.

We guarantee one business day E-mail response.

Free Customized service for OEM Users.

Skype name: iceblue.support

Apply for a Free Trial License File.

If you have tried out our products and found them useful, please consider sharing your experience with others. By sharing your testimonial with us, you will not only help others to make the right decision but will also to earn rewards from us. Please send your testimonials to [email protected].

This is the list of changelogs of Spire.XLS for Java New release and hotfix. You can get the detail information of each version's new features and bug solutions.

Download Spire.XLS for Java to start a free trial:

Version: 15.4.0

Category ID Description
New feature - Supports creating a slicer using table data.
Workbook wb = new Workbook();
//Get the first worksheet of workbook
Worksheet worksheet = wb.getWorksheets().get(0);
worksheet.getRange().get("A1").setValue("fruit");
worksheet.getRange().get("A2").setValue("grape");
worksheet.getRange().get("A3").setValue("blueberry");
worksheet.getRange().get("A4").setValue("kiwi");
worksheet.getRange().get("A5").setValue("cherry");
worksheet.getRange().get("A6").setValue("grape");
worksheet.getRange().get("A7").setValue("blueberry");
worksheet.getRange().get("A8").setValue("kiwi");
worksheet.getRange().get("A9").setValue("cherry");

worksheet.getRange().get("B1").setValue("year");
worksheet.getRange().get("B2").setValue2(2020);
worksheet.getRange().get("B3").setValue2(2020);
worksheet.getRange().get("B4").setValue2(2020);
worksheet.getRange().get("B5").setValue2(2020);
worksheet.getRange().get("B6").setValue2(2021);
worksheet.getRange().get("B7").setValue2(2021);
worksheet.getRange().get("B8").setValue2(2021);
worksheet.getRange().get("B9").setValue2(2021);

worksheet.getRange().get("C1").setValue("amount");
worksheet.getRange().get("C2").setValue2(50);
worksheet.getRange().get("C3").setValue2(60);
worksheet.getRange().get("C4").setValue2(70);
worksheet.getRange().get("C5").setValue2(80);
worksheet.getRange().get("C6").setValue2(90);
worksheet.getRange().get("C7").setValue2(100);
worksheet.getRange().get("C8").setValue2(110);
worksheet.getRange().get("C9").setValue2(120);

//Get slicer collection
XlsSlicerCollection slicers = worksheet.getSlicers();

//Create a super table with the data from the specific cell range.
IListObject table = worksheet.getListObjects().create("Super Table", worksheet.getRange().get("A1:C9"));

int count = 3;
int index = 0;
for (Object styletype : SlicerStyleType.values())
{
	SlicerStyleType type = (SlicerStyleType)styletype;
	count += 5;
	//Add a Slicer through pivot table data : here invoke Add(IListObject, string, int) api.
	String range = "E" + count;
	index = slicers.add(table, range.toString(), 0);

	//Style setting
	XlsSlicer xlsSlicer = slicers.get(index);
	xlsSlicer.setName("slicers_" + count);
	xlsSlicer.setStyleType(type);

}

//Save to file
wb.saveToFile(outputFile_xlsx, ExcelVersion.Version2013);
New feature - Supports creating a slicer using pivot table data.
Workbook wb = new Workbook();
//Get the first worksheet of workbook
Worksheet worksheet = wb.getWorksheets().get(0);
worksheet.getRange().get("A1").setValue("fruit");
worksheet.getRange().get("A2").setValue("grape");
worksheet.getRange().get("A3").setValue("blueberry");
worksheet.getRange().get("A4").setValue("kiwi");
worksheet.getRange().get("A5").setValue("cherry");
worksheet.getRange().get("A6").setValue("grape");
worksheet.getRange().get("A7").setValue("blueberry");
worksheet.getRange().get("A8").setValue("kiwi");
worksheet.getRange().get("A9").setValue("cherry");

worksheet.getRange().get("B1").setValue("year");
worksheet.getRange().get("B2").setValue2(2020);
worksheet.getRange().get("B3").setValue2(2020);
worksheet.getRange().get("B4").setValue2(2020);
worksheet.getRange().get("B5").setValue2(2020);
worksheet.getRange().get("B6").setValue2(2021);
worksheet.getRange().get("B7").setValue2(2021);
worksheet.getRange().get("B8").setValue2(2021);
worksheet.getRange().get("B9").setValue2(2021);

worksheet.getRange().get("C1").setValue("amount");
worksheet.getRange().get("C2").setValue2(50);
worksheet.getRange().get("C3").setValue2(60);
worksheet.getRange().get("C4").setValue2(70);
worksheet.getRange().get("C5").setValue2(80);
worksheet.getRange().get("C6").setValue2(90);
worksheet.getRange().get("C7").setValue2(100);
worksheet.getRange().get("C8").setValue2(110);
worksheet.getRange().get("C9").setValue2(120);

// Get pivot table collection
PivotTablesCollection pivotTables = worksheet.getPivotTables();

//Add a PivotTable to the worksheet
CellRange dataRange = worksheet.getRange().get("A1:C9");
PivotCache cache = wb.getPivotCaches().add(dataRange);

//Cell to put the pivot table
PivotTable pt = worksheet.getPivotTables().add("TestPivotTable", worksheet.getRange().get("A12"), cache);

//Drag the fields to the row area.
IPivotField pf = pt.getPivotFields().get("fruit");
pf.setAxis(AxisTypes.Row);
IPivotField pf2 = pt.getPivotFields().get("year");
pf2.setAxis(AxisTypes.Column);

//Drag the field to the data area.
pt.getDataFields().add(pt.getPivotFields().get("amount"), "SUM of Count", SubtotalTypes.Sum);

//Set PivotTable style
pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleMedium10);


//Get slicer collection
XlsSlicerCollection slicers = worksheet.getSlicers();

//Add a Slicer through pivot table data: here invoke Add(IPivotTable, string, int) api.
int index = slicers.add(pt, "E12", 0);

XlsSlicer xlsSlicer = slicers.get(index);
xlsSlicer.setName("test_xlsSlicer");
xlsSlicer.setWidth(100);
xlsSlicer.setHeight(120);
xlsSlicer.setStyleType(SlicerStyleType.SlicerStyleLight2);
xlsSlicer.isPositionLocked(true);

//Get SlicerCache object of current slicer
XlsSlicerCache slicerCache = xlsSlicer.getSlicerCache();
slicerCache.setCrossFilterType(SlicerCacheCrossFilterType.ShowItemsWithNoData);

//Style setting
XlsSlicerCacheItemCollection slicerCacheItems = xlsSlicer.getSlicerCache().getSlicerCacheItems();
XlsSlicerCacheItem xlsSlicerCacheItem = slicerCacheItems.get(0);
xlsSlicerCacheItem.isSelected(false);

XlsSlicerCollection slicers_2 = worksheet.getSlicers();

IPivotField r1 = pt.getPivotFields().get("year");
int index_2 = slicers_2.add(pt, "I12", r1);

XlsSlicer xlsSlicer_2 = slicers.get(index_2);
xlsSlicer_2.setRowHeight(40);
xlsSlicer_2.setStyleType(SlicerStyleType.SlicerStyleLight3);
xlsSlicer_2.isPositionLocked(false);

//Get SlicerCache object of current slicer
XlsSlicerCache slicerCache_2 = xlsSlicer_2.getSlicerCache();
slicerCache_2.setCrossFilterType(SlicerCacheCrossFilterType.ShowItemsWithDataAtTop);

//Style setting
XlsSlicerCacheItemCollection slicerCacheItems_2 = xlsSlicer_2.getSlicerCache().getSlicerCacheItems();
XlsSlicerCacheItem xlsSlicerCacheItem_2 =  slicerCacheItems_2.get(1);
xlsSlicerCacheItem_2.isSelected(false);
pt.calculateData();

//Save to file
wb.saveToFile("out.xlsx", ExcelVersion.Version2013);
New feature - Supports removing slicers.
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);

//Get slicer collection of first worksheet
Worksheet worksheet_1 = wb.getWorksheets().get(0);
XlsSlicerCollection slicers = worksheet_1.getSlicers();
//  Remove the first slicer by index
slicers.removeAt(0);

XlsSlicer slicer = worksheet_1.getSlicers().get(1);
// Remove second slicer by object
worksheet_1.getSlicers().remove(slicer);

Worksheet worksheet_2 = wb.getWorksheets().get(2);
// Remove all slicers
worksheet_2.getSlicers().clear();

//Save to file
wb.saveToFile(outputFile_xlsx, ExcelVersion.Version2013);
New feature - Supports modifying slicers.
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);

//Get the first worksheet of workbook
Worksheet worksheet = wb.getWorksheets().get(0);

// Get slicer collection
XlsSlicerCollection slicers = worksheet.getSlicers();

//Style setting
XlsSlicer xlsSlicer = slicers.get(0);

xlsSlicer.setStyleType(SlicerStyleType.SlicerStyleDark4);
xlsSlicer.setCaption("Slicer");
xlsSlicer.isPositionLocked(true);

XlsSlicerCacheItemCollection slicerCacheItems = xlsSlicer.getSlicerCache().getSlicerCacheItems();
XlsSlicerCacheItem xlsSlicerCacheItem = slicerCacheItems.get(0);
xlsSlicerCacheItem.isSelected(false);

//Get SlicerCache object of current slicer
XlsSlicerCache slicerCache = xlsSlicer.getSlicerCache();
slicerCache.setCrossFilterType(SlicerCacheCrossFilterType.ShowItemsWithNoData);

//Save to file
wb.saveToFile(outputFile_xlsx, ExcelVersion.Version2013);
New feature - Supports retrieving slicer information.
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);

// Get slicer collection of first worksheet
Worksheet worksheet = wb.getWorksheets().get(0);

XlsSlicerCollection slicers = worksheet.getSlicers();
StringBuilder builder = new StringBuilder();
builder.append("slicers.Count:" + slicers.getCount()+"\r
");

XlsSlicer xlsSlicer = slicers.get(1);

builder.append("xlsSlicer.Name:" + xlsSlicer.getName()+"\r
");
builder.append("xlsSlicer.Caption:" + xlsSlicer.getCaption()+"\r
");
builder.append("xlsSlicer.NumberOfColumns:" + xlsSlicer.getNumberOfColumns()+"\r
");
builder.append("xlsSlicer.ColumnWidth:" + xlsSlicer.getColumnWidth()+"\r
");
builder.append("xlsSlicer.RowHeight:" + xlsSlicer.getRowHeight()+"\r
");
builder.append("xlsSlicer.ShowCaption:" + xlsSlicer.isShowCaption()+"\r
");
builder.append("xlsSlicer.PositionLocked:" + xlsSlicer.isPositionLocked()+"\r
");
builder.append("xlsSlicer.Width:" + xlsSlicer.getWidth()+"\r
");
builder.append("xlsSlicer.Height:" + xlsSlicer.getHeight()+"\r
");

//Get SlicerCache object of current slicer
XlsSlicerCache slicerCache = xlsSlicer.getSlicerCache();

builder.append("slicerCache.SourceName:" + slicerCache.getSourceName()+"\r
");
builder.append("slicerCache.IsTabular:" + slicerCache.isTabular()+"\r
");
builder.append("slicerCache.Name:" + slicerCache.getName()+"\r
");

XlsSlicerCacheItemCollection slicerCacheItems = slicerCache.getSlicerCacheItems();
XlsSlicerCacheItem xlsSlicerCacheItem = slicerCacheItems.get(1);


builder.append("xlsSlicerCacheItem.Selected:" + xlsSlicerCacheItem.isSelected() +"\r
");

FileWriter fw = new FileWriter(outputFile_T);
fw.write(builder.toString());
fw.flush();
fw.close();
wb.dispose();
Bug SPIREXLS-5569 Fixes the issue that OLE objects failed to open correctly after converting Excel to XLSB format.
Bug SPIREXLS-5673 Fixes the issue that alignment was incorrect when converting Excel to PDF.
Bug SPIREXLS-5752 Optimizes the text rendering effect of grouped shapes when converting Excel to PDF.
Bug SPIREXLS-5757 Fixes the issue that some formula values were calculated incorrectly when converting Excel to images.

Version: 15.3.1

Category ID Description
Bug SPIREXLS-5698 Fixes the issue that the decimal parts were lost when setting cell font size.
Bug SPIREXLS-5699 Fixes the issue that the embedded image failed to display when converting Excel document to HTML document.
Bug SPIREXLS-5720 Fixes the issue that the program threw the exception 'NullPointerException' when loading Excel document.

Version: 15.2.1

Category ID Description
Bug SPIREXLS-5575 Fixes the issue that the program threw a "NullPointerException" when loading an XLSX document.
Bug SPIREXLS-5668 Fixes the issue that incorrect colors existed when converting Excel to images.
Bug SPIREXLS-5685 Fixes the issue that incomplete content displayed when converting Excel to PDF.

Version: 15.1.3

Category ID Description
Bug SPIREXLS-5559 Fixes the issue that the program threw an exception when calculating values using the workbook.calculateAllValue().
Bug SPIREXLS-5617 Fixes the issue that the results of formulas were incorrect when converting worksheets to images.
Bug SPIREXLS-5636 Fixes the issue that inconsistency occurred when converting Excel documents to PDF documents.
Bug SPIREXLS-5645 Fixes the issue that the program threw a java.lang.NumberFormatException exception when loading HTML documents.
Bug SPIREXLS-5658 Fixes the issue that "Invalid ValidationType string val" occurred when loading XLSX documents.
Bug SPIREXLS-5663 Fixes the issue that the title of the created chart overlapped with the chart's data.
Bug SPIREXLS-5664 Fixes the issue that failed to add rich text in merged cells.
Bug SPIREXLS-5676 Fixes the issue that the layout of contents was incorrect when converting worksheets to images.

Version: 15.1.0

Category ID Description
New feature SPIREXLS-5600 Support setting global custom font folder.
Workbook.setGlobalCustomFontsFolders(new String[]{});
Bug SPIREXLS-5345 Fixes the issue that the text placement was incorrect when converting Excel to PDF.
Bug SPIREXLS-5568 Fixes the issue that the seconds data was inaccurate when reading time values from cells.
Bug SPIREXLS-5619 Fixes the issue that the scaling ratio changed after copying the worksheet.
Bug SPIREXLS-5634 Fixes the issue that the program threw an "unknown image format" exception when loading Excel document containing webp format images.
Bug SPIREXLS-5646 Adjusts the purchase link in the warning message worksheet.

Version: 14.12.0

Category ID Description
Bug SPIREXLS-5553 Fixes the issue that the content formatting was inconsistent when converting HTML documents to Excel documents.
Bug SPIREXLS-5568 Fixes the issue that the icons of the added OLE objects were displayed incorrectly.

Version: 14.11.0

Category ID Description
Bug SPIREXLS-5446 Fixes the issue that the program threw "Specified argument was out of the range of valid values" when converting XLSX to XLSB.
Bug SPIREXLS-5493 Fixes the issue that incorrect effect occurred when using Worksheet.autoFitColumn.
Bug SPIREXLS-5516 Fixes the issue that content got lost when converting Excel to PDF.
Bug SPIREXLS-5526 Fixes the issue that font sizes were inconsistent after saving some Excel files.

Version: 14.9.8

Category ID Description
New feature SPIREXLS-5371 Supports the revision function.
Workbook workbook = new Workbook();
workbook.loadFromFile("input.xlsx");
workbook.setTrackedChanges(true);  
workbook.acceptAllTrackedChanges(); 
workbook.saveToFile("output.xlsx", ExcelVersion.Version2013);
workbook.dispose();
New feature SPIREXLS-5362 Optimizes the speed of converting Excel documents to HTML documents.
Bug SPIREXLS-5149 Fixes the issue that print area settings are not fully copied when duplicating worksheets.
Bug SPIREXLS-5295 Fixes the issue that some data is incorrect when converting Excel documents to PDF documents.
Bug SPIREXLS-5368 Fixes the issue that chart contents are lost when converting worksheets to images.
Bug SPIREXLS-5368 Fixes the issue that the program throws an exception "Input string was not in the correct format." when converting charts to images.
Bug SPIREXLS-5432 Fixes the issue that the program throws a java.lang.IllegalArgumentException exception when loading Excel documents.
Bug SPIREXLS-5435 Fixes the issue that conditional formatting is lost when converting Excel documents to XML documents and then back to Excel documents.
Bug SPIREXLS-5441 Fixes the issue that the program throws a java.lang.OutOfMemoryError exception when converting Excel documents to PDF documents.
Bug SPIREXLS-5442 Fixes the issue that fonts are incorrect when converting Excel documents to PDF documents.

Version: 14.8.2

Category ID Description
New feature SPIREXLS-5147 Provides the hideCategoriTags method to support hiding category labels.
Chart chart = sheet.getCharts().get(0);
String[] labels = chart.getCategoryLabels();
chart.hideCategoryLabels(new String[]
{ labels [0], labels [1], ...}
); 
New feature SPIREXLS-5338 Supports embedding images in cells.
worksheet.getCellRange("B1").insertOrUpdateCellImage("D:\\vs1.png",true);
Bug SPIREXLS-5331 Fixes the issue that caused incorrect content when saving an Excel document and opening it in Microsoft Excel 2016.
Bug SPIREXLS-5337 Fixes the issue that resulted in incorrect pivot table data calculation.

Version: 14.7.5

Category ID Description
Bug SPIREXLS-5279 Fixed the issue that some formula values are calculated incorrectly when saving Excel files.
Bug SPIREXLS-5281 Fixed the issue that the data points of charts were incorrectly positioned after converting Excel to PDF.
Bug SPIREXLS-5282 Fixes the issue that the parameters received by the createGroup method for pivot table grouping were incorrect.
Bug SPIREXLS-5288 Fixes the issue that the trend line added to a chart was not displayed in the WPS tool.
Bug SPIREXLS-5294 Fixed the issue that the effect of printing Excel was incorrect after setting PrintErrorsType.NA.
Bug SPIREXLS-5318 Fix the issue that the content was lost after converting Excel to PDF.
Request free customized demo just for you.

Tab 1

Upload

Maximum file size: 1 MB. Files accepted: xls, xlsx, xlsb, ods.
Click here to browse files.
fileerrors

Convert to

Source file:
filename
Target file type:

Tab 2

Tab 3

Tab 4

Mathematic Functions:

Calculate symbol : Calculate Data:

Logic Function:

Calculate symbol : Calculate Data:

Simple Expression:

Calculate symbol : Calculate Data:

MID Functions:

Text : Start Number:
Number Charts:

Option:

Excel Version:
downloads

Tab 5

Data

fileerrors

Option

Excel Version:
downloads

If you don't find the function you want, please fill in a form to request a free demo from us. Make sure the demo you want meets the following requirements:

  • It is a small project that implements a particular scenario.
  • It relates to our libraries stored on E-iceblue online store.
  • It costs less than 2 hours for us to complete it.
  • It is not a bug report.
  • It is not a feature request.