使用 Apache POI 将工作表附加到 Excel 文件 - NullPointerException 引起的 POIXMLException

控制中心

这是我的代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.*;

public class testingsyncclass {
    public static void main(String[] args) throws IOException, InvalidFormatException{
        writeParametersTableToFile("C:/ENTERPRISE_TESTING", "XLSX_TEST", "SHEETNAME");
    }

    public static void writeParametersTableToFile(String fileLocation, String fileName, String tableLocator) throws InvalidFormatException{
        String[] columnHeaders = {"What", "is", "a", "computer", "?"};
        ArrayList<Object[]> xlsxFileData = new ArrayList<Object[]>();
        for(int i = 0; i < 10; i++){
            Object[] o = {"CoffeeCup", "AnglerJS", "Emerald", "C♭", "C--"};
            xlsxFileData.add(o);
        }
        try{
            if(fileName.contains(".xlsx")){
                fileName = fileName.replaceAll(".xlsx", "");
            }
            File file = new File(fileLocation);
            if(file.mkdirs() || file.exists()){
                File excelFile = new File(fileLocation  + "/" + fileName + ".xlsx");
                XSSFWorkbook workbook;
                XSSFSheet sheet;
                if(excelFile.exists()){
                    workbook = new XSSFWorkbook(excelFile);
                } else {
                    workbook = new XSSFWorkbook();
                }
                if(workbook.getSheet(tableLocator)==null){
                    sheet = workbook.createSheet(tableLocator);
                } else {
                    sheet = workbook.createSheet("NEW_TEST_SHEET");
                }
                XSSFRow firstRow = sheet.createRow(0);

                //write headers
                for(int i = 0; i < columnHeaders.length; i++){
                    XSSFCell cell = firstRow.createCell(i);
                    cell.setCellValue(columnHeaders[i]);
                }
                //write data
                for(int i = 0; i < xlsxFileData.size(); i++){
                    XSSFRow row = sheet.createRow(i+1);
                    for(int j = 0; j < xlsxFileData.get(i).length; j++){
                        XSSFCell cell = row.createCell(j);
                        String value = (String) xlsxFileData.get(i)[j];
                        cell.setCellValue(value);
                    }
                }
                FileOutputStream fileOut = new FileOutputStream(fileLocation  + "/" + fileName + ".xlsx");

                //write this workbook to an Outputstream.
                System.out.println(fileOut + " (fileout)");
                System.out.println(workbook + " (workbook)");
                workbook.write(fileOut);
                fileOut.flush();
                fileOut.close();
                workbook.close();

            } else {
                System.err.println(fileLocation + " was an invalid directory.");
            }
        } catch (IOException e){
            System.err.println("Something went wrong!");
            e.printStackTrace();
        }
    }
}

创建文件工作正常 - 文件按预期创建。但是,如果文件存在,我希望此方法创建一个工作表并将其添加到工作簿中。使用我目前拥有的代码,我得到以下异常:

Exception in thread "main" org.apache.poi.POIXMLException: java.lang.NullPointerException
at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:168)
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:246)
at testframework.testingsyncclass.writeParametersTableToFile(testingsyncclass.java:67)
at testframework.testingsyncclass.main(testingsyncclass.java:17)
Caused by: java.lang.NullPointerException

抛出此异常的行workbook.write(fileOut)仍然是 workbook 和 fileOut 都不为空。输出文件在第二次运行时也会损坏。

我究竟做错了什么?

控制中心

这个错误是因为我在创建工作簿时没有将 FileInputStream 作为参数传递。尽管 API 建议您可以将文件/路径作为参数传递,但该文件基本上以只读模式打开 - 因此再次写入时会引发异常。

这是通过传入 FileInputStream 来解决的。我的代码然后变成:

FileInputStream fis = new FileInputStream(excelFile);
workbook = new XSSFWorkbook(fis);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用apache-poi更新excel文件时出现POIXMLException

使用Apache POI将文件嵌入Excel中的XSSF工作表

使用Apache POI库从Excel(xlsx)文件读取会引发NullPointerException

使用Apache POI删除Excel工作表

使用Apache POI复制Excel工作表

使用Apache POI更新Excel文件

无法使用Apache POI从Excel文件读取

使用Apache POI获取大型Excel文件的Excel工作表名称

org.apache.poi.POIXMLException:读取 .xlsm 文件时出现 java.lang.reflect.InvocationTargetException

使用Apache POI Java将多个excel文件合并为一个excel文件

使用Apache POI向Excel写入会损坏Excel文件

如何在Java中使用Apache POI将数据验证添加到Excel工作表的整个列中?

如何使用apache poi根据行数将Excel文件拆分为多个文件?

使用POI附加到Excel文件而不读取数据

Apache POI将txt文件读取为Excel文件

为什么在使用Apache POI读取Excel文件之前需要创建工作簿?

使用Apache POI将自定义颜色添加到Excel工作表

使用Apache POI 4.1.1从Excel文件读取值时出错

无法使用Spring + Apache-POI上传Excel文件

使用Apache POI在Excel文件中获取列名称

使用Apache POI API从Excel文件中读取值

使用Apache POI从Excel文件中获取列?

使用Apache POI确定MS Excel文件类型

无法使用Java和Apache POI写入Excel文件

尝试使用POI Apache库读取Excel文件

如何使用 Apache POI 读取 MS excel 文件?

无法使用 openpyxl 将数据附加到 Excel 文件中的工作表

使用Apache POI将数组列表中的数据插入Excel文件中的块中

使用Apache POI将内容添加到非常大的Excel文件中(用尽其他方法...)