1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.exporter.util;
20
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import javax.faces.component.UIColumn;
26 import javax.faces.component.UIComponent;
27 import javax.faces.component.ValueHolder;
28 import javax.faces.component.html.HtmlDataTable;
29 import javax.faces.context.FacesContext;
30 import javax.servlet.http.HttpServletResponse;
31
32 import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
33 import org.apache.poi.hssf.usermodel.HSSFCell;
34 import org.apache.poi.hssf.usermodel.HSSFRow;
35 import org.apache.poi.hssf.usermodel.HSSFSheet;
36 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
37
38
39
40
41 public class ExcelExporterUtil {
42
43 private static void addColumnHeaders(HSSFSheet sheet, List columns) {
44 HSSFRow rowHeader = sheet.createRow(0);
45
46 for (int i = 0; i < columns.size(); i++) {
47 UIColumn column = (UIColumn) columns.get(i);
48 addColumnValue(rowHeader, column.getHeader(), i);
49 }
50 }
51
52 private static List getColumns(HtmlDataTable table) {
53 List columns = new ArrayList();
54 for (int i = 0; i < table.getChildCount(); i++) {
55 UIComponent child = (UIComponent) table.getChildren().get(i);
56 if (child instanceof UIColumn) {
57 columns.add(child);
58 }
59 }
60 return columns;
61 }
62
63 private static void addColumnValue(HSSFRow rowHeader,
64 UIComponent component, int index) {
65 HSSFCell cell = rowHeader.createCell((short) index);
66 cell.setEncoding(HSSFCell.ENCODING_UTF_16);
67 if (component instanceof ValueHolder) {
68 String stringValue = RendererUtils.getStringValue(FacesContext
69 .getCurrentInstance(), component);
70 cell.setCellValue(stringValue);
71 }
72 }
73
74
75
76
77 private static void generateTableContent(FacesContext facesContext,
78 HSSFSheet sheet, List columns, HtmlDataTable dataTable) {
79
80 int numberOfColumns = columns.size();
81 int numberOfRows = dataTable.getRowCount();
82 int startFrom = 0;
83 int currentIndex = 1;
84 int endAt = numberOfRows;
85
86
87 for (int i = startFrom; i < endAt; ++i) {
88 dataTable.setRowIndex(i);
89 HSSFRow row = sheet.createRow(currentIndex++);
90 for (int j = 0; j < numberOfColumns; ++j) {
91 UIColumn column = (UIColumn) columns.get(j);
92 addColumnValue(row, (UIComponent) column.getChildren().get(0),
93 j);
94 }
95 }
96 }
97
98
99
100
101
102
103 private static void writeExcelToResponse(HttpServletResponse response,
104 HSSFWorkbook generatedExcel, String fileName) throws IOException {
105
106
107 response.setContentType("application/vnd.ms-excel");
108 response.setHeader("Expires", "0");
109 response.setHeader("Cache-Control",
110 "must-revalidate, post-check=0, pre-check=0");
111 response.setHeader("Pragma", "public");
112 response.setHeader("Content-disposition", "attachment;filename="
113 + fileName + ".xls");
114
115 generatedExcel.write(response.getOutputStream());
116 }
117
118
119
120
121
122
123
124
125 private static HSSFWorkbook generateExcelTableModel(
126 FacesContext facesContext, HtmlDataTable dataTable) {
127
128 HSSFWorkbook workbook = new HSSFWorkbook();
129 HSSFSheet sheet = workbook.createSheet(dataTable.getId());
130 List columns = getColumns(dataTable);
131 int currentRowIndex = dataTable.getRowIndex();
132
133 addColumnHeaders(sheet, columns);
134 generateTableContent(facesContext, sheet, columns, dataTable);
135
136 dataTable.setRowIndex(currentRowIndex);
137 return workbook;
138 }
139
140
141
142
143
144
145
146
147
148 public static void generateEXCEL(FacesContext facesContext,
149 HttpServletResponse response, String fileName, HtmlDataTable dataTable)
150 throws IOException {
151
152
153
154
155
156 if (fileName == null)
157 {
158 fileName = dataTable.getId();
159 }
160
161
162 HSSFWorkbook generatedExcel = ExcelExporterUtil
163 .generateExcelTableModel(facesContext, dataTable);
164
165 writeExcelToResponse(response, generatedExcel, fileName);
166 }
167 }