Apache POI is a popular API that allows programmers to create, modify, and display MS Office files using Java programs. This time I will show you how to read an Excel file. First we need to create a Java basic project using lazybones.
lazybones create java-basic excel-reader
Previous command will create this structure
<proj>
|
+- src
|
+- main
| |
| +- java
|
+- test
| |
| +- java
Edit your build.gradle
file to add Apache POI dependencies.
ext.apachePoiVersion = '3.15'
ext.groovyVersion = '2.4.8'
ext.spockVersion = '1.1-groovy-2.4-rc-3'
apply plugin: "java"
apply plugin: 'groovy'
apply plugin: "application"
repositories {
mavenCentral()
}
dependencies {
compile "org.apache.poi:poi:$apachePoiVersion"
compile "org.apache.poi:poi-ooxml:$apachePoiVersion"
testCompile "org.codehaus.groovy:groovy:$groovyVersion"
testCompile "org.spockframework:spock-core:$spockVersion"
}
This is the Excel file we are going to read:
The below code explains how to read an Excel file using Apache POI libraries.
package example;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelReader {
List<String> readRows(Integer numberOfRows, File excelFile){
List content = new ArrayList<ArrayList<String>>();
List line = new ArrayList<String>();
try{
FileInputStream fileInputStream = new FileInputStream(excelFile);
Workbook workbook = new XSSFWorkbook(fileInputStream);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
line = new ArrayList<String>();
for (Cell cell : row) {
if (cell.getCellTypeEnum() == CellType.STRING) {
line.add(cell.getStringCellValue());
} else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
line.add(String.valueOf(cell.getNumericCellValue()));
}
}
content.add(line);
}
} catch(FileNotFoundException fne){
throw new ExcelException(fne.getMessage(), fne);
} catch(IOException ioe){
throw new ExcelException(ioe.getMessage(), ioe);
}
return content;
}
}
This is the ExelException:
package example;
import java.lang.RuntimeException;
import java.lang.Throwable;
public class ExcelException extends RuntimeException {
ExcelException(String message){
super(message);
}
ExcelException(String message, Throwable cause){
super(message, cause);
}
}
To test read Excel funtionality we are using Spock Framework
package example
import spock.lang.Specification
class ExcelReaderSpec extends Specification {
ExcelReader excelReader = new ExcelReader()
void "should read Excel rows"(){
given:"Rows to read"
Integer numberOfRows = 5
and:"An excel file"
File excelFile = new File("src/test/resources/input.xlsx")
when:"We read rows"
List<List<String>> result = excelReader.readRows(numberOfRows, excelFile)
then:"We expect to get content"
result.size() == 4
result.get(0) == ['Name', 'Email', 'Ranking']
result.get(1) == ['josdem','joseluis.delacruz@gmail.com','5.0']
result.get(2) == ['eric','erich@email.com','5.0']
result.get(3) == ['martin','martinv@email.com','5.0']
}
}
To run the project:
gradle test
To download the code:
git clone https://github.com/josdem/java-topics.git
cd excel-reader