poi向已经打开的excel文件写数据导致文件被清空
来源:互联网 发布:dps文件打开软件 编辑:程序博客网 时间:2024/06/07 03:54
概述
最近在做项目的时候遇到了使用Java调用POI读写Excel的问题,再向一个已经打开的文件写入修改好的数据的时候,源文件被复写为空文件。这个问题涉及到POI读写文件的原理,故在此记录一下,以备日后回顾。
问题程序
//读数据表
Workbook wb = WorkbookFactory.create(new File(sourcePath));
Sheet table = wb.getSheetAt(0);
//写数据表
FileOutputStream fOut = null;
try {
File file = new File(targetFile);
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
fOut = new FileOutputStream(file);
wb.write(fOut);
fOut.flush();
fOut.close();
wb.close();
} catch (FileNotFoundException e) {
e.printStackTrace(System.out);
} catch (IOException e) {
e.printStackTrace(System.out);
}
测试结果
采用上述程序读写统一Excel文件时会产生问题,也就是无法通过该种方式来修改Excel文件。
问题分析
POI虽然初始时通过加载程序将所有文件内容加载到内存中,但是还是与Excel文件保持着联系。在文件打开状态下,用户尝试向文件写入程序,然后POI会尝试去从源文件中拷贝到新文件中,但是这部分文件已经被擦除了,这便导致了问题。
解决方案
将打开Excel的代码修改为
Workbook wb = WorkbookFactory.create(new FileInputStream(sourcePath));
Sheet table = wb.getSheetAt(0);
通过FileInputStream方式打开文件,文件内容会存在缓存中,POI的workbook与缓存中的文件内容建立联系,所以此时操作文件系统中的原始文件不会导致问题。
参考资料
http://stackoverflow.com/questions/27956535/apache-poi-file-getting-corrupted-and-unable-to-write-to-existing-workbook
- poi向已经打开的excel文件写数据导致文件被清空
- poi写excel文件
- poi写excel文件
- poi,java向 excel文件写数据(缺点,HSSFWorkbook不支持图片) 例子
- MFC 打开已经存在的EXCEL文件
- Java向Excel文件中写数据
- C#判断已经被打开过的excel文件
- 用JAVA打开一个已经写好的TXT文件
- 向文件中写数据的方法
- JAVA利用Apache Poi写Excel文件
- 【整理】Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据
- Android 打开文件后向文件写数据,但数据并不能实时保存到磁盘
- Excel文件无法导入,错误: 它已经被别的用户以独占方式打开,或没有查看数据的权限。
- POI Excel文件的导出
- 向文件中写数据
- POI实现Excel文件上传下载,读/写数据库(poi)
- poi将数据库数据导出excel文件
- POI另存数据至Excel文件
- 绘图不可或缺的画笔Paint-滤镜篇
- openstack 管理三十四
- Leetcode 329
- 【webapp】参考网站
- [题解]bzoj1051(HAOI2006)受欢迎的牛
- poi向已经打开的excel文件写数据导致文件被清空
- YII2 Gridview 部分使用规则
- (1)Java开发环境的配置步骤。
- arm cpsr寄存器解析
- Android适配:字体的大小适配
- java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.
- 关于Blob的理解
- /usr/bin/ld: cannot find -lxxx
- Java开发环境的配置步骤