文章目录

可以导出List<实体>、List、List<实体包含实体> 三种类型的数据

调用代码 (最下面为工具类)

导出List<实体>:

response 为 HttpServletResponse ,如果查出的字段全部导出的话 tmarray为null

1
2
3
4
5
6
List<BorrowCreditCustomize> recordList = XXXXX;//赋值
//导出列表
String[] keys = new String[] { "编号", "用户名","状态"};
String tmarray=",creditNid,username,creditStatusName,";
JxlExcelUtils.exportexcle(response, "列表", recordList, "work", keys,BorrowCreditCustomize.class,null,tmarray);
return null;

导出List<实体包含实体>:

1
2
3
4
5
6
7
8
9
List<AdminBorrowCreditRepayCustomize> recordList = 查出的数据赋值;
//导出列表
String[] keys = new String[] { "借款编号", "应还日期"};
//包含的内部实体
Class[] contantsClass=new Class[]{CreditRepay.class,Borrow.class};
//想要的字段 全要 是null
String tmarray=",borrowNid,addip,";
JxlExcelUtils.exportexcle(response, "详情列表", recordList, "work", keys,AdminBorrowCreditRepayCustomize.class,contantsClass,tmarray);
return null;

导出List

注意 Hap转换成有序的LinkedHashMap再调用,key是取查出数据最多的行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
for (int i = 0; i < list.size()-1; i++) {
Object[] ss= list.get(i).keySet().toArray();
Object[] vv= list.get(i+1).keySet().toArray();
if(key==null){
if(ss.length>=vv.length){
key=ss;
}else{
key=vv;
}
}else{
if(key.length<vv.length){
key=vv;
}
}
}
}
Map<String, String> mapParm= new HashMap<String, String>();
mapParm.put("dlrs", "队列人数");
mapParm.put("yhm", "用户名");
mapParm.put("sfkq", "是否开启");
mapParm.put("tblx", "投标类型");
mapParm.put("hkfs", "还款方式");
mapParm.put("tbed", "投标额度");
for (int i = 0; i < key.length; i++) {
if(mapParm.get(key[i])!=null){
key[i]=mapParm.get(key[i]);
}
}
JxlExcelUtils.exportexcle(response, "自投条件数据", list, "work", key,null,null,null);
return null;

工具类

JxlExcelUtils.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
package com.hyjf.common.util;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
/**
* jxl导出excel
* @author zhouxiaoshuai
* @date 2016-06-01
*/
public class JxlExcelUtils {
/**
* @author
* @param objData 导出内容数组
* @param sheetName 导出工作表的名称
* @param contantsClass
* @param objects 导出Excel的表头数组
* @return
*/
public static int exportToExcel(HttpServletResponse response, List<?> objData, String sheetName,Object[] key,Class clazz, Class[] contantsClass,String tmarray) {
int flag = 0;
//声明工作簿jxl.write.WritableWorkbook
WritableWorkbook wwb;
try {
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream os = response.getOutputStream();
wwb = Workbook.createWorkbook(os);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。
* createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws = wwb.createSheet(sheetName, 0);
SheetSettings ss = ws.getSettings();
ss.setVerticalFreeze(1);//冻结表头
WritableFont font1 =new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);
WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
WritableCellFormat wcf = new WritableCellFormat(font1);
WritableCellFormat wcf2 = new WritableCellFormat(font2);
WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体
//创建单元格样式
//WritableCellFormat wcf = new WritableCellFormat();
//背景颜色
wcf.setBackground(jxl.format.Colour.YELLOW);
wcf.setAlignment(Alignment.CENTRE); //平行居中
wcf.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
wcf3.setAlignment(Alignment.CENTRE); //平行居中
wcf3.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
wcf3.setBackground(Colour.LIGHT_ORANGE);
wcf2.setAlignment(Alignment.CENTRE); //平行居中
wcf2.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
/*
* 这个是单元格内容居中显示
* 还有很多很多样式
*/
wcf.setAlignment(Alignment.CENTRE);
//判断一下表头数组是否有数据
if (key != null && key.length > 0) {
int tmp=0;
//循环写入表头
for (int i = 0; i < key.length; i++) {
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
String str=key[i].toString();
if(!str.equals("key")){
if(tmp==1){
ws.addCell(new Label(i-1, 0, str, wcf));
}else{
ws.addCell(new Label(i, 0, str, wcf));
}
}else{
tmp=1;
}
}
//判断表中是否有数据
if (objData != null && objData.size() > 0) {
if (clazz!=null) {
//处理list<实体>的导出
try {
Field[] obj=clazz.getDeclaredFields();
//循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
//循环插值
int cellcount=0;
for (int j = 0; j < obj.length; j++) {
if (contantsClass!=null) {
int flag2=0;
//如果实体里包含实体
for (int j2 = 0; j2 < contantsClass.length; j2++) {
if (contantsClass[j2].getName().toLowerCase().equals(obj[j].getName().toLowerCase())) {
//java反射调用get方法获取对象里的值
String tmpname="get"+(obj[j].getName().substring(0, 1)).toUpperCase()+obj[j].getName().substring(1,obj[j].getName().length());
Object object= clazz.newInstance();
object = objData.get(i);
Method m1 = clazz.getDeclaredMethod(tmpname);
//内部实体
Object inside= contantsClass[j2].newInstance();
inside= m1.invoke(object);
Field[] insideField=contantsClass[j2].getDeclaredFields();
//写入内部实体的字段
for (int k = 0; k < insideField.length; k++) {
if (tmarray==null||tmarray.contains(","+insideField[k].getName()+",")) {
String tmpname2="get"+(insideField[k].getName().substring(0, 1)).toUpperCase()+insideField[k].getName().substring(1,obj[j].getName().length());
Method m2 = contantsClass[j2].getDeclaredMethod(tmpname2);
Object result2= m2.invoke(inside);
ws.addCell(new Label(cellcount,i+1,String.valueOf(result2)));
cellcount++;
}
}
flag2=1;
}
}
//处理不是实体的情况
if (flag2==0) {
if (tmarray==null||tmarray.contains(","+obj[j].getName()+",")) {
//java反射调用get方法获取对象里的值
String tmpname="get"+(obj[j].getName().substring(0, 1)).toUpperCase()+obj[j].getName().substring(1,obj[j].getName().length());
Object object= clazz.newInstance();
object = objData.get(i);
Method m1 = clazz.getDeclaredMethod(tmpname);
Object result= m1.invoke(object);
ws.addCell(new Label(cellcount,i+1,String.valueOf(result)));
cellcount++;
}
}
}else {
if (tmarray==null||tmarray.contains(","+obj[j].getName()+",")) {
//java反射调用get方法获取对象里的值
String tmpname="get"+(obj[j].getName().substring(0, 1)).toUpperCase()+obj[j].getName().substring(1,obj[j].getName().length());
Object object= clazz.newInstance();
object = objData.get(i);
Method m1 = clazz.getDeclaredMethod(tmpname);
Object result= m1.invoke(object);
ws.addCell(new Label(cellcount,i+1,String.valueOf(result)));
cellcount++;
}
}
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} else {
//处理list<LinkedHashMap>
//循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
//转换成map集合{activyName:测试功能,count:2}
LinkedHashMap<String, Object> map = (LinkedHashMap<String, Object>)objData.get(i);
//循环输出map中的子集:既列值
int j=0;
for(Object o:map.keySet()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
ws.addCell(new Label(j,i+1,String.valueOf(map.get(o))));
j++;
}
}
}
}else{
flag = -1;
}
//写入Exel工作表
wwb.write();
//关闭Excel工作薄对象
wwb.close();
//关闭流
os.flush();
os.close();
os =null;
}
}catch (IllegalStateException e) {
System.err.println(e.getMessage());
}
catch (Exception ex) {
flag = 0;
ex.printStackTrace();
}
return flag;
}
/**
* 下载excel
* @author
* @param response
* @param filename 文件名 ,如:20110808.xls
* @param listData 数据源
* @param sheetName 表头名称
* @param key 列名称集合,如:{物品名称,数量,单价}
* @param clazz 传入实体的class (如果list里是linkedmap则传null)
* @param contantsClass 用于实体内包含实体的数组 (如果list里是linkedmap则传null,如果实体里没有包含的实体也传null)
* @param tmarray 以逗号间隔要包含导出的字段
*/
public static void exportexcle(HttpServletResponse response,String filename,List<?> listData,String sheetName,String[] key,Class clazz,Class[] contantsClass,String tmarray)
{
//调用上面的方法、生成Excel文件
response.setContentType("application/vnd.ms-excel");
//response.setHeader("Content-Disposition", "attachment;filename="+filename);
try {
response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");
exportToExcel(response, listData, sheetName, key ,clazz,contantsClass,tmarray);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String getEncoding(String str) {
String encode = "GB2312";
try {
if (str.equals(new String(str.getBytes(encode), encode))) {
String s = encode;
return s;
}
} catch (Exception exception) {
}
encode = "ISO-8859-1";
try {
if (str.equals(new String(str.getBytes(encode), encode))) {
String s1 = encode;
return s1;
}
} catch (Exception exception1) {
}
encode = "UTF-8";
try {
if (str.equals(new String(str.getBytes(encode), encode))) {
String s2 = encode;
return s2;
}
} catch (Exception exception2) {
}
encode = "GBK";
try {
if (str.equals(new String(str.getBytes(encode), encode))) {
String s3 = encode;
return s3;
}
} catch (Exception exception3) {
}
return "";
}
}

顺带下maven的依赖

1
2
3
4
5
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6</version>
</dependency>

文章目录