我想使用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"的新副本。对象并将其保存在另一个变量中。
答案 0 :(得分:0)
我进行了类似的练习,我的解决方案是使用WorkbookFactory类的Create方法,并将源文件中的InputStream对象传递给它。是下一个:
InputStream inputStream = new FileInputStream (origin_file)
XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create (inputStream)
XSSFSheet sheet = wb.getSheet (sheet)
...
FileOutputStream file = new FileOutputStream ("new_file.xlsx")
wb.write (file)
file.close ()