Bonjour à tous,
Je dois réaliser un tableur dans le cadre d'un mini projet JEE donc voici l'intitulé exact :
http://static.ccm2.net/codes-sources.commentcamarche.net/pictures/oZcrIsKI13NC6eyDxSPQ3vlWCD8fIKTSrw1MTdYoKNC0phGbqIblYbpJeR5uUqcJ-capture.png
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 :
<%@page import="org.apache.poi.ss.usermodel.CellValue"%>
<%@page import="java.util.List"%>
<%@page import="interfaces.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<html>
<body>
<%
if (request.getAttribute("cells") != null) {
List<cell> cells = (List) request.getAttribute("cells");
%>
<h2>
<b>Tableau des valeurs : </b>
</h2>
<table>
<%
for (cell c : cells) {
%>
<tr>
<td><%=c.getComputedValue()%></td>
</tr>
<%
}
%>
<%
} else if (request.getAttribute("cellValue") != null) {
String cellValue = (String) request.getAttribute("cellValue");
%>
<p>
<b> Valeur de cellule : </b>
<%=cellValue%>
</p>
<%
} else {
%>
<h2> Insertion d'une valeur dans une cellule</h2>
<form action="TableurServlet" method="POST">
Adresse de cellule<br> <input type="text" name="address">
<br>
Valeur:<br> <input type="text" name="value"> <br>
<br> <input type="submit" value="Submit">
</form>
<%
}
%>
</table>
</body>
</html>
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.
Voilà mes soucis:
- Je ne sais absolument pas gérer le langage JSP. Pour l'instant, la page web affiche mon tableau sous cette forme :
http://static.ccm2.net/codes-sources.commentcamarche.net/pictures/R55ZIzup5aa3hXZ8MBIjsEF0WS8G7541Eq4GLjow5RrOFsPRY2jGg0lx5eElJIyS-jspversion.png
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 ?
En vous remerciant de votre aide précieuse.