问题:
在工作中,我遇到个问题,需要导入数据,但是这个表格中有大量的公式计算,如图:
读取到Java中还是公式原样。开始寻找资料。
解决办法:
如果你没有导入工具类。去看一下 企业级框架工作中使用的Sheet复制、导入工具类POIUtil
我在这个工具类的excelToList方法做修改,具体修改改了下面代码:
/*** * 把Excel文件返回List集合 * @param f * @param filePath * @return */ public static List excelToList(File f, String filePath){ List list=null;//返回对象 if(null==f && (null==filePath || "".equals(filePath))){ return null; } File file = f; if(null!=filePath && !"".equals(filePath)){//已指定文件路径 file = new File(filePath); } String filename = file.getName(); if (filename == null || "".equals(filename)){ } try { InputStream input = new FileInputStream(file); Workbook workBook = null; //以下做法是为了区分不同版本,然后使用XSSF或HSSF String flag="";//XSSF或HSSF的标记 try { workBook = new XSSFWorkbook(input); flag="XSSF"; } catch (Exception ex) { workBook = new HSSFWorkbook(new FileInputStream(file)); flag="HSSF"; } //根据标记使用不同的方法来解析excel if("XSSF".equals(flag)){ XSSFSheet sheet = (XSSFSheet) workBook.getSheetAt(0); if (sheet != null) { //list list = new ArrayList(); for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { //object XSSFRow row = sheet.getRow(i); List obj = new ArrayList(); for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { //column XSSFCell cell = row.getCell(j); String cellStr = cell.toString(); obj.add(cellStr); } System.out.println(); list.add(obj); } } }else if ("HSSF".equals(flag)){ HSSFSheet sheet = (HSSFSheet) workBook.getSheetAt(0); HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, (HSSFWorkbook)workBook); if (sheet != null) { //list list = new ArrayList(); for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { //object HSSFRow row = sheet.getRow(i); List obj = new ArrayList(); for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { //column HSSFCell cell = row.getCell(j); String cellStr = cell.toString(); //obj.add(cellStr); obj.add(getCellValueFormula(cell,evaluator)); } System.out.println(); list.add(obj); } } }else{ } } catch (Exception e) { e.printStackTrace(); } return list; }}
我获取一个HSSFFormulaEvaluator对象然后又写一个方法getCellValueFormula(在下边),获取列值,可能是原值,可能是公式值
添加一个获取单元格值得方法。可以获取原值,也可以获取公式值,根据类型判断
public static String getCellValueFormula(Cell cell, FormulaEvaluator formulaEvaluator) { if (cell == null || formulaEvaluator == null) { return null; } if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { return String.valueOf(formulaEvaluator.evaluate(cell).getNumberValue()); } return cell.toString(); }