我试图通过从数据库获取数据并将 pojo 集合列表传递给 JRBeanCollectionDataSource 来生成 Excel 报告。尝试生成包含 5000 条记录和 8 个字段的 Excel,出现内存不足问题。
我尝试了 JRFileVirtualizer 但没有运气,任何人都可以帮助我摆脱这个 OutOfMemory 问题。下面是我的代码
public class JasperReport {
public static void main(String [] args) throws Exception{
DBtoExcelDownloadDAO d = new DBtoExcelDownloadDAO();
List<ExcelDownloadPojo> results=d.getDBrecordsForDownload(168);
net.sf.jasperreports.engine.JasperReport jasperReport = JasperCompileManager
.compileReport("C:\\Users\\vkode200\\Networksolve_Report.jrxml");
String outputFileName = "C:\\Users\\vkode200\\Downloads\\Output\\person.xls";
JRFileVirtualizer virtualizer = new JRFileVirtualizer(1, "C:\\Users\\vkode200\\Reports");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, (Map) getParameters(virtualizer),
new JRBeanCollectionDataSource(
findReportData(results),false));
JRXlsExporter exporterXls = new JRXlsExporter();
exporterXls.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
exporterXls.setParameter(JRXlsExporterParameter.OUTPUT_FILE_NAME, outputFileName);
exporterXls.setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE);
exporterXls.exportReport();
}
private static Collection findReportData(List<ExcelDownloadPojo> results) throws FileNotFoundException, IOException {
List<JasperPojo> list = SampleExcel.generateExcel(results);
return list;
}
private static Object getParameters(JRFileVirtualizer virtualizer ) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("footerText", "Just to demonstrate how to pass parameters to report");
params.put("Title", "NETWORK_SOLVE");
params.put(JRParameter.REPORT_VIRTUALIZER,virtualizer);
return params;
}
}
<小时/>
错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1393) at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1292)
最佳答案
如果您无法减少数据量,那么您应该增加应用程序分配的堆以防止异常。由于我不知道您的应用程序是如何工作的,因此有一些方法可以解决此问题:
<小时/>命令
可以使用命令行选项增加分配给 JVM 的堆大小
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
java -Xms256m -Xmx2048m ClassName
<小时/>
NetBeans
右键单击项目 -> 属性 -> 运行
<小时/>Tomcat
setenv.sh
或 setenv.bat
在启动时执行。如果 $CATALINA_HOME/bin/
对于 Linux,创建 setenv.sh
并添加
export JAVA_OPTS="-server -Xmx2048m"
对于 Windows,创建 setenv.bat
并添加
set JAVA_OPTS=-server -Xmx2048m
根据您的需要更改 Xmx 值。
关于java - Jasper 报告内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45638279/