欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用POI同时对Excel文件进行读和写操作时避免Invalid header signatu

程序员文章站 2022-07-13 14:33:43
...

这学期学到了数据库概论,课程设计需要做一个DBMS,图方便想把数据什么的存到xls文件中,在使用poi对excel文件同时进行读和写操作时,如果这样写:

public void test(){
        try {
            File file = new File("user.xls");
            FileInputStream in = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(file);
            HSSFWorkbook workbook = new HSSFWorkbook(in);
            HSSFSheet sheet = workbook.getSheetAt(0);
            System.out.println(sheet.getLastRowNum());
            workbook.write(fos);
            fos.close();
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

就会出现org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signatu报错

然后在网上看到一个别人写的demo,改了一下:

public void test(){
        try {
            File file = new File("user.xls");
            FileInputStream in = new FileInputStream(file);
            //使用POIFSFileSystem构造HSSFWorkbook
            POIFSFileSystem fs = new POIFSFileSystem(in);
            FileOutputStream fos = new FileOutputStream(file);
            HSSFWorkbook workbook = new HSSFWorkbook(fs);
            HSSFSheet sheet = workbook.getSheetAt(0);
            System.out.println(sheet.getLastRowNum());
            workbook.write(fos);
            fos.close();
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
就可以了。

看了会源码,水平有限没大看懂。大体是一个在已有的基础上对Excel文件进行解析,另一个则是创建一个Excel文件进行操作。


17.12.11更新

还有一种办法...

public void test(){
        try {
            boolean isSuccess = true;
            
            File file = new File("user.xls");
            FileInputStream in = new FileInputStream(file);
            //使用POIFSFileSystem构造HSSFWorkbook
            POIFSFileSystem fs = new POIFSFileSystem(in);
            HSSFWorkbook workbook = new HSSFWorkbook(fs);
            HSSFSheet sheet = workbook.getSheetAt(0);
            System.out.println(sheet.getLastRowNum());
            
            ...
            //如果中间有错误
            isSuccess = false;
            
            if(isSuccess){
                FileOutputStream fos = new FileOutputStream(file);
                workbook.write(fos);
            }
            fos.close();
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

意思就是,..确保没有错误之后再创建fos流写入数据,如果有错误就不进行写入操作

或者在错误的地方直接return; 跳出这个函数也行, 反正就是不进入写入操作


17.12.12

找到了前几天写的代码,其中有段是如果发生错误直接return出这个函数,当时已经打开了输出流,而未关闭,所以下次再打开的时候就出现Invalid header signatu错误,应该是输出流未正确关闭