SpringBoot项目 导出查询结果(excel)
ClassUtil
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* @Author:
* @Date:
* @Description:关于类的操作的工具类
*/
public final class ClassUtil {
private ClassUtil() {
throw new Error("工具类不允许实例化!");
}
/**
* 获取类属性
* @param targetObj 要获取属性的类
* @return 含有类属性的集合
*/
public static Field[] getClassAttribute(Object targetObj){
Class<?> objectClass = targetObj.getClass();
return objectClass.getDeclaredFields();
}
/**
* 获取对象的所有get或set方法
* @param targetObj 要获取属性的类
* @param methodKeyword get或者set关键字
* @return 含有类get或set方法的集合
*/
public static List<Method> getMethod(Object targetObj,String methodKeyword){
List<Method> methodList = new ArrayList<>();
Class<?> objectClass = targetObj.getClass();
Field[] field = objectClass.getDeclaredFields();
for (int i = 0;i<field.length;i++){
//获取属性名并组装方法名
String fieldName = field[i].getName();
String getMethodName = methodKeyword
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Method method = objectClass.getMethod(getMethodName,new Class[]{
});
methodList.add(method);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return methodList;
}
/**
* 获取对象的所有get方法
* @param targetObj 要获取属性的类
* @return 含有类方法的集合
*/
public static List<Method> getMethodGet(Object targetObj){
return getMethod(targetObj,"get");
}
/**
* 获取对象的所有set方法
* @param targetObj 要获取属性的类
* @return 含有类方法的集合
*/
public static List<Method> getMethodSet(Object targetObj){
return getMethod(targetObj,"set");
}
}
Excel导出工具类:
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* @Author:
* @Date:
* @Description:Excel导出工具类,依赖于ClassUtil工具类
*/
public final class ExcelExport {
/**
* 将传入的数据导出excel表并下载
* @param response 返回的HttpServletResponse
* @param importlist 要导出的对象的集合
* @param attributeNames 含有每个对象属性在excel表中对应的标题字符串的数组(请按对象中属性排序调整字符串在数组中的位置)
* @param heardName 导出文件 标题名称
* @param cnt 合并单元格数 (一般标题字符串的数组长度-1)
*/
public static void export(HttpServletResponse response, List<?> importlist, String[] attributeNames,
String heardName, int cnt ) {
//获取数据集
List<?> datalist = importlist;
//声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
//生成一个表格
HSSFSheet sheet = workbook.createSheet();
//设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 18);
//用于设置表格字体
HSSFCellStyle style = workbook.createCellStyle();
//获取字段名数组
String[] tableAttributeName = attributeNames;
//获取对象属性
Field[] fields = ClassUtil.getClassAttribute(importlist.get(0));
//获取对象get方法
List<Method> methodList = ClassUtil.getMethodGet(importlist.get(0));
//设置标题样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
HSSFFont headerFont = workbook.createFont();
headerFont.setFontHeightInPoints((short) 14);
headerFont.setBold(true);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setFont(headerFont);
CellRangeAddress cra0 = new CellRangeAddress(0, 1, 0, cnt);// 合并单元格
sheet.addMergedRegion(cra0);
//创建标标题题
Row row = sheet.createRow(0);
Cell cell1 = row.createCell(0);
cell1.setCellValue(heardName);
cell1.setCellStyle(headerStyle);
// 设置字体样式
HSSFFont titleFont = workbook.createFont();
titleFont.setBold(true);
titleFont.setFontHeightInPoints((short) 10);
style.setFont(titleFont);
style.setAlignment(HorizontalAlignment.CENTER);
//循环字段名数组,创建标题行
row = sheet.createRow(2);
for (int j = 0; j< tableAttributeName.length; j++){
//创建列
Cell cell = row.createCell(j);
cell.setCellStyle(style);
//设置单元类型为String
cell.setCellType(CellType.STRING);
cell.setCellValue(transCellType(tableAttributeName[j]));
}
//创建普通行
for (int i = 0;i<datalist.size();i++){
//因为第一行已经用于创建标题行,故从第二行开始创建
row = sheet.createRow(i+3);
//如果是第一行就让其为标题行
Object targetObj = datalist.get(i);
for (int j = 0;j<fields.length;j++){
//创建列
Cell cell = row.createCell(j);
cell.setCellType(CellType.STRING);
//
try {
Object value = methodList.get(j).invoke(targetObj, new Object[]{
});
cell.setCellValue(transCellType(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
response.setContentType("application/octet-stream");
//默认Excel名称
response.setHeader("Content-Disposition", "attachment;fileName="+"test.xls");
try {
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
// response.flushBuffer();
// workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
private static String transCellType(Object value){
String str = null;
if (value instanceof Date){
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
str = sdf.format(date);
}else{
str = String.valueOf(value);
if (str == "null"){
str = "";
}
}
return str;
}
}
Controller:
/**
* 学生信息导出
*/
@RequestMapping(value = "api/url", method = RequestMethod.POST)
public void studentExprotExcel(HttpServletResponse response,@RequestBody StudentBean bean){
DataResult result = new DataResult();
//将查询到的数据导出
List<StudentExportBean> studentExportList= studentDao.studentExport(bean);
//创建一个数组用于设置表头
String[] arr = new String[]{
"年级","学号","姓名","专业","二级学院","联系方式","性别"};
String heardName="学生信息表";
//调用Excel导出工具类
ExcelExport.export(response,studentExportList,arr,heardName,6);
}