You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:06:04