如何使用 Java 读写 Excel 电子表格?

How Do I Read and Write to an Excel Spreadsheet With Java?

问题总结

我创建了一个简单的程序来读取和写入电子表格。但它不起作用。有谁知道我做错了什么?

我试过的

我已成功读取电子表格。我已经成功地能够写入电子表格。但是,我不能同时做。

createRow 函数似乎覆盖了整行。因此,擦除以前的数据。这是一个相当严格的约束。这可能是阻止我同时阅读和写作的原因。

我注意到输出显示“提供的文件为空(零字节长)”。但是我确保路径是正确的并且电子表格中确实有数据。不确定该错误的来源。

我尝试遵循 Stack Overflow 上其他帖子的建议,但是 none 他们的建议(包括关闭 fileInputStream 和 fileOutputStream)似乎完全影响了我的程序。

我的代码

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.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);
        FileOutputStream fileOutputStream = new FileOutputStream(path);
        XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
        XSSFSheet sheet = workbook.createSheet("Sheet1");
        
        Set<String> vir = new HashSet<String>();
        vir.add(sheet.getRow(0).getCell(0).getStringCellValue());
        vir.add(sheet.getRow(1).getCell(0).getStringCellValue());
        vir.add(sheet.getRow(2).getCell(0).getStringCellValue());
        vir.add(sheet.getRow(3).getCell(0).getStringCellValue());
        
        sheet.getRow(0).createCell(1).setCellValue("zeta");
        sheet.getRow(1).createCell(1).setCellValue("eta");
        sheet.getRow(2).createCell(1).setCellValue("theta");
        sheet.getRow(3).createCell(1).setCellValue("iota");
        
        System.out.println("Vir = " + vir);
        
        workbook.write(fileOutputStream);
        workbook.close();
        fileOutputStream.close();
    }
}

我的电子表格

My spreadsheet.

输出

Exception in thread "main" org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)
    at org.apache.poi.util.IOUtils.peekFirstNBytes(IOUtils.java:112)
    at org.apache.poi.poifs.filesystem.FileMagic.valueOf(FileMagic.java:209)
    at org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:143)
    at org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:175)
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:104)
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:312)
    at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:47)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:299)
    at certExamPractice.SpreadsheetPractice.main(SpreadsheetPractice.java:18)

以下代码允许您读取和写入电子表格。您需要编写开始代码和结束代码。然后中间就可以随意读写了。

package certExamPractice;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashSet;
import java.util.Set;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class SpreadsheetPractice {
    public static void main(String[] args) throws IOException{
        
        //BEGINNING
        String path = "C:/Users/james/Desktop/Spreadsheets/Spreadsheet4.xlsx";
        FileInputStream fileInputStream = new FileInputStream(path);
        Workbook workbook = WorkbookFactory.create(fileInputStream);
        Sheet sheet = workbook.getSheet("Sheet1");
        Row row = sheet.getRow(0);
        Cell cell = row.getCell(0);
        if (cell == null) { cell = row.createCell(0); }
        
        //READ
        Set<String> vir = new HashSet<String>();
        vir.add(sheet.getRow(0).getCell(0).getStringCellValue());
        vir.add(sheet.getRow(1).getCell(0).getStringCellValue());
        vir.add(sheet.getRow(2).getCell(0).getStringCellValue());
        vir.add(sheet.getRow(3).getCell(0).getStringCellValue());
        System.out.println("Vir = " + vir);
        
        //WRITE
        sheet.getRow(0).createCell(1).setCellValue("zeta");
        sheet.getRow(1).createCell(1).setCellValue("theta");
        sheet.getRow(2).createCell(1).setCellValue("eta");
        sheet.getRow(3).createCell(1).setCellValue("iota");
        
        //END
        try (OutputStream fileOutputStream = new FileOutputStream(path)) {
            workbook.write(fileOutputStream);
        }
        workbook.close();
    }
}