gpt4 book ai didi

excel - Apache POI : SXSSFWorkbook. dispose() 不存在

转载 作者:行者123 更新时间:2023-12-01 21:19:28 29 4
gpt4 key购买 nike

我正在使用 apache 的 POI API 来编写 XLSX 文件。由于我需要写入大文件,因此我使用 Streaming API (SXSSF)。为此,我关注 this指导。请注意,在示例的末尾有一个调用

wb.dispose

此 wb 实例引用 SXSSFWorkbook 实例。我在代码中使用相同的方法,但它提示 dispose 方法不存在。我下载了源码,没有找到方法。然而,进入他们的 SVN 并检查该类的代码,我们可以看到那里的方法:

https://svn.apache.org/repos/asf/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java

我已经尝试重新编译他们的代码,但出现了很多错误...

最佳答案

Apache POI 3.8(当时的最新稳定版)为每个工作表创建一个临时 XML 文件(使用 SXSSF 时),但没有提供删除这些文件的选项。这一事实使得这个 API 不好用,因为如果我导出 600MB 的数据,那么我将有 2 个 600MB 的文件,其中一个将位于临时文件夹中,直到被删除。

深入研究代码,我们发现类 SXSSFSheet 有一个 SheetDataWriter 实例。最后一个类负责写入和维护由 File 实例表示的临时文件。访问该对象将允许删除该文件。所有这些实例都是私有(private)的,因此理论上您无法访问它们。但是,通过反射,我们可以访问 File 实例来删除这个有用但烦人的文件!

以下方法允许执行此操作。通过调用 deleteSXSSFTempFiles,该工作簿的所有临时文件都将被删除。

/**
* Returns a private attribute of a class
* @param containingClass The class that contains the private attribute to retrieve
* @param fieldToGet The name of the attribute to get
* @return The private attribute
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static Object getPrivateAttribute(Object containingClass, String fieldToGet) throws NoSuchFieldException, IllegalAccessException {
//get the field of the containingClass instance
Field declaredField = containingClass.getClass().getDeclaredField(fieldToGet);
//set it as accessible
declaredField.setAccessible(true);
//access it
Object get = declaredField.get(containingClass);
//return it!
return get;
}

/**
* Deletes all temporary files of the SXSSFWorkbook instance
* @param workbook
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static void deleteSXSSFTempFiles(SXSSFWorkbook workbook) throws NoSuchFieldException, IllegalAccessException {

int numberOfSheets = workbook.getNumberOfSheets();

//iterate through all sheets (each sheet as a temp file)
for (int i = 0; i < numberOfSheets; i++) {
Sheet sheetAt = workbook.getSheetAt(i);

//delete only if the sheet is written by stream
if (sheetAt instanceof SXSSFSheet) {
SheetDataWriter sdw = (SheetDataWriter) getPrivateAttribute(sheetAt, "_writer");
File f = (File) getPrivateAttribute(sdw, "_fd");

try {
f.delete();
} catch (Exception ex) {
//could not delete the file
}
}
}
}

关于excel - Apache POI : SXSSFWorkbook. dispose() 不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12710961/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com