Création mini tableur excel en JEE

Messages postés
41
Date d'inscription
lundi 22 novembre 2010
Dernière intervention
3 juillet 2017
- - Dernière réponse : Debideb9445
Messages postés
41
Date d'inscription
lundi 22 novembre 2010
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.
Afficher la suite 

Votre réponse

1 réponse

Messages postés
41
Date d'inscription
lundi 22 novembre 2010
Dernière intervention
3 juillet 2017
Commenter la réponse de Debideb9445

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.