如何用Java实现Excel电子表格读写?报EmptyFileException错误如何解决?
问题原因
- 核心报错诱因:你在未完成文件读取的前提下,提前初始化了同路径的
FileOutputStream,Java中该类默认构造方法会直接清空目标文件内容,导致后续POI读取文件时拿到的是空文件,触发空文件异常。 - 次要逻辑错误:你使用
workbook.createSheet("Sheet1")获取已存在的工作表,该方法会新建工作表而非读取原有内容,会导致你后续读取行数据时拿到空值。 - 潜在问题:直接调用
getRow、createCell没有做非空判断,如果对应行/单元格不存在会触发空指针,且createCell会直接覆盖该位置原有内容,你提到的createRow覆盖整行数据也是同理,只要先判断行是否存在,存在时调用getRow而非createRow就可以避免覆盖。
修正后代码
package certExamPractice; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashSet; import java.util.Set; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class SpreadsheetPractice { public static void main(String[] args) throws IOException { String path = "C:/Users/james/Desktop/Spreadsheets/Spreadsheet4.xlsx"; // 先仅打开输入流,完成文件读取操作 FileInputStream fileInputStream = new FileInputStream(path); XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream); // 读取完成后立即关闭输入流 fileInputStream.close(); // 用getSheet获取已存在的工作表,仅当工作表不存在时才新建 XSSFSheet sheet = workbook.getSheet("Sheet1"); if (sheet == null) { sheet = workbook.createSheet("Sheet1"); } Set<String> vir = new HashSet<String>(); // 增加行、单元格非空判断,避免空指针和数据覆盖 for (int i = 0; i < 4; i++) { XSSFRow row = sheet.getRow(i); if (row == null) { row = sheet.createRow(i); } XSSFCell cell = row.getCell(0); String cellValue = cell != null ? cell.getStringCellValue() : ""; vir.add(cellValue); } // 写入第二列数据,新增非空判断避免覆盖原有内容 String[] values = {"zeta", "eta", "theta", "iota"}; for (int i = 0; i < 4; i++) { XSSFRow row = sheet.getRow(i); if (row == null) { row = sheet.createRow(i); } XSSFCell cell = row.getCell(1); if (cell == null) { cell = row.createCell(1); } cell.setCellValue(values[i]); } System.out.println("Vir = " + vir); // 所有内容修改完成后,再打开输出流写入数据 FileOutputStream fileOutputStream = new FileOutputStream(path); workbook.write(fileOutputStream); workbook.close(); fileOutputStream.close(); } }
内容的提问来源于stack exchange,提问作者James Walton
相关产品推荐
相关产品推荐

