在Apachi POI Java中将大型数据转换为excel 我正在处理一个大的CSV(200 MB的文本文件),我想转换成Excel表,但是工作簿变得如此耗时,在这个过程中间,java抛出“ GC开销限制超过” 如果我正在生成虚拟引用,我已经检查了代码,但我认为不存在任何引用
在我看来,那些来自Apachi-POI的库调用可能会生成一些使垃圾收集器如此繁忙的引用 我的问题是,我是否可以像文本文件一样将工作簿一块一块地写入一个文件,就像附加到一个文本文件,而不将其放入内存。有什么解决办法吗?或者我遗漏了什么 GC在以下代码中引发异常:在Apachi POI Java中将大型数据转换为excel 我正在处理一个大的CSV(200 MB的文本文件),我想转换成Excel表,但是工作簿变得如此耗时,在这个过程中间,java抛出“ GC开销限制超过” 如果我正在生成虚拟引用,我已经检查了代码,但我认为不存在任何引用,java,excel,garbage-collection,apache-poi,large-data,Java,Excel,Garbage Collection,Apache Poi,Large Data,在我看来,那些来自Apachi-POI的库调用可能会生成一些使垃圾收集器如此繁忙的引用 我的问题是,我是否可以像文本文件一样将工作簿一块一块地写入一个文件,就像附加到一个文本文件,而不将其放入内存。有什么解决办法吗?或者我遗漏了什么 GC在以下代码中引发异常: private void updateExcelWorkbook(String input, String fileName, Workbook workbook) { try { Sheet sheet
private void updateExcelWorkbook(String input, String fileName, Workbook workbook) {
try {
Sheet sheet = workbook.createSheet(fileName);
// Create a new font and alter it.
Font font = workbook.createFont();
font.setFontHeightInPoints((short) 11);
font.setBold(true);
// Fonts are set into a style so create a new one to use.
CellStyle style = workbook.createCellStyle();
style.setFont(font);
Row row;
Cell cell;
String[] columns;
String[] lines = input.split("\n");
int colIndex;
int rowIndex = 1;
for (String line : lines) {
row = sheet.createRow(rowIndex++);
columns = line.split("\t");
colIndex = 0;
for (String column: columns) {
cell = row.createCell(colIndex++);
if (rowIndex == 1)
cell.setCellStyle(style);
cell.setCellValue(column);
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
看起来您使用的是POI用户模型,它占用了很高的内存,因为它将整个工作表保存在内存中,类似于DOM将整个XML文档保存在内存中的方式 您需要使用流式API。使用POI,您可以使用SXSSF缓冲流式API创建
.xlsx
文件,如下所述:
上面链接的页面有此图像,显示POI的电子表格API功能摘要:(来源:)老兄,你救了我的命!它就像一个符咒。结果更快,没有问题,但生成的excel文件比XSSF工作簿创建的文件大一点,我不在乎!)