java实现导出exl
Util工具类:NewExportToExcelUtil.java
package com.prison.util;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;import javax.servlet.http.HttpServletResponse;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;/*** 瀵煎嚭Excel* @author Guang**/
public class NewExportToExcelUtil {/*** 导出Excel* @param excelName 要导出的excel名称* @param list 要导出的数据集合* @param fieldMap 中英文字段对应Map,即要导出的excel表头* @param response 使用response可以导出到浏览器* @return*/public static void export(String excelName,List list,LinkedHashMap fieldMap,HttpServletResponse response){// 设置默认文件名为当前时间:年月日时分秒if (excelName==null || excelName=="") {excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();}// 设置response头信息response.reset();response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件try {response.setHeader("Content-disposition", "attachment; filename="+new String(excelName.getBytes("gb2312"), "ISO-8859-1") + ".xls");} catch (UnsupportedEncodingException e1) {System.out.println(e1.getMessage());}try {//创建一个WorkBook,对应一个Excel文件HSSFWorkbook wb=new HSSFWorkbook();//在Workbook中,创建一个sheet,对应Excel中的工作薄(sheet)HSSFSheet sheet=wb.createSheet(excelName);//创建单元格,并设置值表头 设置表头居中HSSFCellStyle style=wb.createCellStyle();//创建一个居中格式//style.setAlignment(HSSFCellStyle.s);// 填充工作表fillSheet(sheet,list,fieldMap,style);//将文件输出OutputStream ouputStream = response.getOutputStream();wb.write(ouputStream);ouputStream.flush();ouputStream.close();} catch (Exception e) {System.out.println("导出Excel失败!");System.out.println(e.getMessage());}}/*** 根据字段名获取字段对象** @param fieldName* 字段名* @param clazz* 包含该字段的类* @return 字段*/public static Field getFieldByName(String fieldName, Class> clazz) {System.out.println("根据字段名获取字段对象:getFieldByName()");// 拿到本类的所有字段Field[] selfFields = clazz.getDeclaredFields();// 如果本类中存在该字段,则返回for (Field field : selfFields) {//如果本类中存在该字段,则返回if (field.getName().equals(fieldName)) {return field;}}// 否则,查看父类中是否存在此字段,如果有则返回Class> superClazz = clazz.getSuperclass();if (superClazz != null && superClazz != Object.class) {//递归return getFieldByName(fieldName, superClazz);}// 如果本类和父类都没有,则返回空return null;}/*** 根据字段名获取字段值** @param fieldName 字段名* @param o 对象* @return 字段值* @throws Exception 异常* */public static Object getFieldValueByName(String fieldName, Object o)throws Exception {System.out.println("根据字段名获取字段值:getFieldValueByName()");Object value = null;//根据字段名得到字段对象Field field = getFieldByName(fieldName, o.getClass());//如果该字段存在,则取出该字段的值if (field != null) {field.setAccessible(true);//类中的成员变量为private,在类外边使用属性值,故必须进行此操作value = field.get(o);//获取当前对象中当前Field的value} else {throw new Exception(o.getClass().getSimpleName() + "类不存在字段名 "+ fieldName);}return value;}/*** 根据带路径或不带路径的属性名获取属性值,即接受简单属性名,* 如userName等,又接受带路径的属性名,如student.department.name等** @param fieldNameSequence 带路径的属性名或简单属性名* @param o 对象* @return 属性值* @throws Exception 异常* */public static Object getFieldValueByNameSequence(String fieldNameSequence,Object o) throws Exception {System.out.println("根据带路径或不带路径的属性名获取属性值,即接受简单属性名:getFieldValueByNameSequence()");Object value = null;// 将fieldNameSequence进行拆分String[] attributes = fieldNameSequence.split("\\.");if (attributes.length == 1) {value = getFieldValueByName(fieldNameSequence, o);} else {// 根据数组中第一个连接属性名获取连接属性对象,如student.department.nameObject fieldObj = getFieldValueByName(attributes[0], o);//截取除第一个属性名之后的路径String subFieldNameSequence = fieldNameSequence.substring(fieldNameSequence.indexOf(".") + 1);//递归得到最终的属性对象的值value = getFieldValueByNameSequence(subFieldNameSequence, fieldObj);}return value;}/*** 向工作表中填充数据** @param sheet* excel的工作表名称* @param list* 数据源* @param fieldMap* 中英文字段对应关系的Map* @param style* 表格中的格式* @throws Exception* 异常* */public static void fillSheet(HSSFSheet sheet, List list,LinkedHashMap fieldMap,HSSFCellStyle style) throws Exception {System.out.println("向工作表中填充数据:fillSheet()");// 定义存放英文字段名和中文字段名的数组String[] enFields = new String[fieldMap.size()];String[] cnFields = new String[fieldMap.size()];// 填充数组int count = 0;for (Entry entry : fieldMap.entrySet()) {enFields[count] = entry.getKey();cnFields[count] = entry.getValue();count++;}//在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制shortHSSFRow row=sheet.createRow((int)0);// 填充表头for (int i = 0; i < cnFields.length; i++) {HSSFCell cell=row.createCell(i);cell.setCellValue(cnFields[i]);cell.setCellStyle(style);sheet.autoSizeColumn(i);}// 填充内容for (int index = 0; index < list.size(); index++) {row = sheet.createRow(index + 1);// 获取单个对象T item = list.get(index);for (int i = 0; i < enFields.length; i++) {Object objValue = getFieldValueByNameSequence(enFields[i], item);String fieldValue = objValue == null ? "" : objValue.toString();row.createCell(i).setCellValue(fieldValue);}}}}
Pom文件导包:
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>3.6version>
dependency>
java代码:
//导出excel表格
@RequestMapping(value = "/item-excelAll")
public void excelAllItem(Consum consum,HttpServletResponse response,String archivesname,String consumid,String phone,String starttime,String endtime){
if(null!=archivesname && archivesname!= "") {
consum.setArchivesname(archivesname);
}
if(null!=consumid && consumid!= "") {
consum.setConsumid(consumid);
}
// 得到所要导出的数据
List
// 定义导出excel的名字
String excelName = "消费记录表";
// 获取需要转出的excle表头的map字段
LinkedHashMap
fieldMap.put("consumid", "订单号");
fieldMap.put("archivesname", "姓名");
fieldMap.put("phone", "手机号");
fieldMap.put("consumtime", "消费时间");
fieldMap.put("consummoney", "消费金额");
fieldMap.put("consumtype", "消费状态(0:待支付;1:已完成)");
// 调用工具类
NewExportToExcelUtil.export(excelName, consumlist, fieldMap, response);
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
