Apache POI: Créer, lire et modifier un fichier Excel en java

Généralement, les feuilles de calcul sont beaucoup utilisées dans les domaines de finance et de comptabilité pour faciliter le calcul et la création des factures, gestion des rapports,etc. Si une partie de votre application requis de tels opérations: création, lecture ou écriture, plusieurs api sont disponible et la plus performante est l'api POI d'APACHE.

L'api POI gère aussi les documents Word et PowerPoint, avec le temps les utilisateurs ont eu plus de confiance.

Téléchargement

Vous pouvez télécharger l'api à partir de la page APACHE POI. Après le téléchargement, importez les .jar suivants dans votre projet:
  • poi
  • poi-ooxml
  • poi-ooxml-schemas
  • xmlbeans

Création et écriture dans un document xls

Les deux classes principales qui traite les fichier excel sont:

HSSFWorkbook: pour les fichier Microsoft Excel 97 et 2003 de l'extension xls.
XSSFWorkbook: pour les fichier Microsoft Excel 2007 de l'extension xlsx.

Le code suivant crée un tableau avec des valeurs de différents types:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.xssf.usermodel.XSSFWorkbook;

public class Excel {
public static void main(String[] args) {

//1. Créer un Document vide
XSSFWorkbook wb = new XSSFWorkbook();
//2. Créer une Feuille de calcul vide
Sheet feuille = wb.createSheet("new sheet");
//3. Créer une ligne et mettre qlq chose dedans
Row row = feuille.createRow((short)0);
//4. Créer une Nouvelle cellule
Cell cell = row.createCell(0);
//5. Donner la valeur
cell.setCellValue(1.2);

//Ajouter d'autre cellule avec différents type
/*int*/row.createCell(1).setCellValue(3);
/*char*/row.createCell(2).setCellValue('c');
/*String*/row.createCell(3).setCellValue("chaine");
/*boolean*/row.createCell(4).setCellValue(false);

FileOutputStream fileOut;
try {
fileOut = new FileOutputStream("nouveauFichier.xlsx");
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
écriture dans excel avec Apache poi


On veut insérer la date et l'heure courante, le format Date est créé de la façon suivante:

//insertion dans la cellule F1
cell = row.createCell((short) 6);
cell.setCellValue(new Date());
XSSFCellStyle cellStyle = wb.createCellStyle();
XSSFDataFormat xssfDataFormat = wb.createDataFormat();
//créer un Format date et heure
cellStyle.setDataFormat(xssfDataFormat.getFormat("dd/mm/yyyy h:mm"));
cell.setCellStyle(cellStyle);
excel apache poi insérer la date

Formatage du texte

Le formatage du texte inclut: la police, la taille, Italique/Gras/Souligné, la couleur, l'arrière plan et l'alignement.

Exemple d'alignement que l'on va appliquer à la cellule Date:

//hauteur de la ligne
row.setHeightInPoints(20);
//alignement horizontal
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
//alignement vertical
cellStyle.setVerticalAlignment(CellStyle.VERTICAL_TOP);
apache poi alignement ligne et colonne excel

Modifier la police d'écriture

/*créer un nouveau font*/
Font font = wb.createFont();
//taille: 12px
font.setFontHeightInPoints((short)12);
font.setFontName("Courier New");
font.setItalic(true);
font.setBold(true);

/*création d'un nouveau style*/
CellStyle cs = wb.createCellStyle();
cs.setFont(font);
//appliquer le style à la cellule 3(D1)
row.getCell(3).setCellStyle(cs);
apache poi modifier la police excel

La couleur et l'arrière plan

/*changer la couleur de l'arrière plan*/
XSSFCellStyle csCouleur = wb.createCellStyle();
csCouleur.setFillForegroundColor(new XSSFColor(new Color(194, 154, 250)));
csCouleur.setFillPattern(csCouleur.SOLID_FOREGROUND);
//appliquer le style à la cellule 3
row.getCell(2).setCellStyle(csCouleur);

/*changer la couleur de la police*/
Font font = wb.createFont();
font.setColor((short)45);
CellStyle csCF = wb.createCellStyle();
csCF.setFont(font);
//appliquer le style à la cellule 0
row.getCell(0).setCellStyle(csCF);
apache poi changer couleur font et background excel

Fusion des cellules

Dans cet exemple, on va fusionner et centrer horizontalement et verticalement quatre cellules: B2, C2, B3, C3 avec la méthode addMergedRegion qui prend en paramètre la plage des cellules à fusionner.

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.ss.util.CellRangeAddress;

public class Fusion{

public static void main(String[] args) throws FileNotFoundException {
Workbook wb = new HSSFWorkbook();
Sheet feuille = wb.createSheet("feuille1");

Row row = feuille.createRow((short) 1);
Cell cell = row.createCell((short) 1);
cell.setCellValue("test du fusion des cellules");

feuille.addMergedRegion(new CellRangeAddress(
1, //première ligne B2
2, //dernière ligne B3
1, //première colonne C2
2 //dernière colonne C3
));
/*Centrer*/
cell.getCellStyle().setAlignment((short)2);
cell.getCellStyle().setVerticalAlignment((short)1);

FileOutputStream fs = null;
try {
fs = new FileOutputStream("testFusion.xlsx");
wb.write(fs);
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
excel Apache Poi fusion cellules

Utilisation des formules

Excel est essentiellement utilisé dans le calcul et l'utilisation des formules parfois complexe dans les cellules résultat. Apache poi fournit des moyens très efficace pour ajouter et tester les cellules avec leurs formules.

Le code suivant traite un calcul simple de la moyenne des 4 semestres. La formule sera (A2+B2+C2+D2)/4.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Excel_formule {

public static void main(String[] args) {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet feuille = wb.createSheet("Moyenne");

Row row = feuille.createRow((short) 0);
row.createCell(0).setCellValue("Trimestre1");
row.createCell(1).setCellValue("Trimestre2");
row.createCell(2).setCellValue("Trimestre3");
row.createCell(3).setCellValue("Trimestre4");
row.createCell(4).setCellValue("Moyenne");

Row row1 = feuille.createRow((short) 1);
row1.createCell(0).setCellValue(2);
row1.createCell(1).setCellValue(5);
row1.createCell(2).setCellValue(1);
row1.createCell(3).setCellValue(7);
row1.createCell(4).setCellFormula("(A2+B2+C2+D2)/4");

try {
FileOutputStream out = new FileOutputStream(new File("formuletest.xlsx"));
wb.write(out);
out.close();
System.out.println("Le fichier excel a été créé avec succés");

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Excel apache poi calcul avec formule

Evaluer et parcourir les cellules

Pour afficher la valeur d'une cellule, il faut connaitre son type. Apache poi fournit la classe FormulaEvaluator.evaluateFormulaCell qui vérifie si la case contient une formule. Si oui, il l'évalue et retourne le type de la formule.

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Excel_parcourir {

public static void main(String[] args) throws IOException {
FileInputStream fichier = new FileInputStream(new File("formuletest.xlsx"));
//créer une instance workbook qui fait référence au fichier xlsx
XSSFWorkbook wb = new XSSFWorkbook(fichier);
XSSFSheet sheet = wb.getSheetAt(0);

FormulaEvaluator formulaEvaluator =
wb.getCreationHelper().createFormulaEvaluator();

for (Row ligne : sheet) {//parcourir les lignes
for (Cell cell : ligne) {//parcourir les colonnes
//évaluer le type de la cellule
switch (formulaEvaluator.evaluateInCell(cell).getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
}
}
System.out.println();

}
}
Sortie

Trimestre1 Trimestre2 Trimestre3 Trimestre4 Moyenne 
2.0 5.0 1.0 7.0 3.75