1 /***
2 *
3 */
4 package ar.com.epere4.java2excel.excelWritter;
5
6 import java.io.BufferedOutputStream;
7 import java.io.File;
8 import java.io.FileOutputStream;
9 import java.io.IOException;
10 import java.io.OutputStream;
11 import java.util.Calendar;
12 import java.util.Collection;
13 import java.util.Date;
14 import java.util.Iterator;
15
16 import ognl.OgnlException;
17
18 import org.apache.poi.hssf.usermodel.HSSFCell;
19 import org.apache.poi.hssf.usermodel.HSSFRow;
20 import org.apache.poi.hssf.usermodel.HSSFSheet;
21 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
22
23 import ar.com.epere4.java2excel.parser.Java2ExcelDtd;
24 import ar.com.epere4.java2excel.parser.PropertyDtd;
25
26 /***
27 * This class allows you to print a some
28 * {@link java.util.Collection Collections} to an excel file using some
29 * configuration {@link ar.com.epere4.java2excel.parser.Java2ExcelDtd}.
30 *
31 * @author epere4
32 *
33 */
34 public class ExcelWritter {
35 /***
36 * This identifies the excel builtin format 0xf, "d-mmm-yy", as defined in
37 * {@link org.apache.poi.hssf.usermodel.HSSFDataFormat}.
38 *
39 * @see org.apache.poi.hssf.usermodel.HSSFDataFormat
40 */
41 private static final short DATE_FORMAT = 0xf;
42
43 /***
44 * This represents the excel workbook.
45 */
46 private final HSSFWorkbook workbook = new HSSFWorkbook();
47
48 /***
49 * Default constructor.
50 *
51 * @since 18/02/2006
52 */
53 public ExcelWritter() {
54
55 }
56
57 /***
58 * Adds a collection to be printed in the excel workbook represented by this
59 * object. For each collection added, a new excel sheet is created.
60 *
61 * @param data
62 * the collection to be printed in the excel file.
63 * @param metaData
64 * the configuration info.
65 * @since 18/02/2006
66 */
67 public void addReport(final Collection data, final Java2ExcelDtd metaData) {
68 addReport(data, metaData, null);
69 }
70 /***
71 * Adds a collection to be printed in the excel workbook represented by this
72 * object. For each collection added, a new excel sheet is created with the
73 * specified sheetName.
74 *
75 * @param data
76 * the collection to be printed in the excel file.
77 * @param metaData
78 * the configuration info.
79 * @param sheetName
80 * The name for the seet being added to the excel. If null, then
81 * a default name will be used. Sheet name cannot be blank,
82 * greater than 31 chars, or contain any of ///*?[].
83 * @since 05/03/2006
84 */
85 public void addReport(final Collection data, final Java2ExcelDtd metaData,
86 final String sheetName) {
87 if (data.size() > 0) {
88 metaData.getBody().completeProperties(
89 data.iterator().next().getClass());
90 }
91 HSSFSheet sheet;
92 if (sheetName == null) {
93 sheet = workbook.createSheet();
94 } else {
95 sheet = workbook.createSheet(sheetName);
96 }
97
98 HSSFRow titlesRow = sheet.createRow(0);
99 addMetaData(titlesRow, metaData);
100
101 int rowNum = 1;
102 for (Iterator iter = data.iterator(); iter.hasNext(); rowNum++) {
103 Object element = iter.next();
104 addData(sheet.createRow(rowNum), metaData, element);
105 }
106 }
107
108 /***
109 * This method adds the column titles to the row supplied.
110 *
111 * @param row
112 * the row where the titles will be added.
113 * @param metaData
114 * the configuration info, that contains the column names.
115 * @since 18/02/2006
116 */
117 private void addMetaData(final HSSFRow row, final Java2ExcelDtd metaData) {
118 short colNum = 0;
119 for (Iterator iter = metaData.getBody().propertiesIterator(); iter
120 .hasNext(); colNum++) {
121 PropertyDtd property = (PropertyDtd) iter.next();
122 HSSFCell cell = row.createCell(colNum);
123
124 cell.setCellValue(property.getTitle());
125 }
126 }
127
128 /***
129 * Adds the element to the row, using the metaData configuration.
130 *
131 * @param row
132 * the row where to add the element.
133 * @param metaData
134 * the configuration info.
135 * @param element
136 * the element to add to the row.
137 * @since 18/02/2006
138 */
139 private void addData(final HSSFRow row, final Java2ExcelDtd metaData,
140 final Object element) {
141 short colNum = 0;
142 for (Iterator iter = metaData.getBody().propertiesIterator(); iter
143 .hasNext(); colNum++) {
144 PropertyDtd property = (PropertyDtd) iter.next();
145 HSSFCell cell = row.createCell(colNum);
146
147 Object elementValue;
148 try {
149 elementValue = property.evaluateExpression(element);
150 } catch (OgnlException e) {
151 if (property.isProtectNullPointer()) {
152 elementValue = null;
153 } else {
154 throw new RuntimeException(e);
155 }
156 }
157 if (elementValue instanceof Number) {
158 cell.setCellValue(((Number) elementValue).doubleValue());
159
160 } else if (elementValue instanceof Date) {
161 cell.setCellStyle(workbook.createCellStyle());
162 cell.getCellStyle().setDataFormat(DATE_FORMAT);
163 cell.setCellValue((Date) elementValue);
164
165 } else if (elementValue instanceof Calendar) {
166 cell.setCellStyle(workbook.createCellStyle());
167 cell.getCellStyle().setDataFormat(DATE_FORMAT);
168 cell.setCellValue((Calendar) elementValue);
169
170 } else if (elementValue instanceof Boolean) {
171 cell.setCellValue(((Boolean) elementValue).booleanValue());
172
173 } else {
174 cell.setCellValue(elementValue == null ? null : elementValue
175 .toString());
176 }
177 }
178 }
179
180 /***
181 * Saves the generated excel to the specified outputStream.
182 *
183 * @param outputStream
184 * the stream where you want to save the Excel.
185 * @throws IOException
186 * if any Input Output problem shows up.
187 */
188 public void saveTo(final OutputStream outputStream) throws IOException {
189 workbook.write(outputStream);
190 }
191
192 /***
193 * Saves the generated excel to the specified outputFile.
194 *
195 * @param outputFile
196 * the file where you want to save the Excel.
197 * @throws IOException
198 * if any Input Output problem shows up.
199 */
200 public void saveTo(final File outputFile) throws IOException {
201 OutputStream outputStream = null;
202 try {
203 outputStream = new BufferedOutputStream(new FileOutputStream(
204 outputFile));
205 saveTo(outputStream);
206 } finally {
207 if (outputStream != null) {
208 outputStream.close();
209 }
210 }
211 }
212
213 }