Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/12/2009, 15:07
Avatar de Wayern
Wayern
 
Fecha de Ingreso: septiembre-2008
Ubicación: Aguascalientes
Mensajes: 65
Antigüedad: 16 años, 4 meses
Puntos: 4
Pregunta Ayuda con excel creado con JXL

Hola a todos, espero puedan darme una mano con esta duda.
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:
public 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();
		}
	}
Espero que me puedan ayudar y que mi codigo sea lo suficientemente entendible
Gracias de antemano.