IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Création mini tableur excel en JEE


Sujet :

Servlets/JSP Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Création mini tableur excel en JEE
    Bonjour à tous,

    Je dois réaliser un tableur dans le cadre d'un mini projet JEE dont voici l'intitulé exact en PJ => Projet.pdf.

    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package interfaces;
     
    public interface cell {
     
    	// Définition du type Cell
    	enum CellType {
    		STRING, NUMBER, FORMULA
    	};
     
    	CellType getType();
     
    	String getRawValue();
     
    	String getComputedValue();
     
    }

    Config.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    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):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    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;
    				}
    			});
    		}
    	}
     
    }

    Et mon fameux fichier index.jsp dont je ne pige pas grand chose... J'ai tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    <%@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 :
    Nom : Capture.PNG
Affichages : 466
Taille : 18,9 Ko

    Or je voudrais un véritable tableur qui affiche les valeurs selon leur ligne et colonne comme mon fichier excel :
    Nom : Capture.PNG
Affichages : 450
Taille : 3,0 Ko

    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'envoie 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.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par Debideb Voir le message
    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 :
    [...]
    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 ?
    Le souci majeur est que la méthode getAllCells retourne une liste de cell : il n'y a plus de moyen de connaitre l'emplacement des cellules et surtout la caractérisque 2D d'un tableau de cellules.
    Donc naturellement tu écris ta JSP :
    Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            for (cell c : cells) {
                    %>
    		<tr>
    			<td><%=c.getComputedValue()%></td>
    		</tr>
    		<%
                            }
    Ce qui créé un tableau d'une cellule par ligne.
    Il faudrait plutôt quelque chose dans le genre :
    Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (row r : rows) { %>
       <tr>
      <% for(cell c : r) { %>
    			<td><%=c.getComputedValue()%></td>
       <%
       }%>
    </tr>
    <%}%>

    Mais ça ne fonctionnera pas non plus, parce que ta liste ne contient que les cellules qui ont une valeur, or le tableau affiché doit aussi afficher les cellules vides.

    Donc en résumé soit, au lieu d'une liste, tu utilises une structure adaptée pour représenter quelque chose en 2D, un tableau 2D, une liste de liste, un liste de row (une classe qui est un Iterable<cell> ou qui a une méthode getCells(). Soit tu ajoutes à ton interface cell 2 méthodes qui permettent d'avoir la position dans le tableau : tu auras juste besoin de parcourir la liste de cell pour connaitre le nombre max de cellules dans une ligne et le nombre de lignes, pour pouvoir construire le <table>.




    Citation Envoyé par Debideb Voir le message

    - 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'envoie 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" ....
    Là, je pense que c'est dû à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    gridManager.setCell(address, new cell() {
     
    				public CellType getType() {
    					return CellType.STRING;
    				}
     
    				public String getRawValue() {
    					return value;
    				}
     
    				public String getComputedValue() {
    					return value;
    				}
    			});
    Tu ne gères que le type CellType.STRING, donc pas de risque d'avoir autre chose.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    D'accord merci beaucoup pour la piste , je vois l'idée. Je vais tenter d'ajouter les 2 méthodes, ça me parait plus simple .


    Pour le problème du STRING, tu penses que je peux m'inspirer de ce que j'ai fait dans le GridManager ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 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;
    					}

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Debideb Voir le message
    Pour le problème du STRING, tu penses que je peux m'inspirer de ce que j'ai fait dans le GridManager ?
    Oui, pourquoi pas, mais ça va vouloir dire qu'il faut saisir le type de cellule dans le formulaire. Tu peux aussi t'inspirer de ce que fait Excel : en fonction de la valeur saisie, tu estimes le type.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    final CellType cellType;
    Double doubleValue;
    try {
        doubleValue = Double.parse(value);
    }
    catch(NumberFormatException e) {
        doubleValue=null;
    }
    if ( doubleValue!=null && !value.startsWith("'")) {
        cellType=CellType.NUMBER;
    }
    else if ( value.startsWith("=") ) {
        cellType=CellType.FORMULA;
    }
    else {
        cellType=CellType.STRING;
    }
     
    gridManager.setCell(address, new cell() {
     
    				public CellType getType() {
    					return cellType;
    				}
     
    				public String getRawValue() {
    					return value;
    				}
     
    				public String getComputedValue() {
    					return value;
    				}
    			});
    Attention, toutefois, getComputedValue() va retourner la formule, tant que tu ne l'auras pas fait évaluer par Excel.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai pas mal cogité sur cette histoire de tableur et j'ai ENFIN réussi à afficher un tableau sur ma page web.

    Nom : Capture.JPG
Affichages : 436
Taille : 29,5 Ko

    Alors oui en effet c'est hyper laid mais vu mon niveau je suis bien content d'avoir quelque chose de fonctionnel...

    Seulement voilà , j'ai toujours mon souci de calcul de formule. J'ai repris ton code joel.drigo car c'est ce qui fonctionne le mieux pour l'instant.
    Quelque chose m'échappe tout de même sur la façon dont ma page web gère les formules...

    En effet, si je rentre dans la cellule A1 la formule "=24*2" et que je la fais évaluer dans Excel, la page web affiche "24*2". C'est assez bizarre car la servlet comprend que c'est une formule (le type devient bien FORMULA) mais au lieu de la calculer, elle enlève juste le signe "=".

    J'ai cherché partout sur la documentation d'Apache, j'ai bien l'impression qu'il existe des fonctions (FormulaEvaluator notamment => https://poi.apache.org/spreadsheet/eval.html) mais je n'arrive pas à les appliquer dans mon code....


    Voici mon GridManager actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    package managers;
     
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
     
    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.CellValue;
    import org.apache.poi.ss.usermodel.CreationHelper;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.ss.usermodel.FormulaEvaluator;
    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 interfaces.cell.CellType;
     
    import java.util.ArrayList;
    import java.util.HashMap;
     
    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);
    			}
     
    		} else {
    			System.err.println("Impossible d'accéder au fichier");
    		}
     
    		return valCell;
    	}
     
    	/**
    	 * Implémentation de la fonction d'attribution d'une valeur à* 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);
     
    		// Si type est formule on calcule et on stocke le resultat
    		if (cell.getType() == CellType.FORMULA){
     
     
    			CreationHelper createHelper = wb.getCreationHelper();
    		    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
     
    			row.createCell(c).setCellValue(createHelper.createRichTextString(cell.getRawValue()));
     
     
    		}else{
    			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.getComputedValue();
    	}
     
    	/**
    	 * Implémentation de la fonction qui retourne la liste de toutes les
    	 * cellules ayant une valeur
    	 */
    	public HashMap<Integer,List<cell>> getAllCells() {
     
    		HashMap<Integer, List<cell>> tableCells  = new HashMap<Integer, List<cell>>();
     
    		List<cell> cells;
     
    		// 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();
     
    		// Ligne Debut / Fin
    		int rowStart = Math.min(15, sheet1.getFirstRowNum());
    		int rowEnd = Math.max(1400, sheet1.getLastRowNum());
     
    		for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
     
    			cells =  new ArrayList<cell>();
     
    			Row r = sheet1.getRow(rowNum);
     
    			if (r == null) {
    				// Si ligne vide
    				continue;
    			}
     
    			int lastColumn = Math.max(r.getLastCellNum(), 0);
     
    			for (int cn = 0; cn < lastColumn; cn++) {
     
    				final Cell cellule = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
     
    				if (cellule == null) {
    					cell c = new cell() {
    						public cell.CellType getType() {
     
    							return cell.CellType.STRING;
    						}
     
    						public String getRawValue() {
    							return formatter.formatCellValue(cellule);
    						}
     
    						public String getComputedValue() {
    								return " ";							
    						}
    					};
     
    					cells.add(c);
    				} else {
    					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
     
    								return formatter.formatCellValue(cellule);
     
    						}
    					};
     
    					cells.add(c);
    				}
     
    				tableCells.put(rowNum,cells);			
    			}
    		}
     
    		return tableCells;
    	}
     
    	/**
    	 * 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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    package web;
     
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
     
    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 org.apache.poi.ss.usermodel.FormulaEvaluator;
     
    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
    			Map<Integer,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");
     
    			final CellType cellType;
    			Integer intValue;
    			try {
    				intValue = Integer.parseInt(value);
    			}
    			catch(NumberFormatException e) {
    				intValue=null;
    			}
    			if ( intValue!=null && !value.startsWith("'")) {
    			    cellType=CellType.NUMBER;
    			}
    			else if ( value.startsWith("=") ) {
    			    cellType=CellType.FORMULA;
     
     
    			}
    			else {
    			    cellType=CellType.STRING;
    			}
     
     
     
    			// Remplissage de cellule
    			gridManager.setCell(address, new cell() {
     
    				public CellType getType() {
     
     
     
    					return cellType;
    				}
     
    				public String getRawValue() {
    					return value;
    				}
     
    				public String getComputedValue() {
    					return value;
    				}
    			});
    		}
    	}
     
    }

    Mon index.jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    <%@page import="org.apache.poi.ss.usermodel.CellValue"%>
    <%@page import="java.util.*"%>
    <%@page import="java.util.Map"%>
    <%@page import="interfaces.*"%>
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    	pageEncoding="ISO-8859-1"%>
    <html>
    <body>
    	<%
                    if (request.getAttribute("cells") != null) {
            %>
    	<table border = "1" >
    		<%
                            Map<Integer, ArrayList<cell>> map = (Map<Integer, ArrayList<cell>>)request.getAttribute("cells") ;
                    
                            for (Map.Entry<Integer, ArrayList<cell>> entry : map.entrySet()) {
                                    %>
     
    		<tr>
    					<%
                                    ArrayList<cell> value = entry.getValue();
                                    Integer key = entry.getKey();
                                    
                                for(cell aString : value){  
                                    
                                    %>
     
    			    	<td><%=aString.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>

    Si quelqu'un sait ou a une piste pour résoudre le problème, je suis preneur.

    En vous remerciant de votre aide

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour créer ta formule, tu utilises bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cell.setCellType(CellType.FORMULA);
    cell.setCellFormula(formula);
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell.setCellValue(formula);
    En revanche, de mémoire (mais pas sûr), il me semble qu'il faut enlever le "=" devant :

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonsoir joel.drigo,

    Merci beaucoup pour ta réponse rapide mais je n'ai pas bien compris ce que je dois faire concrètement du coup.
    En fait, je crois que ne comprends pas la différence entre setCellValue et setCellFormula.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Debideb Voir le message
    setCellValue et setCellFormula.
    Bah, setCellValue() c'est pour affecter une valeur à la cellule, et setCellFormula, une formule à la cellule. Deux chôses différentes.

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/03/2007, 16h36
  2. [istools] Création bouton personnel excel.
    Par chessman2212 dans le forum Installation, Déploiement et Sécurité
    Réponses: 2
    Dernier message: 18/01/2007, 18h06
  3. [JXL] Problème avec création de feuille excel
    Par mittim dans le forum Documents
    Réponses: 2
    Dernier message: 10/08/2006, 16h40
  4. recherche de valeurs dans un tableur excel
    Par maxiut dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/05/2006, 08h25
  5. Faire un tableur excel par C
    Par lamar dans le forum C
    Réponses: 3
    Dernier message: 15/11/2005, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo