Ejemplo sencillo de cómo leer datos de un archivo Excel o CSV en Java

Escrito por el .
java planeta-codigo programacion
Comentarios

Java

Los formatos de archivo de columnas separadas por comas o CSV y los documentos en formato de hojas de cálculo excel del paquete ofimático Microsoft Office son muy utilizados como formato de archivo para intercambiar datos entre aplicaciones o simplemente como contenedores de datos. Para leer los datos en estos formatos de archivos en Java hay que emplear alguna librería que facilite y entienda estos formatos de los archivos. Para leer los archivos CSV está la librería OpenCSV y para los archivos excel está la librería Apache POI.

Con Apache POI para acceder al archivo excel hay que usar unas pocas clases de su API como HSSFWorkbook, HSSFSheet, HSSFRow, HSSFCell y utilizar el método adecuado según el tipo de datos a obtener.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package io.github.picodotdev.blogbitix.holamundoapachepoi;

...

public class Main {

    private static List<Object> DATA;

    static {
        DATA = Arrays.asList(new Object[] {
            new Object[] { "PlayStation 4 (PS4) - Consola 500GB", new BigDecimal("340.95"), "https://www.amazon.es/PlayStation-4-PS4-Consola-500GB/dp/B013U9CW8A" },
            new Object[] { "Raspberry Pi 3 Modelo B (1,2 GHz Quad-core ARM Cortex-A53, 1GB RAM, USB 2.0)", new BigDecimal("41.95"), "https://www.amazon.es/Raspberry-Modelo-GHz-Quad-core-Cortex-A53/dp/B01CD5VC92/" },
            new Object[] { "Gigabyte Brix - Barebón (Intel, Core i5, 2,6 GHz, 6, 35 cm (2.5\"), Serial ATA III, SO-DIMM) Negro ", new BigDecimal("421.36"), "https://www.amazon.es/Gigabyte-Brix-Bareb%C3%B3n-Serial-SO-DIMM/dp/B00HFCTUPM/" }
        });
    }

    public static void main(String[] args) throws Exception {
        writeExcel();
        readExcel();

        writeCsv();
        readCsv();
    }

    ...

    private static void readExcel() throws Exception {
        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("data.xls"));
        HSSFSheet sheet = wb.getSheetAt(0);

        int rows = sheet.getLastRowNum();
        for (int i = 1; i < rows; ++i) {
            HSSFRow row = sheet.getRow(i);

            HSSFCell productCell = row.getCell(0);
            HSSFCell priceCell = row.getCell(1);
            HSSFCell linkCell = row.getCell(2);

            String product = productCell.getStringCellValue();
            BigDecimal price = new BigDecimal(priceCell.getNumericCellValue()).setScale(2, BigDecimal.ROUND_HALF_DOWN);
            String link = linkCell.getStringCellValue();

            System.out.printf("%s, %s, %s%n", product, price.toString(), link);
        }
    }

    ...
}

Para el caso de los CSV hay que utilizar la clase CSVReader que permite iterar sobre las líneas del archivo teniendo en cuenta el caracter separador de las columnas y las comillas de los datos. Para acceder a los valores de cada una de las columnas hay que convertir al tipo de datos deseado ya que siempre se devuelve un String.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package io.github.picodotdev.blogbitix.holamundoapachepoi;

...

public class Main {

    private static List<Object> DATA;

    static {
        DATA = Arrays.asList(new Object[] {
            new Object[] { "PlayStation 4 (PS4) - Consola 500GB", new BigDecimal("340.95"), "https://www.amazon.es/PlayStation-4-PS4-Consola-500GB/dp/B013U9CW8A" },
            new Object[] { "Raspberry Pi 3 Modelo B (1,2 GHz Quad-core ARM Cortex-A53, 1GB RAM, USB 2.0)", new BigDecimal("41.95"), "https://www.amazon.es/Raspberry-Modelo-GHz-Quad-core-Cortex-A53/dp/B01CD5VC92/" },
            new Object[] { "Gigabyte Brix - Barebón (Intel, Core i5, 2,6 GHz, 6, 35 cm (2.5\"), Serial ATA III, SO-DIMM) Negro ", new BigDecimal("421.36"), "https://www.amazon.es/Gigabyte-Brix-Bareb%C3%B3n-Serial-SO-DIMM/dp/B00HFCTUPM/" }
        });
    }

    public static void main(String[] args) throws Exception {
        writeExcel();
        readExcel();

        writeCsv();
        readCsv();
    }

    ...

    private static void readCsv() throws Exception {
        CSVReader reader = new CSVReader(new FileReader("data.csv"));
        List<String[]> lines = reader.readAll();

        System.out.println();
        lines.forEach(d -> {
            String product = (String) d[0];
            BigDecimal price = new BigDecimal(d[1]);
            String link = (String) d[2];

            System.out.printf("%s, %s, %s%n", product, price.toString(), link);
        });

        reader.close();
    }
}

En ambos casos la salida en la consola al leer los datos de los documentos es la misma.

1
2
3
PlayStation 4 (PS4) - Consola 500GB, 340.95, https://www.amazon.es/PlayStation-4-PS4-Consola-500GB/dp/B013U9CW8A
Raspberry Pi 3 Modelo B (1,2 GHz Quad-core ARM Cortex-A53, 1GB RAM, USB 2.0), 41.95, https://www.amazon.es/Raspberry-Modelo-GHz-Quad-core-Cortex-A53/dp/B01CD5VC92/
Gigabyte Brix - Barebón (Intel, Core i5, 2,6 GHz, 6, 35 cm (2.5"), Serial ATA III, SO-DIMM) Negro , 421.36, https://www.amazon.es/Gigabyte-Brix-Bareb%C3%B3n-Serial-SO-DIMM/dp/B00HFCTUPM/

Las dependencias a incluir en el proyecto son las siguientes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'io.github.picodotdev.blogbitix.holamundoapachepoi.Main'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.poi:poi:4.0.0'
    compile 'com.opencsv:opencsv:4.3'

    ...
}

También se puede utilizar Apache POI para crear hojas excel y OpenCSV para crear archivos CSV con las columnas correctamente separadas por comas. Otra alternativa para leer o escribir archivos en formato CSV es Apache Commons CSV.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run.