通过 apache POI 创建文件时出现错误“您的 InputStream 既不是 OLE2 流,也不是 OOXML 流”

问题描述 投票:0回答:2

我正在尝试检查我的 Excel 文件是否已经存在。如果它不存在,我想创建一个新的,如果它存在,我将删除它并创建一个新的。我编写了以下程序,但在行 - workbook= WorkbookFactory.create(instream); 处收到错误

错误是-> java.lang.IllegalArgumentException:您的InputStream既不是OLE2流,也不是OOXML流 在 org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:89) 在 tryIng.main(tryIng.java:84)

这是一个程序->

 try {
                String filePath= "C:/Users/pritik/Desktop/t1.xlsx";
                File file = new File(filePath);
                filePath= file.getAbsolutePath(); 
                xlFile = new File(filePath);

                if(xlFile.exists() && !xlFile.isDirectory())
                    xlFile.delete(); //delete if file already exists.
                xlFile.createNewFile();

                inStream = new FileInputStream(xlFile);
                workbook =  WorkbookFactory.create(inStream);  // I get error at this line
                String sheetName="NewSheet";
                Sheet sheet = workbook.createSheet(sheetName);
                FileOutputStream fOut = new FileOutputStream(xlFile);

                int i,j;
                xRows = xTS.length;
                xCols = xTS[0].length;
                for(i =0;i<xRows;i++)
                {
                    row = sheet.createRow(i);
                    for(j=0;j<xCols;j++)
                    {
                        cell = row.createCell(j);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        cell.setCellValue(xTS[i][j]);
                    } 
                } 
                workbook.write(fOut);
                fOut.flush();
                fOut.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
java excel apache-poi xssf poi-hssf
2个回答
14
投票

不要创建一个空文件并尝试读取它,那是行不通的。空的零字节文件无效,无法加载。相反,请让 POI 为您创建一个新文件,稍后您将编写该文件。

更改代码:

if(xlFile.exists() && !xlFile.isDirectory())
    xlFile.delete(); //delete if file already exists.
xlFile.createNewFile();

inStream = new FileInputStream(xlFile);          
workbook =  WorkbookFactory.create(inStream);

改为:

if(xlFile.exists() && !xlFile.isDirectory())
    xlFile.delete(); //delete if file already exists.

if (xlFile.toString().endsWith(".xls") {
   workbook = new HSSFWorkbook();
} else {
   workbook = new XSSFWorkbook();
}

此外,如果您确实想读取现有文件,如果您有文件,请不要使用流!请参阅 POI 文档的这段内容 了解为什么不这样做。


0
投票

您不需要根据接受的答案中描述的文件扩展名来选择实现类。

如果您使用 XLSX(Excel 2007+ 格式),则应在项目中包含

poi-ooxml
依赖项。如果您使用 XLS(Excel 97-2003 格式),则应包含
poi
依赖项。

对于 XLSX (Excel 2007+):

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version>
</dependency>

最后要使用 xlsx 和 xls,您需要两个依赖项

第一

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.4</version>
</dependency>

第二个

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.