【问题标题】:How Do I Read and Write to an Excel Spreadsheet With Java?如何使用 Java 读写 Excel 电子表格?
【发布时间】:2021-12-31 03:28:05
【问题描述】:

问题总结

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

我尝试过的

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

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

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

我已尝试遵循 Stack Overflow 上其他帖子的建议,但他们的任何建议(包括关闭 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)

【问题讨论】:

    标签: excel java-io


    【解决方案1】:

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

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2011-10-17
      • 2011-03-19
      • 2013-05-03
      • 2021-04-05
      相关资源
      最近更新 更多