Gestion formule excel en JAVA / JEE

Fermé
Debideb9445 Messages postés 41 Date d'inscription lundi 22 novembre 2010 Statut Membre Dernière intervention 3 juillet 2017 - Modifié le 3 juil. 2017 à 20:41
Bonjour,

Dans le cadre d'un mini projet pour un cours de JEE dans lequel je suis en grosse galère (et oui les rattrapages de juillet... :( ), je dois réaliser un petit tableur excel.

J'ai plutot bien avancé dans ma tâche. Pour l'instant j'arrive à insérer des valeurs dans un fichier excel ( fichier qui me sert de stockage à défaut d'avoir une BDD) et à les retranscrire sur ma page web.

Seulement voilà, je n'arrive pas à gérer les formules... Si j'entre "=12*2" dans ma cellule A1, mon fichier excel comprend que c'est une formule et dès que je fais "entrer" dans la cellule, le résultat "24" s'affiche. Par contre, sur ma page web le résultat s'affiche toujours "12*2". Notez que ma page web a ien compris que c'était une formule car le type de ma cellule est bien devenu "FORMULA" et chose étonnante, le signe '=' a disparu.

Voici le code de ma classe GridManager :
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;
 }

}




Celui de ma servlet :
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;
    }
   });
  }
 }

}



Et celui de mon index.jsp (au cas où) :
<%@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>



Pouvez vous m'aider à trouver où est l'erreur s'il vous plait ? Je voudrais afficher le résultat de ma formule dans ma page web et ne plus la voir en version brute.

En vous remerciant de votre précieuse aide