Apache POI (http://poi.apache.org/) es un proyecto de Apache que nos permite trabajar, desde Java, con los documentos “office” de Microsoft. Tiene varias “sub-apis”, por un lado las que trabajan con los formatos antiguos de office (97-2007) y por otro las que trabajan con los nuevos formatos basados en xml. En este caso vamos a ver un ejemplo, muy por encima, de generación de un documento Excell utilizando el formato antiguo y cómo mostrarlo con Tapestry. El paquete a utilizar es org.apache.poi.hssf que tiene como descripción “Horrible SpreadSheet Format API's for reading/writting Excel files using pure Java”.
Empezamos viendo cómo generar el documento siguiente:
Dentro de nuestra página en Tapestry colocamos un par de enlaces para la generación de los documentos Excell:
El código, dentro del archivo “.tml”, para generar los enlaces:
<t:actionlink t:id="obtenerSabanaEnExcel" style="margin-right:10px;">
<img src="${context:imagenes/excel.png}"/>
Sábana
</t:actionlink>
<t:actionlink t:id="excelParaMoodle" style="margin-right:10px;">
<img src="${context:imagenes/excelparamoodle.png}"/>
Excel para Actas en Moodle
</t:actionlink>
El código, dentro de la clase Java asociada con la página, que se ejecuta al pulsar sobre obtenerSabanaEnExcell (onActionFrom):
StreamResponse onActionFromObtenerSabanaEnExcel() throws Exception {
getAlumnos();
SabanaAsignatura sabanaAsignatura = new SabanaAsignatura(getCodigoAsignatura(), getSistema(), alumnos, parteExamenDAO, resultadoExamenDAO, getUsuario().getCursoAcademico());
GeneradorSabanaExcelCompleta generador = new
GeneradorSabanaExcelCompleta(getNombreAsignatura(), sabanaAsignatura);
InputStream is = generador.generarSabana(getSistema());
return new ExcelStreamResponse(is, "Resultados");
}
Donde lo único que hacemos es cargar los datos para la generación del Excell, generarlo y devolver un objeto del tipo ExcelStreamResponse con el InputStream y que se llamará “Resultados.xls” en el cliente.
La clase ExcelStreamResponse es utilizada por Tapestry para hacer saber al navegador el tipo de contenido (en este caso un documento Excell de Microsoft) que le va a ser servido:
public class ExcelStreamResponse implements StreamResponse {
private InputStream is;
private String filename="default";
public ExcelStreamResponse(InputStream is, String... args) {
this.is = is;
if (args != null) {
this.filename = args[0];
}
}
public String getContentType() {
return "application/vnd.ms-excel";
}
public InputStream getStream() throws IOException {
return is;
}
public void prepareResponse(Response arg0) {
arg0.setHeader("Content-Disposition", "attachment; filename=" + filename + ".xls");
}
}
Dentro de la clase GeneradorSabanaExcelCompleta se crea la hoja (u hojas) Excell.
HSSFWorkbook libro = new HSSFWorkbook();
hoja = libro.createSheet(nombreAsignatura);
Se crean las filas:
HSSFRow fila0 = hoja.createRow(0);
fila0.setHeightInPoints(19f);
Se crean los estilos:
Font fuenteBlanca;
fuenteBlanca = libro.createFont();
fuenteBlanca.setColor(IndexedColors.WHITE.getIndex());
//
CellStyle estiloGris = libro.createCellStyle();
estiloGris.setAlignment(CellStyle.ALIGN_CENTER);
estiloGris.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
estiloGris.setFillPattern(CellStyle.SOLID_FOREGROUND);
estiloGris.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
estiloGris.setFont(fuenteBlanca);
Y se crean y se rellenan las celdas con los distintos estilos:
HSSFCell celdaAsignatura = fila0.createCell(0);
celdaAsignatura.setCellValue(nombreAsignatura);
celdaAsignatura.setCellStyle(estiloGrisOscuro);
Finalmente, devolvemos el InputStream:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
libro.write(baos);
baos.close();
return new ByteArrayInputStream(baos.toByteArray());
Utilización de plantillas.
Apache POI también nos permite utilizar plantillas (vale un xls sin rellenar) con lo que nuestro código se reduce bastante. Un ejemplo completo:
public static InputStream generarControlDeAsistencia(File plantilla, String cursoAcademico, String curso, int grupo, List<String> alumnos) throws Exception {
FileInputStream fis = new FileInputStream(plantilla);
HSSFWorkbook libro = new HSSFWorkbook(fis);
HSSFSheet hoja = libro.getSheetAt(0);
HSSFRow fila = hoja.getRow(1);
HSSFCell celda = fila.getCell(5);
celda.setCellValue(cursoAcademico);
celda = fila.getCell(8);
celda.setCellValue(curso);
celda = fila.getCell(11);
celda.setCellValue(grupo);
int totalFilas = Math.min(alumnos.size(), 36);
for (int i=0; i<totalFilas; i++) {
fila = hoja.getRow(7 + i);
celda = fila.getCell(1);
celda.setCellValue(alumnos.get(i));
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
libro.write(baos);
baos.close();
return new ByteArrayInputStream(baos.toByteArray());
}
ni pies ni cabeza...
ResponderEliminarGracias por el comentario. Te doy la razón.
Eliminar