【发布时间】:2014-08-15 08:51:42
【问题描述】:
我想使用 OPCPackage 和 XSSFWorkbook 在 POI 中打开一个 excel 文件。由于这个文件将在不同的线程中使用,我想避免重新打开文件以节省时间(POI 打开 xlsx 文件很慢)。所以我所做的是将工作簿保存在一个全局变量中,然后线程将访问这个全局变量并重用该对象。
我遇到的问题是当我尝试重用对象时,它会影响/修改excel文件的原始数据。
我尝试通过克隆或序列化从全局变量复制工作簿,但在两个进程中都遇到错误。
有没有办法从现有的 XSSFWorkbook 对象创建一个新副本,并且使用这个新副本不会影响原始文件的数据?
这是我打开 excel 文件的代码:
OPCPackage pkg = OPCPackage.open(new File("c:/sample.xlsx"));
XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(pkg);
我想创建一个“wb”对象的新副本并将其保存在另一个变量中。
【问题讨论】:
-
您的意思是当您使用
wb.write()时它会修改原始文件,还是您希望在您的应用程序中有两个版本的工作簿?原版和修改版。 -
如果您以只读方式而不是读写方式打开原始文件会怎样?
-
@Sebastian_H 是的,它还修改了原始文件,是的,我想要打开的工作簿的两个版本。
-
@Gagravarr 我无法以只读方式打开工作簿,因为我需要创建工作簿的存档并在流程结束时将其保存在其他位置。
-
@Tina 你有什么解决办法吗?我也有兴趣
标签: java excel apache-poi