我有以下代码用于获取excel文件的工作表名称(.xlsx)
XSSFWorkbook workBookXlsx = new XSSFWorkbook(new FileInputStream(pathToFile));
ArrayList<String> sheetNames = new ArrayList<>();
int numberOfSheets = workBookXlsx.getNumberOfSheets();
for (int i = 0; i < numberOfSheets; i++) {
sheetNames.add(workBookXlsx.getSheetAt(i).getSheetName());
}
workBookXlsx = null;
我对上面代码的问题是需要大量内存(~700MB)&amp;很长一段时间(5-6秒)为大小为9MB的文件创建XSSFWorkbook
。即使将workBookXlsx
设置为null
也不会释放javaw
占用的内存(我知道gc
可能会或可能不会被调用&amp; JVM不会释放内存因为我已将变量设置为null)
我确实浏览了Workbook,XSSFWorkbook&amp;的文档。根据我的理解,没有任何方法可以帮助我获得具有低内存印记的工作表名称。
我找到的一个解决方案是手动解压缩.xlsx
文件并阅读.\xl\woorkbook.xml
的内容以获取工作表名称和r:id
是否有用于在没有大内存印记的.xlsx
文件中获取工作表名称的API?
答案 0 :(得分:5)
用他的评论来展示@Gagravarr可能意味着什么:
XSSFReader包含一个方法XSSFReader.getSheetsData“返回一个迭代器,它将让你依次获取所有不同的表格。每个工作表的InputStream只在从迭代器中获取时打开。这取决于你完成每一个后关闭InputStreams。“但通常这不是全部真相。实际上,它返回XSSFReader.SheetIterator,其中有XSSFReader.SheetIterator.getSheetName方法来获取工作表名称。
示例:
import java.io.InputStream;
import java.io.FileInputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import java.util.Iterator;
public class ExcelXSSFGetSheetNamesXSSFReader {
public static void main(String[] args) throws Exception {
OPCPackage pkg = OPCPackage.open(new FileInputStream("Example.xlsx"));
XSSFReader r = new XSSFReader( pkg );
Iterator<InputStream> sheets = r.getSheetsData();
if (sheets instanceof XSSFReader.SheetIterator) {
XSSFReader.SheetIterator sheetiterator = (XSSFReader.SheetIterator)sheets;
while (sheetiterator.hasNext()) {
InputStream dummy = sheetiterator.next();
System.out.println(sheetiterator.getSheetName());
dummy.close();
}
}
pkg.close();
}
}
结论:目前,您只能通过信任API文档才能使用apache poi
。相反,您必须始终查看source code。