Java POI对Excel操作,项目开发中遇到的问题,及解决方案

java POI官网地址,里面有介绍POI的使用,以及各种例子代码:

Java POI官网

说下在项目开发中遇到的java操作Excel的棘手问题,以及解决方案:

首先记下2007版及以上Excel版本(.xlsx)的文件读取、输出代码:

读取:

public static Workbook getTemplateExcel(String path) {

        // 后缀为.xlsx的Excel文件
        Workbook workbook = null;

        File file = new File(path);

        try {
            InputStream is = new FileInputStream(file);

            workbook = new XSSFWorkbook(is);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return workbook;
    }

输出:

 public static boolean outputExcel(Workbook workbook, String outputPath) {
        boolean result = false;

        File file = new File(outputPath);

        try {
            OutputStream os = new FileOutputStream(file);

            workbook.write(os);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

问题1:给给定单元格设定值时,NullPointException异常

时常,在给Excel指定单元格写入数据的时候,会这样写:

        Sheet sheet = workbook.getSheet("test1");
        sheet.getRow(0).getCell(0).setCellValue(1);

但是,可能会忽略一点,get到的Cell是否为null值,所以会空指针异常

所以代码需要这样写:

  Sheet sheet = workbook.getSheet("test1");
  if (sheet.getRow(0) == null) {
      sheet.createRow(0);
      if (sheet.getRow(0).getCell(0) == null) {
          sheet.createRow(0).createCell(0);
      }
  }
  sheet.getRow(0).getCell(0).setCellValue(1);

问题2:当模版Excel里面有公式计算的时候,需要给指定单元格设值,输出的Excel公式没起作用

模版sheet中,有公式:


Excel输出后:


代码如下:

Workbook workbook = ExcelUtil.getTemplateExcel(DefinedValue.INPUT_PATH + "test.xlsx");

        Sheet sheet = workbook.getSheet("test1");
        
        Row row0 = sheet.createRow(0);
        Row row1 = sheet.createRow(1);
        row0.createCell(0);
        row0.createCell(1);
        row0.createCell(2); 
        row1.createCell(0);
        row1.createCell(1);
        row1.createCell(2);
        sheet.getRow(0).getCell(0).setCellValue(1);
        sheet.getRow(0).getCell(1).setCellValue(2);
        sheet.getRow(0).getCell(2).setCellValue(3);
        sheet.getRow(1).getCell(0).setCellValue(1.1);
        sheet.getRow(1).getCell(1).setCellValue(2.2);
        sheet.getRow(1).getCell(2).setCellValue(3.3);

        ExcelUtil.outputExcel(workbook, DefinedValue.OUTPUT_PATH + "t1.xlsx");

所以,需要在输出之前加入这样一句话,即可:

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

问题3:POI设定单元格下拉框,如果设置长度超过255,输出的Excel,在打开时会出错(文件有不可读取的地方)

代码设置单元格下拉框代码(官网代码):


这样输出的文件,如果被设定单元格字符长度(下拉菜单所有item的长度)总共超过255,这样设置会出错,但官网又给了另外一套处理方案,那就是将要被设定的List值先设置到Excel的隐藏sheet里面,然后读取到单元格中,代码如下:


如果,还有朋友碰到过POI中遇到的棘手问题,可以下方留言,以及解决方案,感谢

猜你喜欢

转载自blog.csdn.net/qq_19260033/article/details/80038081