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

来源:互联网 发布:windows的历史 编辑:程序博客网 时间:2024/06/05 21:14

这学期学到了数据库概论,课程设计需要做一个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错误,应该是输出流未正确关闭

阅读全文
0 0