Excel动态导入导出

excel工具类

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * excel工具类
 *
 */
public class ExcelUtils {
	
	
	/**
	 * 下载excel文档到客户端
	 * @param response
	 * @param hw
	 */
	public static void uploadExcel(HttpServletResponse response,HSSFWorkbook hw) {
		
		ByteArrayOutputStream fos = null;
		byte[] retArr = null;
		
		try {
			fos = new ByteArrayOutputStream();
			hw.write(fos);
			retArr = fos.toByteArray();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			
			try {
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		
		OutputStream os = null;
		
		try {
			
			os = response.getOutputStream();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			response.reset();
			response.setHeader("Content-Disposition", "attachment; filename="+"excel"+".xls");//要保存的文件名
			response.setContentType("application/octet-stream; charset=utf-8");
			try {
				os.write(retArr);
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				os.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} finally {
			
			if (os != null) {
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
	}

	
	/**
     * 生成excel
     * @param data 数据集合
     * @param path 输出路径
     */
    public static HSSFWorkbook createExcel(String sheetName,String sheetTitleName,List<?> data) {

        // 创建workbook
        HSSFWorkbook wb = new HSSFWorkbook();

        // 创建sheet
        Sheet sheet = wb.createSheet(sheetName);

        // 创建表头行
        Row row = sheet.createRow(0);
        Cell oneCell = row.createCell(0);
        oneCell.setCellValue(sheetTitleName);
        
        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列  
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,9));
        
        // 创建单元格样式
        HSSFCellStyle style = wb.createCellStyle();

        // 获取实体所有属性
        Field[] fields = data.get(0).getClass().getDeclaredFields();
        
        // 列索引
        int index = 0;
        
        // 列名称
        String name = "";
        
        // 是否日期类型
        boolean isDate = false;
        
        // 转换的日期格式
        String dateFormat = "";
        
        ExcelAnnotation ExcelAnnotation;
        
        // 创建表头
        Row row1 = sheet.createRow(1);
        for (Field f : fields) {
            // 是否是注解
            if (f.isAnnotationPresent(ExcelAnnotation.class)) {
                // 获取注解
                ExcelAnnotation = f.getAnnotation(ExcelAnnotation.class);
                // 获取列索引
                index = ExcelAnnotation.columnIndex();
                // 列名称
                name = ExcelAnnotation.columnName();
                // 创建单元格
                creCell(row1, index, name, style);
            }
        }

        // 行索引  因为表头已经设置,索引行索引从2开始
        int rowIndex = 2;
        for (Object obj : data) {
            // 创建新行,索引加1,为创建下一行做准备
            row = sheet.createRow(rowIndex++);
            for (Field f : fields) {
                // 设置属性可访问
                f.setAccessible(true);
                // 判断是否是注解
                if (f.isAnnotationPresent(ExcelAnnotation.class)) {
                    // 获取注解
                    ExcelAnnotation = f.getAnnotation(ExcelAnnotation.class);
                    index = ExcelAnnotation.columnIndex();
                    isDate = ExcelAnnotation.isDate();
                    
                    try {
                    	// 创建单元格     f.get(obj)从obj对象中获取值设置到单元格中
                    	if(isDate) {
                    		dateFormat = ExcelAnnotation.dateFormat();
                    		creCell(row, index, UtilTools.getNewDateFormat((Date) f.get(obj),dateFormat), style);
                    	}else {
                    		creCell(row, index, String.valueOf(f.get(obj)), style);
                    	}
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        return wb;
        
    }
	
	
	/**
     * 生成excel文件直接保存到客户端指定文件夹下
     * @param data 数据集合
     * @param path 输出路径
     */
    public static void createExcelFile(String sheetName,String sheetTitleName,List<?> data, String path) {
    	File file = new File(path);

        // 创建workbook
        HSSFWorkbook wb = new HSSFWorkbook();

        // 创建sheet
        Sheet sheet = wb.createSheet(sheetName);

        // 创建表头行
        Row row = sheet.createRow(0);
        Cell oneCell = row.createCell(0);
        oneCell.setCellValue(sheetTitleName);
        
        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列  
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,9));
        
        // 创建单元格样式
        HSSFCellStyle style = wb.createCellStyle();

        // 获取实体所有属性
        Field[] fields = data.get(0).getClass().getDeclaredFields();
        
        // 列索引
        int index = 0;
        
        // 列名称
        String name = "";
        
		// 是否日期类型
        boolean isDate = false;
        
        // 转换的日期格式
        String dateFormat = "";

        ExcelAnnotation ExcelAnnotation;

        // 创建表头
        Row row1 = sheet.createRow(1);
        for (Field f : fields) {
            // 是否是注解
            if (f.isAnnotationPresent(ExcelAnnotation.class)) {
                // 获取注解
                ExcelAnnotation = f.getAnnotation(ExcelAnnotation.class);
                // 获取列索引
                index = ExcelAnnotation.columnIndex();
                // 列名称
                name = ExcelAnnotation.columnName();
                // 创建单元格
                creCell(row1, index, name, style);
            }
        }

        // 行索引  因为表头已经设置,索引行索引从2开始
        int rowIndex = 2;
        for (Object obj : data) {
            // 创建新行,索引加1,为创建下一行做准备
            row = sheet.createRow(rowIndex++);
            for (Field f : fields) {
                // 设置属性可访问
                f.setAccessible(true);
                // 判断是否是注解
                if (f.isAnnotationPresent(ExcelAnnotation.class)) {
                    // 获取注解
                    ExcelAnnotation = f.getAnnotation(ExcelAnnotation.class);
                  	index = ExcelAnnotation.columnIndex();
                    isDate = ExcelAnnotation.isDate();
                    
                    try {
                    	// 创建单元格     f.get(obj)从obj对象中获取值设置到单元格中
                    	if(isDate) {
                    		dateFormat = ExcelAnnotation.dateFormat();
                    		creCell(row, index, UtilTools.getNewDateFormat((Date) f.get(obj),dateFormat), style);
                    	}else {
                    		creCell(row, index, String.valueOf(f.get(obj)), style);
                    	}
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(file);
            wb.write(outputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

   


    
    /**
     * 读取excel文件,并把读取到的数据封装到clazz中
     * 
     * @param path
     *            文件路径
     * @param clazz
     *            实体类
     * @return 返回clazz集合
     */
    @SuppressWarnings("resource")
	public static <T extends Object> List<T> importExcelFile(String path, Class<T> clazz) {
        // 存储excel数据
        List<T> list = new ArrayList<T>();
        FileInputStream is = null;

        try {
            is = new FileInputStream(new File(path));
        } catch (FileNotFoundException e1) {
            throw new RuntimeException("文件路径异常");
        }

        Workbook wookbook = null;

        // 根据excel文件版本获取工作簿
        if (path.endsWith(".xls")) {
            wookbook = xls(is);
        } else if (path.endsWith(".xlsx")) {
            wookbook = xlsx(is);
        } else {
            throw new RuntimeException("文件出错,非excel文件");
        }

        // 得到一个工作表
        Sheet sheet = wookbook.getSheetAt(0);

        // 获取行总数
        int rows = sheet.getLastRowNum() + 1;

        Row row;

        // 获取类所有属性
        Field[] fields = clazz.getDeclaredFields();

        T obj = null;
        int coumnIndex = 0;
        Cell cell = null;
        ExcelAnnotation ExcelAnnotation = null;
        for (int i = 2; i < rows; i++) {
            // 获取excel行
            row = sheet.getRow(i);
            try {
                // 创建实体
                obj = clazz.newInstance();
                for (Field field : fields) {
                    // 设置属性可访问
                	field.setAccessible(true);
                    // 判断是否是注解
                    if (field.isAnnotationPresent(ExcelAnnotation.class)) {
                        // 获取注解
                        ExcelAnnotation = field.getAnnotation(ExcelAnnotation.class);
                        // 获取列索引
                        coumnIndex = ExcelAnnotation.columnIndex();
                        // 获取单元格
                        cell = row.getCell(coumnIndex);
                        
                        
                        /*设置cell值开始*/
                        switch (cell.getCellType()) {
                        //数值类型
                        case Cell.CELL_TYPE_NUMERIC:{
                            // Date类型
                            if ( HSSFDateUtil.isCellDateFormatted(cell) ){
                                Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                                if ( field.getType()==Date.class ) {//Date 类型接收 Date类型
                                    field.set ( obj,date );
                                }else if ( field.getType()==String.class ) {//String 类型 接收 Date类型
                                    try {
										field.set ( obj , new SimpleDateFormat("yyyy-MM-dd").parse(cell.getStringCellValue() ) );
									} catch (IllegalArgumentException e) {
										e.printStackTrace();
									} catch (ParseException e) {
										e.printStackTrace();
									}
                                }
                            } else { //纯数值
                                if ( field.getType()==Integer.class ) {//Integer 类型接收 纯数值
                                    String str = cell.toString();
                                    //去掉 结尾为.0的情况  正常小数 不会去掉有精度意义的小数
                                    if ( str!=null && !"".equals(str.trim()) ) {
                                        String []strs = str.split("\\.");
                                        if ( strs.length > 1 && "0".equals(strs[1]) ) {
                                            str=strs[0];
                                        }
                                    }
                                    field.set(obj, Integer.parseInt(str) ) ;
                                } else if ( field.getType()==String.class ) { //String 类型接收 纯数值
                                    field.set(obj,  String.valueOf( cell.getNumericCellValue() ) ) ;
                                }

                            }
                            break;
                        }
                        // 字符串类型
                        case Cell.CELL_TYPE_STRING : {
                            if ( field.getType() == Date.class ) { //Data类型接收String
                                Date date = null;
								try {
									date = new SimpleDateFormat("yyyy-MM-dd").parse(cell.getStringCellValue());
								} catch (ParseException e) {
									e.printStackTrace();
								}
                                field.set(obj,date);
                            } else if ( field.getType()==Integer.class ) { //Integer 类型接收 String
                                field.set(obj,Integer.parseInt(cell.getStringCellValue()));
                            } else {
                                field.set(obj,cell.getStringCellValue());
                            }
                            break;
                        }
                        //空值的情况 可以抛异常 也可以 设空值
                        case Cell.CELL_TYPE_BLANK : {
                            field.set(obj,null);
                            break;
                        }
                    }
                    /*设置cell值结束*/   
                        
                    }
                }
                // 添加到集合中
                list.add(obj);
            } catch (InstantiationException e1) {
                e1.printStackTrace();
            } catch (IllegalAccessException e1) {
                e1.printStackTrace();
            }

        }

        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
    
    
    
    /**
     * 创建单元格
     * 
     * @param row
     * @param c
     * @param cellValue
     * @param style
     */
    private static void creCell(Row row, int c, String cellValue, CellStyle style) {
        Cell cell = row.createCell(c);
        cell.setCellValue(cellValue);
        cell.setCellStyle(style);
    }
    
	/**
     * 对日期类型进行格式化
     * 
     * @param d
     * @param fmat
     */
    public static String getNewDateFormat(Date d,String fmat) {
		String newDate="";
		if(null!=d) {
			DateFormat df=new SimpleDateFormat(fmat);
			newDate=df.format(d);
		}
		return newDate;
	}
    
    /**
     * 对excel 2003处理
     */
    private static Workbook xls(InputStream is) {
        try {
            // 得到工作簿
            return new HSSFWorkbook(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对excel 2007处理
     */
    private static Workbook xlsx(InputStream is) {
        try {
            // 得到工作簿
            return new XSSFWorkbook(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
	
}

创建自定义注解

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 定义excel描述注解
 *
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelAnnotation {

	 /**
     * 列索引
     * @return
     */
    public int columnIndex() default 0;

    /**
     * 列名
     * @return
     */
    public String columnName() default "";

	/**
     * 是否日期类型
     * @return
     */
    public boolean isDate() default false;
      
    /**
     * 日期字符格式
     * @return
     */
	public String dateFormat() default "";
}

在需要导出的列上加自定义注解

public class UserBean {
	
	@ExcelAnnotation(columnIndex=0,columnName="序号")
	private Integer user_id;
	
	@ExcelAnnotation(columnIndex=1,columnName="部门id")
	private Integer dept_id;
	
	@ExcelAnnotation(columnIndex=2,columnName="用户名")
	private String user_account;
	
	@ExcelAnnotation(columnIndex=3,columnName="登录密码")
	private String user_password;
	@ExcelAnnotation(columnIndex=4,columnName="姓名")
	private String user_name;
	
	@ExcelAnnotation(columnIndex=5,columnName="头像")
	private String img;
	
	@ExcelAnnotation(columnIndex=6,columnName="年龄")
	private Integer user_age;
	
	@ExcelAnnotation(columnIndex=7,columnName="性别")
	private String user_sex;
	
	@ExcelAnnotation(columnIndex=8,columnName="地址")
	private String user_address;
	
	@ExcelAnnotation(columnIndex=9,columnName="生日",isDate=true,dateFormat="yyyy-MM-dd")
	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date user_birth;
	
	@ExcelAnnotation(columnIndex=10,columnName="电话")
	private String user_phone;
	
	@ExcelAnnotation(columnIndex=11,columnName="邮箱")
	private String email;
	
	@ExcelAnnotation(columnIndex=12,columnName="最后登录时间",isDate=true,dateFormat="yyyy-MM-dd hh:mm:ss")
	@DateTimeFormat(pattern="yyyy-MM-dd hh:mm:ss")
	private Date reg_time;
	
	private String dept_name;
	private String birthStr;
	private Integer role_id;
	private String mon;
	private int num;

导出excel

public void ExportUserList(HttpServletResponse response) {
		
		List<UserBean> userList = userDao.queryUserList();
		response.setContentType("text/html,charset=utf-8");
		HSSFWorkbook hw = ExcelUtils.createExcel("用户信息表","用户信息表",userList);
		//将excel的下载
		ExcelUtils.uploadExcel(response,hw);
	    	    
	}

导入excel

public Map<String,Object> importExcel(MultipartFile file) {
		Map<String,Object>map=new HashMap<String, Object>();
		String filename = file.getOriginalFilename();
		if(filename.endsWith(".xls") || filename.endsWith(".xlsx")) {
			String originUrl="D:\\excelTest";
			
			// 起个新名称,绝对不能重复 -> UUID : universe unique id
	        String uuid = UUID.randomUUID().toString();
	        
	        // 新名称
	        String newName = uuid + filename.substring(filename.lastIndexOf("."));
			String filePath = originUrl + "/" + newName;
			File f = new File(filePath);
			try {
				file.transferTo(f);
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		    int x=0,y=0,sum=0;
		    boolean flag=false;
			List<UserBean> userList = ExcelUtils.importExcelFile(filePath, UserBean.class);
			f.delete();
			y=userList.size();
			for(UserBean u : userList){
				List<UserBean> user=userDao.getUserByAccount(u.getUser_account());
				if(user!=null&&user.size()>0){
					x++;
				}else{
					int i=userDao.saveUser(u);
					sum+=i;
				}
			}
			if(sum==(y-x)){
				flag=true;
			}
			map.put("msg", "共有"+y+"条数据,成功导入"+sum+"条数据,登陆账号重名的数据有"+x+"条");
			map.put("flag", flag);
		}else {
			map.put("msg", "请上传正确格式的excel文档");
			map.put("flag", false);
		}
		return map;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值