【问题标题】:POI XSSFWorkbook cloning/copy/duplicatingPOI XSSFWorkbook 克隆/复制/复制
【发布时间】: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


【解决方案1】:

我有一个类似的练习,我的解决方案是使用 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 ()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2012-10-26
    • 1970-01-01
    • 2019-11-18
    • 2011-10-17
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多