2017-07-09 86 views
1

的Apache POI:問題與Excel更新, 新的值寫入單元格後: java.lang.IllegalStateException:不能從字符串細胞的Apache POI:更新Excel文件

什麼可以得到一個數值是問題嗎?如何解決它?

我使用5個文件工作,其中3個工作正常,另外2個不工作。 針對2個錯誤文件的解決方法: Runtime.getRuntime()。exec(「cmd/c start」+ excel.getAbsolutePath());

// --------------------------------------------------------------------------- 

// Here: new values are written into the cells 

workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); 
workbook.setForceFormulaRecalculation(true); 

OutputStream output = new FileOutputStream(excel.getAbsolutePath()); 
workbook.write(output); 
output.flush(); 
output.close(); 

// Here, new values are subtracted from the cells, 
after Excel resolves with new values 


// --------------------------------------------------------------------------- 

// Value in bad Cell: =B24 

java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell 
    at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:1050) 
    at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:310) 
    at quicc.excel.api.ExcelHandlerXSSF.handleCell(ExcelHandlerXSSF.java:275) 
    at quicc.excel.api.ExcelHandlerXSSF.readCell(ExcelHandlerXSSF.java:251) 
+2

錯誤是相當清楚的。您在ExcelHandlerXSSF.java的第275行中的代碼使用了'XSSFCell.getNumericCellValue',但單元格不包含數字,而是包含一個字符串。所以看看你的'ExcelHandlerXSSF.java'。 –

回答

0
package poi.service; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.util.CellReference; 
import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

public class POITestEva { 

    private String excelFilePath = "C:/Test/1.xlsm"; 
    private FileInputStream inputStream; 
    private XSSFWorkbook workbook; 

    public static void main(String[] args) { 
     POITestEva pOITestEva = new POITestEva(); 
     pOITestEva.updateCell(3.0); 
     System.out.println("D5 = " + pOITestEva.readCellTest("D5"));  // Line 23 
    } 


    public void updateCell(Double newData) { 
     try { 
      File excel = new File(excelFilePath); 
      inputStream = new FileInputStream(excel); 
      workbook = new XSSFWorkbook(inputStream); 
      workbook.setForceFormulaRecalculation(true); 

      Cell cell = getCell(1, "C8"); 
      if (cell != null) { 
       cell.setCellValue(newData); 
      } 

      workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); 
      OutputStream output = new FileOutputStream(excel); 
      workbook.write(output); 
      output.flush(); 
      output.close(); 
      workbook.close(); 
      inputStream.close(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    private Cell getCell(int sheetNr, String cellId) { 
     CellReference ref = new CellReference(cellId); 
     return getCell(sheetNr, ref.getCol(), ref.getRow()); 
    } 

    private Cell getCell(int sheetNr, int col, int row) { 
     XSSFSheet sheet = workbook.getSheetAt(sheetNr); 
     if (sheet.getRow(row) != null 
       && sheet.getRow(row).getCell(col) != null 
       && !(sheet.getRow(row).getCell(col).getCellType() == Cell.CELL_TYPE_BLANK)) { 
      return sheet.getRow(row).getCell(col); 
     } 
     return null; 
    } 


    public Double readCellTest(String cellId) { 
     try { 
      File excel = new File(excelFilePath); 
      inputStream = new FileInputStream(excel); 
      workbook = new XSSFWorkbook(inputStream); 
      Double result = ((Double) (readCell(cellId)));   // Line 74 
      if (workbook != null) { 
       workbook.close(); 
      } 
      if (inputStream != null) { 
       workbook.close(); 
      } 
      return result; 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    private Object readCell(String cellId) { 
     Cell cell = getCell(1, cellId); 
     return handleCell(cell.getCellType(), cell);     // Line 91 
    } 


    @SuppressWarnings("deprecation") 
    private Object handleCell(int type, Cell cell) { 
     switch (type) { 
      case XSSFCell.CELL_TYPE_STRING: 
       return cell.getStringCellValue(); 
      case XSSFCell.CELL_TYPE_NUMERIC: 
       return cell.getNumericCellValue(); 
      case XSSFCell.CELL_TYPE_BOOLEAN: 
       return cell.getBooleanCellValue(); 
      case XSSFCell.CELL_TYPE_BLANK: 
       return null; 
      case XSSFCell.CELL_TYPE_ERROR: 
       return null; 
      case XSSFCell.CELL_TYPE_FORMULA: 
       return cell.getNumericCellValue();     // Line 109 
      default: 
       return null; 
     } 
    } 

} 
0
"C:\Program Files\Java\jdk1.8.0_51\bin\java" -Didea.launcher.port=... ...java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell 
D5 = null 
    at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:1050) 
    at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:310) 
    at service.POITestEva.handleCell(POITestEva.java:109) 
    at service.POITestEva.readCell(POITestEva.java:91) 
    at service.POITestEva.readCellTest(POITestEva.java:74) 
    at service.POITestEva.main(POITestEva.java:23) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Process finished with exit code 0 
0
<apache.poi.version>3.16</apache.poi.version> 

------------------------------------------------------------------------ 

D5  =SUM(C18:C20) 

C18  =IFERROR(SUM(C31:32) 
C19  =SUM(C33:34) 
C20  =SUM(C35:36) 

C31-C36 → next Formel etc. 

-----------------------------------------------------------------------------