Pour être honnête, je suis vraiment médiocre en développement JEE mais voici ce que j'ai déjà réalisé :
cell.java :
package interfaces;
public interface cell {
// Définition du type Cell
enum CellType {
STRING, NUMBER, FORMULA
};
CellType getType();
String getRawValue();
String getComputedValue();
}
Config.java :
package interfaces;
public interface Config {
/**
* Lien du chemin vers le tableur excel
*/
public static final String cheminTableur = "C:\\Users\\isen\\Desktop\\Projet.xlsx";
}
Grid.java :
package interfaces;
import java.util.List;
import interfaces.cell;
public interface Grid {
/**
* @param address
* @return la valeur d'une cellule
*/
String getCell(String address);
/**
* Attribuer une valeur à une cellule
* @param address
* @param cell
* @return
*/
String setCell(String address, cell cell);
/**
*
* @return la liste de toutes les cellules ayant une valeur
*/
List<cell> getAllCells();
}
GridManager.java :
package managers;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataFormatter;
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.usermodel.WorkbookFactory;
import interfaces.Config;
import interfaces.Grid;
import interfaces.cell;
import java.util.ArrayList;
public class GridManager implements Grid {
private Workbook wb;
public GridManager() {
super();
}
/**
* Implémentation de la fonction de récupération d'une valeur de cellule
*/
public String getCell(String address) {
String valCell = null;
// Ouvrir le fichier excel
if(openExcelFile()){
// Récupération de la feuille
Sheet sheet1 = wb.getSheetAt(0);
// Récupération de la cellule
CellReference cellReference = new CellReference(address);
Row row = sheet1.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol());
if (cell != null){
// Récupération de la valeur
DataFormatter formatter = new DataFormatter();
valCell = formatter.formatCellValue(cell);
// Si la valeur de la cellule est le résultat d'une formule
if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
valCell = cell.getNumericCellValue() + "";
}
}
}else {
System.err.println("Impossible d'accéder au fichier");
}
return valCell;
}
/**
* Implémentation de la fonction d'attribution d'une valuer à* une cellule
*/
public String setCell(String address, cell cell) {
// Ouvrir le fichier excel
openExcelFile();
// Récupération de la feuille de style
Sheet sheet = wb.getSheetAt(0);
// Création de cellule
CellReference cr = new CellReference(address);
int r = cr.getRow();
int c = cr.getCol();
// Remplissage de cellule
Row row = sheet.getRow(r);
if (row == null)
row = sheet.createRow(r);
CreationHelper createHelper = wb.getCreationHelper();
row.createCell(c).setCellValue(createHelper.createRichTextString(cell.getRawValue()));
// Ecriture dans la feuille
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream(Config.cheminTableur);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return cell.getRawValue();
}
/**
* Implémentation de la fonction qui retourne la liste de toutes les cellules ayant une valeur
*/
public List<cell> getAllCells() {
List<cell> cells = new ArrayList<cell>();
// Ouvrir le fichier excel
openExcelFile();
// Récupération de la feuille
Sheet sheet1 = wb.getSheetAt(0);
// Récupération des valeurs
final DataFormatter formatter = new DataFormatter();
for (Row row : sheet1) {
for (final Cell cellule : row) {
cell c = new cell() {
public cell.CellType getType() {
// Récupération du type de la cellule
cell.CellType type = null ;
switch (cellule.getCellType()) {
case Cell.CELL_TYPE_STRING:
type = cell.CellType.STRING;
break;
case Cell.CELL_TYPE_NUMERIC:
type = cell.CellType.NUMBER;
break;
case Cell.CELL_TYPE_FORMULA:
type = cell.CellType.FORMULA;
break;
}
return type;
}
public String getRawValue() {
return formatter.formatCellValue(cellule);
}
public String getComputedValue() {
// Si la valeur de la cellule est le résultat d'une formule on retourne le résultat sinon on retourne la valeur de cellule
if (cellule.getCellType() == Cell.CELL_TYPE_FORMULA) {
return cellule.getNumericCellValue() + "";
}else{
return formatter.formatCellValue(cellule);
}
}
};
cells.add(c);
}
}
return cells;
}
/**
* Fonction d'ouverture du tableur Excel
*/
public boolean openExcelFile() {
try {
wb = WorkbookFactory.create(new FileInputStream(Config.cheminTableur));
return true;
} catch (InvalidFormatException e) {
System.err.println("Format du fichier est invalide");
} catch (FileNotFoundException e) {
System.err.println("Le chemin vers fichier est incorrecte");
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
Ma servlet (TableurServlet.java):
package web;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import interfaces.cell;
import interfaces.cell.CellType;
import managers.GridManager;
/**
* Servlet d'implementation
*/
@WebServlet("/tableurServlet")
public class TableurServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private GridManager gridManager = new GridManager();
public TableurServlet() {
super();
}
/**
* Récupération de toutes les valeurs ou une seule valeur ou Set d'une valeur depuis url
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Set d'une valeur de cellule
if(request.getParameter("address") != null && request.getParameter("value") != null){
// Renvoie vers la méthode doPut pour attribuer la valeur à la cellule
doPut(request, response);
}
// Récupération d'une valeur d'une cellule
else if(request.getParameter("address") != null){
// Stockage de la valeur
String cellValue = gridManager.getCell(request.getParameter("address"));
// Passer le paramétre à la vue index.jsp
request.setAttribute("cellValue", cellValue);
// Redirection vers la vue index.jsp
request.getRequestDispatcher("index.jsp").forward(request, response);
}
// Récupération des valeurs des cellules remplies
else {
// Stockage des valeurs récuperés dans une liste
List<cell> cells = gridManager.getAllCells();
// Passer le paramétre à la vue index.jsp
request.setAttribute("cells", cells);
// Redirection vers la vue index.jsp
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
/**
* Set d'une valeur d'une cellule depuis formulaire
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Renvoie vers la methode doPut() pour attribuer la valeur à la cellule
doPut(request, response);
}
/**
* Set D'une valeur d'une cellule
*/
@Override
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getParameter("address") != null && request.getParameter("value") != null){
// Récupération des valeurs passés
String address = request.getParameter("address");
final String value = request.getParameter("value");
// Remplissage de cellule
gridManager.setCell(address, new cell() {
public CellType getType() {
return CellType.STRING;
}
public String getRawValue() {
return value;
}
public String getComputedValue() {
return value;
}
});
}
}
}
[/CODE]
Et mon fameux fichier index.jsp dont je ne pige pas grand chose... J'ai tenté ceci :
Pour l'instant j'ai pas de souci à enregistrer mes valeurs dans mon fichier excel de destination. Je vous épagne les tests unitaires que j'ai écrit sans trop de problème.
Or je voudrais un véritable tableur qui affiche les valeurs selon leur ligne et colonne comme mon fichier excel :
Comment faire ceci en JSP ?
- Second problème:
Pour l'instant, mon code n'arrive pas à faire la distinction entre les types STRING, NUMBER ou FORMULA. Tout est renvoyé en tant que STRING. Si bien que si j'envoi la valeur =13*2 dans ma cellule A1 par exemple, et bien le calcul ne s'effectue pas et il me renvoie exactement "=13*2" ....
Pouvez vous m'éclairer sur ces deux points s'il vous plait ?