package com.ejie.x38.reports; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument; import org.odftoolkit.odfdom.doc.table.OdfTable; import org.odftoolkit.odfdom.doc.table.OdfTableRow; import org.springframework.web.servlet.view.AbstractView; import com.ejie.x38.dto.JerarquiaDto; public class ODSReportView extends AbstractView { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //Tipo y Nombre Fichero response.setHeader("Content-type", "application/vnd.oasis.opendocument.spreadsheet"); response.setHeader("Content-Disposition", "attachment; filename=\"" + model.get("fileName") + ".ods\""); //Salida OdfSpreadsheetDocument osd = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.newSpreadsheetDocument(); osd.getOrCreateDocumentStyles(); //Eliminar contenido por defecto osd.getTableByName("Sheet1").remove(); //Procesar Hojas List<ReportData> reportData = (List<ReportData>) model.get("reportData"); for (ReportData dataSheet : reportData) { //Metadatos boolean isJerarquia = dataSheet.isJerarquia(); boolean isGrouping = dataSheet.isGrouping(); JerarquiaMetadata jmd = dataSheet.getJerarquiaMetadada(); LinkedHashMap<String, String> dataHeader = (LinkedHashMap<String, String>) dataSheet.getHeaderNames(); List<Object> modelData; if (!isJerarquia){ modelData = dataSheet.getModelData(); } else { modelData = dataSheet.getModelDataJerarquia(); } //Hoja OdfTable table = OdfTable.newTable(osd, modelData.size()+1, dataHeader.size()); table.setTableName(dataSheet.getSheetName()); //Cabeceras Hoja OdfTableRow tablerow = table.getRowByIndex(0); int cellNum = 0; int rowNum = 0; if (dataSheet.isShowHeaders()){ //Columna para la agrupacion if (isGrouping){ tablerow.getCellByIndex(cellNum++).setStringValue(""); } //Columna para marcar los elementos que cumplen filtro en Jerarquia if (isJerarquia && jmd.isShowFiltered()){ if (!"".equals(jmd.getFilterHeaderName())){ tablerow.getCellByIndex(cellNum++).setStringValue(jmd.getFilterHeaderName()); } else { tablerow.getCellByIndex(cellNum++).setStringValue(""); } } for (Map.Entry<String, String> entry : dataHeader.entrySet()) { //Si tiene agrupacion, no debe mostrarse la columna del grupo y es la columna del grupo comprobar => pasar al siguiente if (isGrouping && !dataSheet.isShowGroupColumng() && entry.getKey().equals(dataSheet.getGroupColumnName())){ continue; } tablerow.getCellByIndex(cellNum++).setStringValue(entry.getValue()); } rowNum++; } //Datos Hoja String prevGroupValue="", groupValue = ""; for (Object object : modelData) { //Gestión filas-columnas tablerow = table.getRowByIndex(rowNum++); cellNum = 0; //jerarquia int level = 0; boolean hasChildren = false; //Si tiene agrupación => comprobar el cambio de grupo if (isGrouping){ groupValue = BeanUtils.getProperty(((JerarquiaDto)object).getModel(), dataSheet.getGroupColumnName()); if (!groupValue.equals(prevGroupValue)){ prevGroupValue = groupValue; tablerow.getCellByIndex(cellNum++).setStringValue(groupValue); tablerow = table.getRowByIndex(rowNum++); cellNum = 0; } tablerow.getCellByIndex(cellNum++).setStringValue(""); //Espacio para evitar columna agrupación } //Si es jerarquia => comprobar si debe mostrar filtro y obtener atributo + parsear objeto de iteracion if (isJerarquia){ if (jmd.isShowFiltered()){//Mostrar si cumple filtro if (((JerarquiaDto) object).isFilter()){ //Cumple filtro tablerow.getCellByIndex(cellNum++).setStringValue(jmd.getFilterToken()); } else { tablerow.getCellByIndex(cellNum++).setStringValue(""); } } level = ((JerarquiaDto) object).getLevel(); hasChildren = ((JerarquiaDto) object).isHasChildren(); object = ((JerarquiaDto)object).getModel(); //Obtener objeto de negocio } for (Map.Entry<String, String> entry : dataHeader.entrySet()) { //Si tiene agrupacion, no debe mostrarse la columna del grupo y es la columna del grupo comprobar => pasar al siguiente if (isGrouping && !dataSheet.isShowGroupColumng() && entry.getKey().equals(dataSheet.getGroupColumnName())){ continue; } String columnValue = BeanUtils.getProperty(object, entry.getKey()); //Si es Jerarquia... if (isJerarquia){ //Si está activados los iconos y la columna es la indicada => aplicar iconos if (jmd.isShowIcon() && entry.getKey().equals(jmd.getIconColumnName())){ if (jmd.getIconCollapsedList().contains(BeanUtils.getProperty(object, jmd.getIconBeanAtribute()))){ columnValue = jmd.getIconUnexpanded() + columnValue; } else { if (hasChildren){ columnValue = jmd.getIconExpanded() + columnValue; } else { columnValue = jmd.getIconNoChild() + columnValue; } } } //Si está activada la tabulación y la columna es la indicada => aplicar tabulación if (jmd.isShowTabbed() && entry.getKey().equals(jmd.getTabColumnName())){ columnValue = jmd.getTab(level) + columnValue; } } tablerow.getCellByIndex(cellNum++).setStringValue(columnValue); } } } //Gestión de cookie (determina el final de la generación del fichero) Cookie cookie = new Cookie("fileDownload", "true"); cookie.setPath("/"); response.addCookie(cookie); //Escribir datos osd.save(response.getOutputStream()); } }