一、使用try自動關閉流報錯
1.附上自己自動關閉流的代碼 try (InputStream is = new FileInputStream("D:\\lx-studyResources\\example.xlsx");OutputStream out = new FileOutputStream("D:\\lx-studyResources\\example.xlsx")){ XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is); //取出第一個工作表 sheet = xssfWorkbook.getSheetAt(0); //設置字體 XSSFFont font = xssfWorkbook.createFont(); font.setColor(Font.COLOR_RED); //設置樣式 XSSFCellStyle style = xssfWorkbook.createCellStyle(); style.setFont(font); String value = sheet.getRow(0).getCell(0).getRawValue(); sheet.getRow(0).getCell(0).setCellStyle(style); sheet.getRow(0).getCell(0).setCellValue("lx_pb"); xssfWorkbook.write(out); }catch (Exception e){ e.printStackTrace(); }
2.報錯的截圖
我的Excel中明明不是空,爲啥還會報這個錯呢?
我寫代碼的意圖是想讀取Excel的內容,然後篩選數據進行修改。如果我按照老版本的jdk的關閉流的寫法就不會發生錯誤,而按照自動關閉的方式就會報錯,那麼排查的點就先放在自動關閉流這塊。
二、問題排查
1.我如果只是輸入流自動關閉,不會報錯;只自動關閉輸出流,文件也會變爲空。根據輸出流生成文件的規則來說,根據具體路徑生成輸出流的同時,新的Excel文件就會生成。打斷點調試截圖如下:
證明推斷正確,最新的sheet頁沒write之前就生成了新的Excel,所以當輸入流指定的具體文件和輸出流指定的具體文件時同一個的時候,輸出流會再生成一次此文件,所以Excel爲空,讀取sheet頁時就會報錯。
結論:解決辦法就是:要麼輸出流到一個新的Excel文件,這樣就不會出現文件衝突的問題(不是同一個Excel文件);要麼就在最新的sheet頁生成了,要輸出到文件中時,再創建輸出流,手動關閉輸出流(始終操作的是同一個Excel)。