无效的标头签名 - 使用Apache POI打开XLS

时间:2013-11-18 16:56:45

标签: java excel apache-poi

我正在尝试使用Apache POI 3.9将XLS文件转换为java中的CSV文件,但是我遇到了一些问题。当我尝试转换我需要的文件时,它会显示以下错误:

java.io.IOException: Invalid header signature; read 0x0010000000080209, 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 ExtractExcelToCSV.convertExcelToCsv(ExtractExcelToCSV.java:26)
    at ExtractExcelToCSV.main(ExtractExcelToCSV.java:60)

我认为我使用的代码完全正确(并且它也适用于其他文件)。我认为问题出在XLS文件上,因为当我尝试使用MS Excel打开它时,它还向我显示有关文件类型的警告(它表示它是MS Excel 3工作表)。有什么办法可以使用POI打开这些文件吗?

public static void convertExcelToCsv() throws IOException {
        try {
            cellGrid = new ArrayList<List<HSSFCell>>();
            FileInputStream myInput = new FileInputStream("D:\\...\\filename.xls");



            POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput);
            HSSFWorkbook myWorkBook = new HSSFWorkbook(myFileSystem);
            HSSFSheet mySheet = myWorkBook.getSheetAt(0);
            Iterator<?> rowIter = mySheet.rowIterator();

            while (rowIter.hasNext()) {
                HSSFRow myRow = (HSSFRow) rowIter.next();
                Iterator<?> cellIter = myRow.cellIterator();
                List<HSSFCell> cellRowList = new ArrayList<HSSFCell>();
                while (cellIter.hasNext()) {
                    HSSFCell myCell = (HSSFCell) cellIter.next();
                    cellRowList.add(myCell);
                }
                cellGrid.add(cellRowList);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

1 个答案:

答案 0 :(得分:2)

遇到了类似的问题。即使文件扩展名为.xls,它也不是Excel文件!感谢此处的评论&#34; Save-As&#34;在Excel中,它可能会告诉您格式是什么。在我的例子中,它是一个制表符分隔的文件,所以我解析它而不使用Apache POI。希望这会有所帮助。