Foros del Web » Programación para mayores de 30 ;) » Java »

Ayuda con excel creado con JXL

Estas en el tema de Ayuda con excel creado con JXL en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/12/2009, 15:07
Avatar de Wayern  
Fecha de Ingreso: septiembre-2008
Ubicación: Aguascalientes
Mensajes: 65
Antigüedad: 15 años, 7 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.
  #2 (permalink)  
Antiguo 17/12/2009, 11:31
Avatar de Wayern  
Fecha de Ingreso: septiembre-2008
Ubicación: Aguascalientes
Mensajes: 65
Antigüedad: 15 años, 7 meses
Puntos: 4
Respuesta: Ayuda con excel creado con JXL

Hola de nuevo.
Encontré una solución al problema, aunque no estoy muy seguro de que sea la más óptima, si es viable. Lo que terminé haciendo fue pasar los registros a la hoja y ya hasta el final la mando imprimir en el excel, en lugar de mandar que escribiera cada vez que se agregaban cierto número de registros; además quité varios objetos que no utilizaba (Cabe señalar que a este método le estoy dando mantenimiento y no lo programé yo inicialmente, por lo que no me había dado cuenta de cuantos objetos que no se ocupan realmente estaban siendo agregados). Sigo trayendome los registros en grupos pequeños, porque si trato de traerlos todos de jalón no funciona, por lo que entre pasada y pasada hago null mi lista y mando un System.gc(), creo que eso también ayudó a evitar el desbordamiento en la memoria.
No quisé dejar pasar la oportunidad de compartir con ustedes la solución, por si alguno llega a tener un problema similar. Si alguien necesita el código, por favor, contáctenme y con gusto lo publico.
Saludos.
  #3 (permalink)  
Antiguo 27/06/2010, 18:20
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con excel creado con JXL

ya te pregunté

Última edición por jfmorenom; 27/06/2010 a las 18:22 Razón: ya lo repetí.
  #4 (permalink)  
Antiguo 27/06/2010, 18:22
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con excel creado con JXL

Cita:
Iniciado por Wayern Ver Mensaje
Hola de nuevo.
Encontré una solución al problema, aunque no estoy muy seguro de que sea la más óptima, si es viable. Lo que terminé haciendo fue pasar los registros a la hoja y ya hasta el final la mando imprimir en el excel, en lugar de mandar que escribiera cada vez que se agregaban cierto número de registros; además quité varios objetos que no utilizaba (Cabe señalar que a este método le estoy dando mantenimiento y no lo programé yo inicialmente, por lo que no me había dado cuenta de cuantos objetos que no se ocupan realmente estaban siendo agregados). Sigo trayendome los registros en grupos pequeños, porque si trato de traerlos todos de jalón no funciona, por lo que entre pasada y pasada hago null mi lista y mando un System.gc(), creo que eso también ayudó a evitar el desbordamiento en la memoria.
No quisé dejar pasar la oportunidad de compartir con ustedes la solución, por si alguno llega a tener un problema similar. Si alguien necesita el código, por favor, contáctenme y con gusto lo publico.
Saludos.
HOla Amigo, ya que veo que trabajas con jxl, quisiera saber si haz creado algun .jar que tenga incluidos archivos de excel. Es que yo cargo 2 archivos de excel así:
Código:
this.workbook1 = Workbook.getWorkbook(new File("C:/Documents and Settings/Jhon/Escritorio/Simulador/src/simulador/resources", "datos1.xls"));
this.workbook2= Workbook.getWorkbook(new File("C:/Documents and Settings/Jhon/Escritorio/Simulador/src/simulador/resources","datos2.xls"));
y cuando le doy run, me funciona bien y puedo trabajar con los datos, pero cuando ejecuto el .jar en otro pc no me cargan los datos pero sí me abre la aplicación. Yo estoy casi seguro que el problema es por el lado de la dirección absoluta con que cargo los archivos y claro, el .jar toma los archivos desde allá y al pasarlo a otro pc, no los encuentra. Cömo cargo los archivos para que se incluyan en el .jar y no dependan de la dirección absoluta?


Gracias por tu atención.

Última edición por jfmorenom; 27/06/2010 a las 18:32 Razón: error en digitalización
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:16.