最近在做excel的导出,想用以前项目的模板,试了一下午都没用,所以只有从网上找了个基本的excel的导入的摸版,然后加入反射,我这个摸版是利用反射动态获取类对象,给excel中的表格赋值。以后可以作为工具类使用
(1)测试的代码
package com.zczy.demo.controller.test;
import com.zczy.demo.bean.User;
import com.zczy.demo.reflect.GetClassMethodValue;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<User> ls = new ArrayList<>();
User user1 = new User("1","3");
User user2 = new User("1","4");
ls.add(user1);
ls.add(user2);
try {
for(int i =0; i<ls.size(); i++){
GetClassMethodValue getClassMethodValue = new GetClassMethodValue(ls.get(i));
getClassMethodValue.getObjValueList();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.zczy.demo.reflect;
import lombok.Data;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class GetClassMethodValue<T> {
public Class clazz;
public Field[] fields;
public T t;
public GetClassMethodValue(T t) throws Exception {
this.t = t;
this.clazz = t.getClass();
//getDeclaredFields()返回Class中所有的字段,包括私有字段;
//getFields 只返回公共字段,即有public修饰的字段
this.fields = t.getClass().getDeclaredFields();
}
public void getObjValueList() throws Exception {
List<String> ls = new ArrayList<>();
List<Object> result = new ArrayList<>();
for (Field filed : fields){
String name = filed.getName();
// char[] tempChar = name.toCharArray();
// tempChar[0] -= 32;
// String tempStr ="get"+ String.valueOf(tempChar);
ls.add(name);
}
for(String str :ls){
//动态获取对应方法名的值
Field fieldName ;
fieldName = t.getClass().getDeclaredField(str);
//对private的属性的访问
fieldName.setAccessible(true);
Object o = fieldName.get(t);
System.out.println(o);
}
}
}
(2)项目中的代码
controller调用此方法,其中flag为可以选择excel中哪些字段不需要在excel中显示,其中实体类的字段顺序也要改一下,不需要的放到最后,虽然有点笨但是也可以用,现在对于反射学的没那么深入,其实应该可以用反射做(现在不想搞)
package com.im.open.open.util;
import org.apache.poi.hssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
public class ExcelUtils {
public static <T> void exportData(HttpServletResponse response, String title, List<T> ls,String [] headers,int flag) throws IOException {
String fileName=title + ".xls";
response.setContentType("application/excel");
response.setHeader("Content-disposition","attachment;filename=" + fileName +";filename*=utf-8''"+ URLEncoder.encode(fileName,"UTF-8"));
HSSFWorkbook workbook=new HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet();
int rowNum=0;
HSSFRow row=sheet.createRow(rowNum);
for (int i =0; i <headers.length;i++){
HSSFCell cell=row.createCell(i);
HSSFRichTextString text=new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
//添加数据
for(T t :ls){
rowNum++;
HSSFRow row1=sheet.createRow(rowNum);
try {
GetClassMethodValue tempVale = new GetClassMethodValue(t);
List<String> ls1 = tempVale.getObjValueList();
for(int i = 0; i < ls1.size() - flag; i++){
row1.createCell(i).setCellValue(ls1.get(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
workbook.write(response.getOutputStream());
}
}
(2)利用反射动态获取类对象
package com.im.open.open.util;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class GetClassMethodValue <T> {
public Class clazz;
public Field[] fields;
public T t;
public GetClassMethodValue(T t) throws Exception {
this.t = t;
this.clazz = t.getClass();
//getDeclaredFields()返回Class中所有的字段,包括私有字段;
//getFields 只返回公共字段,即有public修饰的字段
this.fields = t.getClass().getDeclaredFields();
}
public List<String> getObjValueList() throws Exception {
List<String> ls = new ArrayList<>();
List<String> result = new ArrayList<>();
for (Field filed : fields){
String name = filed.getName();
ls.add(name);
}
for(String str :ls){
//动态获取对应方法名的值
Field fieldName ;
fieldName = t.getClass().getDeclaredField(str);
//对private的属性的访问
fieldName.setAccessible(true);
Object o = fieldName.get(t);
result.add(o.toString());
}
return result;
}
}