Miguel Angel Medina

Código para general el fichero excel:

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Hoja1");

Creamos un fichero temporal (puede ser temporal o no, a tu elección):

File file = File.createTempFile(dto.getGridName().toLowerCase()+"-", ".xls");

 A partir del fichero creamos un InputStream

FileOutputStream report = new FileOutputStream( file.getPath() );

En este InputStream escribiremos el contenido del fichero excel:

workbook.write(report);
//Cerramos el fichero excel
workbook.close();
//Cerramos el InputStream
report.close()

Para devolver el fichero binario de forma que sea manejable con

Script utilizaremos el objeto

Asignamos el content-type:

response.setContentType("application/vnd.ms-excel;base64");

 Mandamos el encabezado para que el navegador sepa que tiene que descargarse el fichero generado:

response.setHeader("Content-disposition", "attachment; filename=" + file.getName());

Leemos el fichero generado con un InputStream

FileInputStream in = new FileInputStream(file);
byte[] bytes = new byte[(int)file.length()];
in.read(bytes);

//Hacemos el encode de los bytes leídos
String encodedBase64 = new String(Base64.encodeBase64(bytes));

//Escribimos en el objeto response el contenido del mismo
response.getOutputStream().write(encodedBase64.getBytes());

//Cerramos el InputStream
in.close();

 

El código anterior estará en el servidor, ahora se muestra el código JavaScript en la parte Cliente:

 

			$.ajax({
				url : url,
				contentType: "application/vnd.ms-excel",
				beforeSend : function(xhr) {

					//Aquí podemos mostrar un loader
				},
				success : function(data, status, xhr) {
					
					//Ocultamos el loader
					
					//Si se han devuelto datos
					if (data != null && data != "FAIL") {
						var b64Data = data;
						var contentType = xhr.getResponseHeader("Content-Type"); //Obtenemos el tipo de los datos
						var filename = xhr.getResponseHeader("Content-disposition");//Obtenemos el nombre del fichero a desgargar
						filename = filename.substring(filename.lastIndexOf("=") + 1) || "download";

						var sliceSize = 512;
						
						
						var byteCharacters = window.atob(b64Data);
						var byteArrays = [];

						for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
							var slice = byteCharacters.slice(offset, offset + sliceSize);

							var byteNumbers = new Array(slice.length);
							for (var i = 0; i < slice.length; i++) {
								byteNumbers[i] = slice.charCodeAt(i);
							}

							var byteArray = new Uint8Array(byteNumbers);

							byteArrays.push(byteArray);
						}
						//Tras el procesado anterior creamos un objeto blob
						var blob = new Blob(byteArrays, {
							type : contentType
						});

						// IE 10+
						if (navigator.msSaveBlob) {
							navigator.msSaveBlob(blob, filename);
						} else {
						//Descargamos el fichero obtenido en la petición ajax
							var url = URL.createObjectURL(blob);
							var link = document.createElement('a');
							link.href = url;
							link.download = filename;
							document.body.appendChild(link);
							link.click();
							document.body.removeChild(link);
						}

					}
				},
				complete : function(xhr, status) {
					if (xhr.readyState == 4) {
						if (xhr.status == 200) {
							//Ocultamos el loader

							var contentLength = xhr.getResponseHeader("Content-Length");

							if (contentLength && contentLength == 0)
								//Si la descarga está vacía mostramos una alerta
								alert("No se ha podido descargar el archivo");

						}
					}

				}
			});

 

Con éste código somos capaces de descargar con ajax un fichero binario, generado al vuelo.

En Java 6 no hay un método directo que permita obtener el número de registros por una consulta. Hay diferentes formas, pero aquí vamos a describir la más elegantes (a mi humilde entender).

 

Es muy sencillo. Instaciamos el objeto Statement de la siguiente forma:

Session session;

Connection connection;

Statement statement;

/*

[... nos conectamos a la base de datos ...]

*/

//En este caso devolveremos un resultset por el que nos podamos desplazar (ResultSet.TYPE_SCROLL_INSENSITIVE) y no actualizable (ResultSet.CONCUR_READ_ONLY)

Statement statement = session.connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Resultset resultSet = statement.executeQuery("SELECT * FROM MI TABLA");
//Si la consulta ha devuelto registros if( resultSet.last ){ //Obtenemos el númeo de registro de la última fila int totalRegistros = resultSet.getRow(); //Nos volvemos a posicionar antes de la primera fila para poder tratar el resultset resultSet.beforeFirst(); }

 Con el código anterior resolvemos el problemilla se saber cuantos registros devuelve la consulta que hagamos

 

 

 

Seguro que alguna vez has necesitado localizar un campo en una base de datos Oracle con multitud de tablas y lo único que conocías era el nombre del campo en cuestión. Pues aquí tienes la solución a tu problema. Con la siguiente query puedes localizar cualquier campo en una base de datos Oracle:

 

SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,NULLABLE FROM ALL_TAB_COLUMNS WHERE (column_name = upper( 'NOMBRE_DEL_CAMPO'));

Localizar un campo en una base de datos Oracle

 

SoapUI soporta como lenguajes de script Groovy y JavaScript, pero en este caso el ejemplo está implementado con Groovy.

A partir de este ejemplo se pueden hacer otras cosas como almacenar valores de propiedades a nivel de proyecto, de testSuite, etc para hacerlas accesibles a un objeto Transfer Properties.

En otra entrega mostraré como ejecutar un ws cambiado el endPoint que almacenaremos en un fichero de propiedades


import com.eviware.soapui.support.GroovyUtils
//Creamos un obj GroovyUtils
def groovyUtils = new GroovyUtils(context) 

//Workspace
def workspace = testRunner.testCase.testSuite.project.workspace

//Proyecto que contiene el TestCase a invocar (TestCase invocado)
def prjExterno = workspace.getProjectByName("prjExterno")

//Obtenemos la referencia al testSuite almacenado en el proyecto anterior
def testSuiteExterno = prjExterno.testSuites['TestSuite_Externo']

//Obtenemos la referencia al testCase que queremos ejecutar
def testCaseExterno = testSuiteExterno.testCases['TestCase_Externo']

//Obtenemos una referencia al paso del test case que queremos ejecutar
def testStepExterno = testCaseExterno.getTestStepByName("stepExterno")

//Ejecutamos el step para generar el token de seguridad (Las variables testRunner y context las provee SoapUI en el entorno)
def runner = testStepExterno.run(testRunner, context)
Tags: ,
Logo M4 ERP
Developer

Seguridad de la página de inicio

Please publish modules in offcanvas position.