Création mini tableur excel en JEE

Debideb9445 Messages postés 41 Date d'inscription lundi 22 novembre 2010 Statut Membre Dernière intervention 3 juillet 2017 - 1 juil. 2017 à 14:19
Debideb9445 Messages postés 41 Date d'inscription lundi 22 novembre 2010 Statut Membre Dernière intervention 3 juillet 2017 - 1 juil. 2017 à 14:22
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.

1 réponse

Debideb9445 Messages postés 41 Date d'inscription lundi 22 novembre 2010 Statut Membre Dernière intervention 3 juillet 2017
1 juil. 2017 à 14:22
0
Rejoignez-nous