001: package dinamica;
002:
003: import org.apache.poi.hssf.usermodel.*;
004: import electric.xml.*;
005:
006: /**
007: * Genera un archivo excel (Apache POI) con el contenido de un recordset,
008: * se basa en una clase generica del framework. En general solo debe
009: * implementar el metodo "createWorkbook". Esta clase es generica lee del
010: * config.xml un conjunto de elementos para imprimir las columnas y filas.
011: * Se definen elementos en el config.xml como en el ejemplo:
012: * <xmp>
013: * <!--Elementos que recibe la clase generica de excel-->
014: * <excel recordset="query.sql">
015: * <!--Elementos para definir los campos y columnas-->
016: * <col id="col1" type="varchar" label="Columna 1"/>
017: * <col id="col2" type="integer" label="Columna 2" mask="#,###,##0"/>
018: * <col id="col3" type="double" label="Columna 3" mask="#,###,##0.00"/>
019: * <col id="col4" type="integer" label="Columna 4"/>
020: * <col id="col5" type="double" label="Columna 5"/>
021: * <col id="col6" type="date" label="Columna 6" mask="dd-MM-yyyy"/>
022: * </excel>
023: *</xmp>
024: * <br><br>
025: * Actualizado: 2008-01-07<br>
026: * Framework Dinamica - Distribuido bajo licencia LGPL<br>
027: * @author Martin Cordova y Asociados C.A.
028: */
029:
030: public class GenericExcelOutput extends AbstractExcelOutput {
031:
032: /**
033: * Crear un workbook para exportar un recordset como un archivo excel
034: * @param data Data object passed by the Transaction object to this Output object
035: * @return Workbook
036: * @throws Throwable
037: */
038: public HSSFWorkbook createWorkbook(GenericTransaction data)
039: throws Throwable {
040:
041: //crear workbook y una hoja
042: HSSFWorkbook wb = new HSSFWorkbook();
043: HSSFSheet sheet = wb.createSheet("Reporte");
044:
045: //codigo que lee los nombres de las columnas, campos y recordset del config.xml
046: Document doc = getConfig().getDocument();
047: Elements cols = doc.getRoot().getElements(new XPath("//col"));
048: Elements recordset = doc.getRoot().getElements(
049: new XPath("//excel"));
050:
051: //obtener recordset de data
052: Recordset rs = data.getRecordset(recordset.next().getAttribute(
053: "recordset"));
054: rs.top();
055:
056: //encabezados comienzan en el row 0
057: HSSFRow row = sheet.createRow((short) 0);
058:
059: //contador para el número de columnas
060: int countCol = 0;
061:
062: //obtener todos los label del config.xml
063: while (cols.hasMoreElements()) {
064: row.createCell((short) countCol).setCellValue(
065: new HSSFRichTextString(cols.next().getAttribute(
066: "label")));
067: countCol++;
068: }
069:
070: //crear recordset para contener los elementos del config.xml
071: Recordset rows = new Recordset();
072: rows.append("id", java.sql.Types.VARCHAR);
073: rows.append("type", java.sql.Types.VARCHAR);
074: rows.append("mask", java.sql.Types.VARCHAR);
075:
076: //retorna al primer elemento definido en el config.xml
077: cols.reset();
078:
079: //obtener todos los id del config.xml
080: while (cols.hasMoreElements()) {
081: //crear un nuevo registro
082: rows.addNew();
083: //asignar elemento al recordset
084: rows.setValue("id", cols.next().getAttribute("id"));
085: }
086:
087: //retorna al primer elemento definido en el config.xml
088: cols.reset();
089:
090: //pararse en el primer registro del recordset
091: rows.first();
092:
093: //obtener todos los type del config.xml
094: while (cols.hasMoreElements()) {
095: //asignar elemento al recordset
096: rows.setValue("type", cols.next().getAttribute("type"));
097: //pasar al siguiente registro
098: rows.next();
099: }
100:
101: //retorna al primer elemento definido en el config.xml
102: cols.reset();
103:
104: //pararse en el primer registro
105: rows.first();
106:
107: //obtener todos los elementos
108: while (cols.hasMoreElements()) {
109: //asignar elemento al recordset
110: rows.setValue("mask", cols.next().getAttribute("mask"));
111: //pasar al sguiente registro
112: rows.next();
113: }
114:
115: //añadir la data a partir del row 1
116: while (rs.next()) {
117:
118: //contador para el número de filas
119: int countRow = 0;
120:
121: //crear row
122: HSSFRow r = sheet
123: .createRow((short) rs.getRecordNumber() + 1);
124:
125: rows.top();
126: while (rows.next()) {
127: String mask = null;
128: String type = null;
129: String id = null;
130:
131: id = rows.getString("id");
132: type = rows.getString("type");
133: mask = rows.getString("mask");
134:
135: //verifica el tipo de campo
136: if (type.equals("varchar"))
137: //añadir celdas al row
138: r.createCell((short) countRow).setCellValue(
139: new HSSFRichTextString(rs.getString(id)));
140: else {
141: if (type.equals("integer")) {
142: if (mask != null) {
143: if (!rs.isNull(id))
144: //añadir celdas al row
145: r
146: .createCell((short) countRow)
147: .setCellValue(
148: new HSSFRichTextString(
149: StringUtil
150: .formatNumber(
151: rs
152: .getInteger(id),
153: mask)));
154: } else {
155: if (!rs.isNull(id))
156: //añadir celdas al row
157: r
158: .createCell((short) countRow)
159: .setCellValue(rs.getInteger(id));
160: }
161: } else {
162: if (type.equals("double")) {
163: if (mask != null) {
164: if (!rs.isNull(id))
165: //añadir celdas al row
166: r
167: .createCell(
168: (short) countRow)
169: .setCellValue(
170: new HSSFRichTextString(
171: StringUtil
172: .formatNumber(
173: rs
174: .getDouble(id),
175: mask)));
176: } else {
177: if (!rs.isNull(id))
178: //añadir celdas al row
179: r.createCell((short) countRow)
180: .setCellValue(
181: rs.getDouble(id));
182: }
183: } else {
184: if (type.equals("date")) {
185: if (mask != null) {
186: if (!rs.isNull(id))
187: //añadir celdas al row
188: r
189: .createCell(
190: (short) countRow)
191: .setCellValue(
192: new HSSFRichTextString(
193: StringUtil
194: .formatDate(
195: rs
196: .getDate(id),
197: mask)));
198: } else
199: throw new Exception(
200: "Elemento [mask] no encontrado");
201: } else
202: throw new Exception(
203: "Elemento [type] no encontrado");
204: }
205: }
206: }
207:
208: countRow++;
209: }
210:
211: }
212:
213: //retornar documento para su impresion hacia el browser
214: return wb;
215:
216: }
217:
218: }
|