Estoy tratando de generar un archivo excel en base a un query que me regresa muchos registros. El problema que tengo es que, por la cantidad de registros y el número de columnas que tiene el reporte tengo un desbordamiento de memoria. He tratado de liberar memoria haciendo nulos los objetos que ya no utilizo, además de utilizar el System.gc(), pero como saben, no se garantiza que el Garbage Collector corra. Mi última idea fue hacer un query que me trajera los resultados en forma de paginación e ir pasando los resultados al excel para que los imprima en bloques de 2000 registros, indicandole también el renglón en el cual debe continuar con la escritura de datos; sin embargo no he podido lograr que se guarden mas que los primeros 2000 registros, los otros aparentemente se escriben, pero cuando abro el excel encuentro que solo tiene los primeros 2000 registros.
Pongo el código que utilizo para que ver si me pueden ayudar a encontrar que causa que no se estén guardando los registros:
Código:
Espero que me puedan ayudar y que mi codigo sea lo suficientemente entendiblepublic static void initChopFullFinancialExcel(List dataList, List sheetOneColNames, String[] sheetNames, String path, String fileName) { String url = path + fileName + ".xls"; try { wb = Workbook.createWorkbook(new File(url)); //wb es una variable global que inicializo aquí sheetOne = wb.createSheet(sheetNames[0], 0); // wirteCell(sheetOne, Constants.ZERO, Constants.ZERO, // Constants.CURRYEAR); WritableCell cell = null; WritableFont wf = null; WritableCellFormat cf = null; Colour c = null; System.out.println("****sheetOneColNames: " + sheetOneColNames.size()); for (int i = 0; i < sheetOneColNames.size(); i++) { wirteCell(sheetOne, i, 0, sheetOneColNames.get(i).toString()); cell = sheetOne.getWritableCell(i, 0); wf = new WritableFont(cell.getCellFormat().getFont()); wf.setColour(Colour.WHITE); cf = new WritableCellFormat(wf); c = Colour.BLUE; cf.setBackground(c); cell.setCellFormat(cf); } } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void writeChopContentToExcelForFullFinance(List dataList, List sheetOneColNames, String[] sheetNames, String path, String fileName, int startRow) { try { int row = startRow; int internalRow = 0; System.out.println("****dataList: " + dataList.size()); for (int i = 0; dataList.size() > 0 && i < dataList.size(); i++) { int col = Constants.ZERO; row++; internalRow++; List currList = (ArrayList) dataList.get(i); System.out.println("****row: " + row); for (int j = 0; currList.size() > 0 && j < currList.size(); j++) { if (j < Constants.TWELVE) { wirteLabel(sheetOne, col++, row, currList.get(j) .toString()); } else { wirteNumber(sheetOne, col++, row, currList.get(j) .toString()); } // wirteNumber(sheetOne, Constants.FOUR, row+Constants.ONE, // ((DownloadFinBean)currList.get(i)).getJanValue()); } if (internalRow == 2000 || row == dataList.size()) { writeExcellBook(); internalRow = 0; currList = null; System.gc(); } } dataList = null; System.gc(); //closeExcellBook(); } catch (Exception e) { System.out.println("****Error at: " + e.getMessage()); e.printStackTrace(); } } private static void writeExcellBook() { try { System.out.println("****try to write"); wb.write(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void closeExcellBook() { try { System.out.println("****try to close"); wb.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void wirteLabel(WritableSheet sheet, int x, int y, String value) { try { cell = sheet.getCell(x, y); if (cell.getType() == CellType.LABEL) { lab = (Label) cell; WritableCellFormat textFormat = new WritableCellFormat( NumberFormats.TEXT); lab.setCellFormat(textFormat); lab.setString(value); } else if (cell.getType() == CellType.EMPTY) { lab = new Label(x, y, value); WritableCellFormat textFormat = new WritableCellFormat( NumberFormats.TEXT); lab.setCellFormat(textFormat); sheet.addCell(lab); } cell = null; // System.gc(); } catch (Exception ex) { ex.printStackTrace(); } } public static void wirteNumber(WritableSheet sheet, int x, int y, String value) { try { cell = sheet.getCell(x, y); if (cell.getType() == CellType.NUMBER) { lab = (Label) cell; lab.setString(value); } else if (cell.getType() == CellType.EMPTY) { double tempnum = Double.parseDouble(value); Number num = new Number(x, y, tempnum); sheet.addCell(num); } cell = null; // System.gc(); } catch (Exception ex) { ex.printStackTrace(); } }
Gracias de antemano.