×

poi 导入

两秒看懂导入Excel文件公式类型的单元格怎么取值

我的笔记 我的笔记 发表于2018-10-16 19:05:04 浏览3433 评论0

抢沙发发表评论

问题:

    在工作中,我遇到个问题,需要导入数据,但是这个表格中有大量的公式计算,如图:

    image.png

    读取到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(在下边),获取列值,可能是原值,可能是公式值

image.png

image.png

添加一个获取单元格值得方法。可以获取原值,也可以获取公式值,根据类型判断

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();
    }


我的笔记博客版权我的笔记博客版权