1. 程式人生 > >Java POI對Excel操作,專案開發中遇到的問題,及解決方案

Java POI對Excel操作,專案開發中遇到的問題,及解決方案

java POI官網地址,裡面有介紹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中遇到的棘手問題,可以下方留言,以及解決方案,感謝