如何在JAVA / JEE电子表格中处理Excel公式?

我在JEE课程中有一个小项目。 目标是在JEE中创build一个电子表格。 我在Java中的水平真的很差,但我尽我所能在这个项目上取得成功。

我在我的网页上显示一个公式的结果有一些麻烦。

我使用Excel文件来保存所有的单元格而不是使用数据库。 我的程序是这样工作的:

  • 我的servlet允许我为单元格插入一个值。 例如:cell:A1 => value:= 12 * 2

  • 然后将值存储在我的Excel文件的A1单元格中。 但是我必须先评估单元格(点击单元格并自己按回车键)才能得到公式的结果(在这种情况下为24)。

  • 然后我的网页在好的地方显示好的单元格的表格,但问题是它只显示没有结果的公式。 它不计算…例如:A1显示如12 * 2(不带“=”)

这里是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; private FormulaEvaluator evaluator; 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; } } 

这是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 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; } }); } } } 

我看不出问题在哪里。 我怎样才能直接在我的网页上显示我的公式的结果? 请,你能帮我吗? 对不起,法国评论btw。