java - ApachePOI 无法识别 Excel .csv 文件。无效的 header 签名错误

标签 java excel

我正在尝试使用 Java 解析以 .csv 结尾的 excel 文件。在做了一些研究之后,我下载并安装了 ApachePOI 库。但是,每次尝试打开要解析的 excel 文件时,都会出现以下错误:

    Exception in thread "main" java.io.IOException: Invalid header signature; read 0x4E2C53454C494D53, expected 0xE11AB1A1E011CFD0
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:322)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:303)
at excellibrarycreation.ExcelFileProcesser.processFile(ExcelFileProcesser.java:40)
at excellibrarycreation.ExcelLibraryCreation.main(ExcelLibraryCreation.java:24)
    Java Result: 1 

我在 Stack Overflow 和其他网站上对这个问题进行了更多研究,但答案让我非常困惑,因为我从未听说过 OLE2 文件和 header 签名以及类似的东西。如果有人可以简单地解释这个问题,我将非常感激。这是我的代码:

    public void processFile(File excelWorkbook) throws FileNotFoundException, IOException{
         System.out.println("Processing file...");
         FileInputStream fileInputStream = new FileInputStream(excelWorkbook);
         HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
         HSSFSheet firstSheet = workbook.getSheetAt(0);
         Iterator<Row> rowIterator = firstSheet.iterator();
          while (rowIterator.hasNext()){
               Row row = rowIterator.next();

               Iterator<org.apache.poi.ss.usermodel.Cell> cellIterator = row.cellIterator();

             while(cellIterator.hasNext()){
               org.apache.poi.ss.usermodel.Cell cell = cellIterator.next();
               switch(cell.getCellType()){
                  case Cell.CELL_TYPE_BOOLEAN:
                      System.out.println("Cell type is boolean: "+cell.getBooleanCellValue());
                      break;
                  case Cell.CELL_TYPE_NUMERIC:
                      System.out.println("Cell type is numeric: "+cell.getNumericCellValue());
                      break;
                  case Cell.CELL_TYPE_STRING:
                      System.out.println("Cell type is String: "+cell.getStringCellValue());
                      break;
            }
            System.out.println("");
        }
        fileInputStream.close();
    }
}

最佳答案

为什么要使用 Apache POI 读取逗号分隔值文件?

您可以使用 opencsv .

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
    // nextLine[] is an array of values from the line
    System.out.println(nextLine[0] + nextLine[1] + "etc...");
}

关于java - ApachePOI 无法识别 Excel .csv 文件。无效的 header 签名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17602820/

相关文章:

java - Struts2 标签 : Fielderrors tag

excel - 正在获取编译器错误(无效的标识符)

c# - Excel 工作簿 - 从 C# 读取速度非常慢?

excel - 使用Powershell循环遍历Excel文件并检查电子表格名称是否存在

java - Android Studio Java 类有一个下拉菜单

Java存储过程: OUT params

java - 如何在字符串中找到元音字母,并在屏幕上打印出元音字母最多的单词?

javascript - 添加新行后,React.js 从 Mongo DB 更新表

excel - 如何将参数传递给 Laravel Excel 的导出文件以进行 DB 查询

VBA 类及其自身集合