CELL_TYPE_ERROR有什么用?

Nar*_*ala 2 java excel apache-poi

我想了解在apache poi中使用单元格类型CELL_TYPE_ERROR.我尝试了以下代码,我看到没有错误.

Workbook wb = new XSSFWorkbook();
Row row = sheet1.createRow(0);
Cell cell = row.createCell(0);

cell.setCellType(Cell.CELL_TYPE_ERROR);
cell.setCellValue(234);
System.out.println("error cell value-"+ cell.getNumericCellValue()); //this prints 234.0
Run Code Online (Sandbox Code Playgroud)

此外,error如果我们不手动设置其类型,我想了解单元格是否可以是类型.

Axe*_*ter 7

请参阅代码中的注释.

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

class CellTypeErrorTest {

 public static void main(String[] args) {
  Workbook wb = new XSSFWorkbook();
  Sheet sheet = wb.createSheet("Sheet1");
  Row row = sheet.createRow(0);
  Cell cell = row.createCell(0);

  //The following works, but it makes no sense, because the cell will have no real content.
  //If you wants to see, how this will be shown into the Workbook, then comment out the
  //following code that overwrites the Cell with numeric content.
  cell.setCellType(Cell.CELL_TYPE_ERROR);
  cell.setCellErrorValue(FormulaError.DIV0.getCode());
  System.out.println("error cell value-"+ FormulaError.forInt(cell.getErrorCellValue()).getString());

  //If you put real content in the cell, then the CELL_TYPE_ERROR goes away, if the content 
  //not produces ERROR.
  cell.setCellValue(234);
  System.out.println(cell.getCellType()); //0 == CELL_TYPE_NUMERIC

  //If you put a Formula in the Cell, it will not be evaluated automatically.
  //So there is no error, even the formula will produce error if it will be evaluated.
  cell = row.createCell(1);
  cell.setCellFormula("1/0");
  System.out.println(cell.getCellType()); //2 == CELL_TYPE_FORMULA

  //It you need to check if a formula produces error, then you have to evaluate it.
  FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  CellValue cellValue = evaluator.evaluate(cell);
  System.out.println(cellValue.getCellType()); //5 == CELL_TYPE_ERROR
  if (cellValue.getCellType() == Cell.CELL_TYPE_ERROR) {
   System.out.println("error cell value-"+ FormulaError.forInt(cellValue.getErrorValue()).getString());
  }

  try {
   FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
   wb.write(fileOut);
   fileOut.close();
  } catch (FileNotFoundException fnfex) {
  } catch (IOException ioex) {
  }

 }
}
Run Code Online (Sandbox Code Playgroud)

结论:

Cell.CELL_TYPE_ERROR是检测单元格内容是否产生错误所必需的.手动设置它几乎没有意义.

可以使用cell.setCellErrorValue手动将其设置为没有实际内容的单元格.但这大多没有意义,因为如果单元格获得真实内容并且这不会产生错误,那么CellType会自动更改为其他类型.

POI不会自动评估单元格公式.具有公式的单元格的CellTypes永远是Cell.CELL_TYPE_FORMULA.因此,要检查单元格公式是否产生错误,我们必须手动评估,然后检查评估的CellValue的CellType.请参阅:http://poi.apache.org/spreadsheet/eval.html

问候

阿克塞尔