使用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错误,应该是输出流未正确关闭
上一篇: 浏览器通知,可配合socket
下一篇: Notification基础Demo