Tutoriel Apache POI

Bienvenue dans le Tutoriel Apache POI. Parfois, nous avons besoin de lire des données à partir de fichiers Microsoft Excel ou de générer des rapports au format Excel, principalement à des fins commerciales ou financières. Java ne fournit pas de support intégré pour travailler avec des fichiers Excel, nous devons donc rechercher des APIs open source pour le faire. Lorsque j’ai commencé ma recherche d’API Java pour Excel, la plupart des gens recommandaient JExcel ou Apache POI. Après des recherches approfondies, j’ai découvert que Apache POI est le choix optimal pour plusieurs raisons principales. Il existe d’autres raisons liées à des fonctionnalités avancées, mais n’approfondissons pas trop cela.

  • Soutien de la fondation Apache.
  • JExcel ne prend pas en charge le format xlsx, tandis que POI prend en charge les formats xls et xlsx.
  • Apache POI propose un traitement basé sur les flux, adapté aux fichiers volumineux et nécessitant moins de mémoire.

Apache POI

Apache POI offre un excellent support pour travailler avec des documents Microsoft Excel. Apache POI peut gérer les formats de feuilles de calcul XLS et XLSX. Quelques points importants sur l’API Apache POI sont:

  1. Apache POI contient une implémentation HSSF pour le format de fichier Excel ’97 (-2007) c’est-à-dire XLS.
  2. L’implémentation XSSF d’Apache POI doit être utilisée pour le format de fichier Excel 2007 OOXML (.xlsx).
  3. Les API Apache POI HSSF et XSSF offrent des mécanismes pour lire, écrire ou modifier des feuilles de calcul Excel.
  4. Apache POI fournit également l’API SXSSF qui est une extension de XSSF pour travailler avec des feuilles excel très volumineuses. L’API SXSSF nécessite moins de mémoire et convient lorsqu’on travaille avec des feuilles de calcul très grandes et que la mémoire heap est limitée.
  5. Il existe deux modèles au choix : le modèle événementiel et le modèle utilisateur. Le modèle événementiel nécessite moins de mémoire car le fichier excel est lu en tokens et nécessite de les traiter. Le modèle utilisateur est plus orienté objet et facile à utiliser et nous utiliserons ce dernier dans nos exemples.
  6. Apache POI offre un excellent support pour des fonctionnalités excel supplémentaires telles que travailler avec des Formules, créer des styles de cellules en remplissant des couleurs et des bordures, des polices, des en-têtes et des pieds de page, des validations de données, des images, des hyperliens, etc.

Dépendances Maven Apache POI

Si vous utilisez maven, ajoutez les dépendances Apache POI ci-dessous.

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.10-FINAL</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.10-FINAL</version>
</dependency>

La version actuelle d’Apache POI est 3.10-FINAL. Si vous avez une application java autonome, incluez les jars de l’image ci-dessous.

Exemple Apache POI – Lire un fichier Excel

Supposons que nous ayons un fichier Excel « Sample.xlsx » avec deux feuilles et des données comme indiqué dans l’image ci-dessous. Nous voulons lire le fichier Excel et créer la liste des pays. La feuille 1 contient des données supplémentaires que nous ignorerons lors de l’analyse. Notre code bean java pour les pays est le suivant : Country.java

package com.journaldev.excel.read;

public class Country {

	private String name;
	private String shortCode;
	
	public Country(String n, String c){
		this.name=n;
		this.shortCode=c;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getShortCode() {
		return shortCode;
	}
	public void setShortCode(String shortCode) {
		this.shortCode = shortCode;
	}
	
	@Override
	public String toString(){
		return name + "::" + shortCode;
	}
	
}

Un exemple de programme Apache POI pour lire un fichier Excel et créer la liste des pays ressemble à ce qui suit. ReadExcelFileToList.java

package com.journaldev.excel.read;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcelFileToList {

	public static List readExcelData(String fileName) {
		List countriesList = new ArrayList();
		
		try {
			// Créer le flux d'entrée depuis le fichier xlsx/xls
			FileInputStream fis = new FileInputStream(fileName);
			
			// Créer une instance de classe Workbook pour le flux d'entrée du fichier xlsx/xls
			Workbook workbook = null;
			if(fileName.toLowerCase().endsWith("xlsx")){
				workbook = new XSSFWorkbook(fis);
			}else if(fileName.toLowerCase().endsWith("xls")){
				workbook = new HSSFWorkbook(fis);
			}
			
			// Obtenir le nombre de feuilles dans le fichier xlsx
			int numberOfSheets = workbook.getNumberOfSheets();
			
			// Parcourir chacune des feuilles
			for(int i=0; i < numberOfSheets; i++){
				
				// Obtenir la nième feuille du classeur
				Sheet sheet = workbook.getSheetAt(i);
				
				// Chaque feuille a des lignes, les parcourir
				Iterator rowIterator = sheet.iterator();
				while (rowIterator.hasNext()) 
		        {
					String name = "";
					String shortCode = "";
					
					// Obtenir l'objet ligne
					Row row = rowIterator.next();
					
					// Chaque ligne a des colonnes, obtenir l'itérateur de colonnes et les parcourir
					Iterator cellIterator = row.cellIterator();
		             
		            while (cellIterator.hasNext()) 
		            {
		            	// Obtenir l'objet Cellule
		            	Cell cell = cellIterator.next();
		            	
		            	// Vérifier le type de cellule et traiter en conséquence
		            	switch(cell.getCellType()){
		            	case Cell.CELL_TYPE_STRING:
		            		if(shortCode.equalsIgnoreCase("")){
		            			shortCode = cell.getStringCellValue().trim();
		            		}else if(name.equalsIgnoreCase("")){
		            			// 2ème colonne
		            			name = cell.getStringCellValue().trim();
		            		}else{
		            			// Données aléatoires, les ignorer
		            			System.out.println("Random data::"+cell.getStringCellValue());
		            		}
		            		break;
		            	case Cell.CELL_TYPE_NUMERIC:
		            		System.out.println("Random data::"+cell.getNumericCellValue());
		            	}
		            } //end of cell iterator
		            Country c = new Country(name, shortCode);
		            countriesList.add(c);
		        } //end of rows iterator
				
				
			} //end of sheets for loop
			
			// Fermer le flux d'entrée du fichier
			fis.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return countriesList;
	}

	public static void main(String args[]){
		List list = readExcelData("Sample.xlsx");
		System.out.println("Country List\n"+list);
	}

}

Le programme est très facile à comprendre et contient les étapes suivantes :

  1. Créez une instance de Workbook basée sur le type de fichier. Utilisez XSSFWorkbook pour le format xlsx et HSSFWorkbook pour le format xls. Remarquez que nous aurions pu créer une classe d’enveloppe avec le modèle de fabrique pour obtenir l’instance du classeur en fonction du nom de fichier.
  2. Utilisez la méthode getNumberOfSheets() du classeur pour obtenir le nombre de feuilles, puis utilisez une boucle for pour analyser chacune des feuilles. Obtenez l’instance de Sheet en utilisant la méthode getSheetAt(int i).
  3. Obtenez un itérateur de lignes (Row) et ensuite un itérateur de cellules (Cell) pour obtenir l’objet Cellule. Apache POI utilise le modèle d’itérateur ici.
  4. Utilisez switch-case pour lire le type de cellule et le traiter en conséquence.

Maintenant, lorsque nous exécutons le programme exemple Apache POI ci-dessus, il produit la sortie suivante sur la console.

Random data::1.0
Random data::2.0
Random data::3.0
Random data::4.0
Country List
[India::IND, Afghanistan::AFG, United States of America::USA, Anguilla::AIA, 
Denmark ::DNK, Dominican Republic ::DOM, Algeria ::DZA, Ecuador ::ECU]

Exemple Apache POI – Écrire un fichier Excel

L’écriture d’un fichier Excel dans Apache POI est similaire à la lecture, sauf qu’ici nous commençons d’abord par créer le classeur. Ensuite, nous définissons les valeurs des feuilles, des lignes et des cellules, puis utilisons FileOutputStream pour l’écrire dans un fichier. Prenons un exemple simple d’Apache POI où nous utiliserons une liste de pays à partir de la méthode ci-dessus pour l’enregistrer dans un autre fichier sur une seule feuille. WriteListToExcelFile.java

package com.journaldev.excel.read;

import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteListToExcelFile {

	public static void writeCountryListToFile(String fileName, List countryList) throws Exception{
		Workbook workbook = null;
		
		if(fileName.endsWith("xlsx")){
			workbook = new XSSFWorkbook();
		}else if(fileName.endsWith("xls")){
			workbook = new HSSFWorkbook();
		}else{
			throw new Exception("invalid file name, should be xls or xlsx");
		}
		
		Sheet sheet = workbook.createSheet("Countries");
		
		Iterator iterator = countryList.iterator();
		
		int rowIndex = 0;
		while(iterator.hasNext()){
			Country country = iterator.next();
			Row row = sheet.createRow(rowIndex++);
			Cell cell0 = row.createCell(0);
			cell0.setCellValue(country.getName());
			Cell cell1 = row.createCell(1);
			cell1.setCellValue(country.getShortCode());
		}
		
		// écrivons maintenant les données Excel dans un fichier
		FileOutputStream fos = new FileOutputStream(fileName);
		workbook.write(fos);
		fos.close();
		System.out.println(fileName + " written successfully");
	}
	
	public static void main(String args[]) throws Exception{
		List list = ReadExcelFileToList.readExcelData("Sample.xlsx");
		WriteListToExcelFile.writeCountryListToFile("Countries.xls", list);
	}
}

Lorsque j’exécute le programme exemple Apache POI ci-dessus, le fichier Excel généré ressemble à l’image ci-dessous.

Exemple Apache POI – Lire la formule Excel

Parfois, nous avons besoin de manipuler des fichiers Excel complexes avec des formules, voyons un exemple simple d’Apache POI pour lire la formule d’une cellule avec sa valeur. ReadExcelFormula.java

package com.journaldev.excel.read;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcelFormula {

	public static void readExcelFormula(String fileName) throws IOException{
		
		FileInputStream fis = new FileInputStream(fileName);
		
		// en supposant un fichier xlsx
		Workbook workbook = new XSSFWorkbook(fis);
		Sheet sheet = workbook.getSheetAt(0);
		Iterator rowIterator = sheet.iterator();
		while (rowIterator.hasNext()) 
        {
			Row row = rowIterator.next();
			Iterator cellIterator = row.cellIterator();
            
            while (cellIterator.hasNext()) 
            {
            	Cell cell = cellIterator.next();
            	switch(cell.getCellType()){
            	case Cell.CELL_TYPE_NUMERIC:
            		System.out.println(cell.getNumericCellValue());
            		break;
            	case Cell.CELL_TYPE_FORMULA:
            		System.out.println("Cell Formula="+cell.getCellFormula());
            		System.out.println("Cell Formula Result Type="+cell.getCachedFormulaResultType());
            		if(cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC){
            			System.out.println("Formula Value="+cell.getNumericCellValue());
            		}
            	}
            }
        }
	}
	
	public static void main(String args[]) throws IOException {
		readExcelFormula("FormulaMultiply.xlsx");
	}
}

Lorsque nous exécutons le programme exemple Apache POI ci-dessus, nous obtenons la sortie suivante.

1.0
2.0
3.0
4.0
Cell Formula=A1*A2*A3*A4
Cell Formula Result Type=0
Formula Value=24.0

Exemple Apache POI – Écrire une formule Excel

Parfois, nous avons besoin de faire des calculs et ensuite d’écrire les valeurs des cellules. Nous pouvons utiliser les formules Excel pour effectuer ce calcul et cela le rendra plus précis car les valeurs changeront si les valeurs des cellules utilisées dans les calculs sont modifiées. Voyons un exemple simple pour écrire un fichier Excel avec des formules en utilisant l’API Apache POI. WriteExcelWithFormula.java

package com.journaldev.excel.read;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteExcelWithFormula {

	public static void writeExcelWithFormula(String fileName) throws IOException{
		Workbook workbook = new XSSFWorkbook();
		Sheet sheet = workbook.createSheet("Numbers");
		Row row = sheet.createRow(0);
		row.createCell(0).setCellValue(10);
		row.createCell(1).setCellValue(20);
		row.createCell(2).setCellValue(30);
		// définir la cellule de la formule
		row.createCell(3).setCellFormula("A1*B1*C1");
		
		// écrivons dans le fichier
		FileOutputStream fos = new FileOutputStream(fileName);
		workbook.write(fos);
		fos.close();
		System.out.println(fileName + " written successfully");
	}
	
	public static void main(String[] args) throws IOException {
		writeExcelWithFormula("Formulas.xlsx");
	}
}

Le fichier Excel produit avec le programme exemple ci-dessus de l’API Apache POI ressemble à l’image ci-dessous. C’est tout pour le tutoriel Apache POI sur le travail avec les fichiers Excel, explorez les méthodes des classes Apache POI pour en apprendre davantage sur ses fonctionnalités. Références: Guide du développeur Apache POI

Source:
https://www.digitalocean.com/community/tutorials/apache-poi-tutorial