我正在使用Apache POI创建一个excel [.xls]文件。现在一个excel可以有65535行& 256列。我正在尝试编写java代码来编写带有65535x256单元格的xls文件。我收到了堆错误。当前的堆conf是-Xms512m -Xmx1700m。 RAM大小为3.5gb。
我的出路是什么? 我正在使用HSSF *类来编写xls文件。
Stack Trace是(我启用了-verbose:gc选项)
[Full GC [Tenured: 1092288K->1092288K(1092288K), 3.3174494 secs] 1583807K->1583807K(1583808K), [Perm : 3351K->3351K(12288K)], 3.3174977 secs] [Times: user=3.30 sys=0.03, real=3.33 secs]
[Full GC [Tenured: 1092288K->1092288K(1092288K), 3.3073908 secs] 1583807K->1583807K(1583808K), [Perm : 3351K->3351K(12288K)], 3.3074374 secs] [Times: user=3.30 sys=0.01, real=3.31 secs]
[Full GC [Tenured: 1092288K->9438K(1092288K), 0.3264828 secs] 1583807K->9438K(1583808K), [Perm : 3351K->3351K(12288K)], 0.3265362 secs] [Times: user=0.31 sys=0.00, real=0.31 secs]
Exception in thread "main" Heap
def new generation total 491520K, used 44939K [0x02990000, 0x23ee0000, 0x23ee0000)
eden space 436928K, 10% used [0x02990000, 0x05572fa8, 0x1d440000)
from space 54592K, 0% used [0x1d440000, 0x1d440000, 0x20990000)
to space 54592K, 0% used [0x20990000, 0x20990000, 0x23ee0000)
tenured generation total 1092288K, used 9438K [0x23ee0000, 0x66990000, 0x66990000)
the space 1092288K, 0% used [0x23ee0000, 0x24817810, 0x24817a00, 0x66990000)
compacting perm gen total 12288K, used 3357K [0x66990000, 0x67590000, 0x6a990000)
the space 12288K, 27% used [0x66990000, 0x66cd7778, 0x66cd7800, 0x67590000)
No shared spaces configured.
java.lang.OutOfMemoryError: Java heap space
at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:147)
at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:125)
at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:103)
at com.test.ExcelWriter.createWorkbook(ExcelWriter.java:119)
at com.test.TestMe2.main(TestMe2.java:38)
答案 0 :(得分:2)
尝试将Xms和Xmx设置为相同的值,即
-Xms1700m -Xmx1700m
这对你有用吗?
public static void main(String[] args) {
try {
FileOutputStream fileOut = new FileOutputStream("poi-test.xls");
HSSFWorkbook workbook = new HSSFWorkbook();
CreationHelper createHelper = workbook.getCreationHelper();
HSSFSheet worksheet = workbook.createSheet("POI Worksheet");
for(int i=0; i<20000; i++) {
Row row = worksheet.createRow(i);
row.createCell(0).setCellValue(createHelper.createRichTextString("row " + i));
}
fileOut.flush();
workbook.write(fileOut);
fileOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 1 :(得分:1)
我继续解决xls文件的问题。最终我不得不说服客户提供csv格式。现在我可以导出超过20000条记录。 感谢@Amine,@ Apache Fan,@ eon提供宝贵的建议。