以前excel使用的都是poi但是在使用过程中比较麻烦,上次做一个项目,发现一个很好用的工具们今天分享给大家。
1、使用Easypoi,免费开源是国内开发的,中文文档看起来比较方便,这个我就不评论了,大家上官网看看。
官网地址:http://easypoi.mydoc.io/#text_173307
2、这个是重点,也是我们项目中使用到的。这个Excle导出工具不知是哪位大神写的,我只是分享。
引入pom:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version>
</dependency>

复制一下代码到项目:
新建你要导出的实体类:

/*** Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.*/
package com.newtouch.modules.mba.entity;import org.hibernate.validator.constraints.Length;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import javax.validation.constraints.NotNull;import com.newtouch.common.persistence.DataEntity;
import com.newtouch.common.utils.excel.annotation.ExcelField;/*** 在线报名提交学员信息Entity* @author long.zhou* @version 2016-08-04*/
public class ApplyOnline extends DataEntity<ApplyOnline> {private static final long serialVersionUID = 1L;private String name;       // 学生姓名private String sex;      // 性别private String nation;     // 民族private String politicsStatus;     // 政治面貌private String nativePlace;      // 籍贯private String maritalStatus;      // 婚姻状况private Date birthday;       // 生日private String identityCard;       // 身份证号private String address;      // 通讯地址private String postcode;     // 邮编private String telephone;      // 固定电话private String mobilephone;      // 移动电话private String email;        // 电子油箱private String studyMode;        // 学习形式private String school;       // 毕业院校private String major;        // 毕业专业private Date graduationDate;     // 毕业时间private String diploma;      // 学历private String graduationCertificateId;        // 毕业证号private String company;      // 工作单位private String job;      // 工作岗位private String yearsOfWorking;       // 工作年限private String yearsOfManage;        // 管理岗位年限private String workingExperience;      // 工作经验private String emergencyContactName;     // 紧急联系人姓名private String emergencyContactPhone;     // 紧急联系人电话private String studyLocation;     // 就读教学点private Date applytime;     //提交时间private String project;       //报名项目private String photo;     //照片路径private String file;      //附件路径private String flag;      //用于学生信息查询过渡参数private String qc;            //用于学生信息查询过渡参数private String interviewtimes;//面试批次private String bDate;     //简历预览生日private String gDate;       //简历预览毕业时间private Date startDate;private Date endDate;public ApplyOnline() {super();}public ApplyOnline(String id){super(id);}@Length(min=1, max=20, message="学生姓名长度必须介于 1 和 20 之间")@ExcelField(title="考生姓名", type=1, align=2, sort=1)public String getName() {return name;}public void setName(String name) {this.name = name;}@Length(min=1, max=5, message="性别长度必须介于 1 和 5 之间")@ExcelField(title="性别", type=1, align=2, sort=2)public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Length(min=1, max=20, message="民族长度必须介于 1 和 20 之间")@ExcelField(title="民族", type=1, align=2, sort=3)public String getNation() {return nation;}public void setNation(String nation) {this.nation = nation;}@Length(min=1, max=20, message="政治面貌长度必须介于 1 和 20 之间")@ExcelField(title="政治面貌", type=1, align=2, sort=4)public String getPoliticsStatus() {return politicsStatus;}public void setPoliticsStatus(String politicsStatus) {this.politicsStatus = politicsStatus;}@Length(min=1, max=20, message="籍贯长度必须介于 1 和 20 之间")@ExcelField(title="籍贯", type=1, align=2, sort=5)public String getNativePlace() {return nativePlace;}public void setNativePlace(String nativePlace) {this.nativePlace = nativePlace;}@Length(min=1, max=10, message="婚姻状况长度必须介于 1 和 10 之间")@ExcelField(title="婚姻状况", type=1, align=2, sort=6)public String getMaritalStatus() {return maritalStatus;}public void setMaritalStatus(String maritalStatus) {this.maritalStatus = maritalStatus;}@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@NotNull(message="生日不能为空")@ExcelField(title="生日", type=1, align=2, sort=7)public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Length(min=1, max=20, message="身份证号长度必须介于 1 和 20 之间")@ExcelField(title="身份证号", type=1, align=2, sort=8)public String getIdentityCard() {return identityCard;}public void setIdentityCard(String identityCard) {this.identityCard = identityCard;}@Length(min=1, max=100, message="通讯地址长度必须介于 1 和 100 之间")@ExcelField(title="通讯地址", type=1, align=2, sort=9)public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Length(min=1, max=20, message="邮编长度必须介于 1 和 20 之间")@ExcelField(title="邮编", type=1, align=2, sort=10)public String getPostcode() {return postcode;}public void setPostcode(String postcode) {this.postcode = postcode;}@Length(min=1, max=20, message="固定电话长度必须介于 1 和 20 之间")@ExcelField(title="固定电话", type=1, align=2, sort=11)public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}@Length(min=1, max=20, message="移动电话长度必须介于 1 和 20 之间")@ExcelField(title="移动电话", type=1, align=2, sort=12)public String getMobilephone() {return mobilephone;}public void setMobilephone(String mobilephone) {this.mobilephone = mobilephone;}@ExcelField(title="电子邮箱", type=1, align=2, sort=13)public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Length(min=1, max=20, message="学习形式长度必须介于 1 和 20 之间")@ExcelField(title="学习形式", type=1, align=2, sort=14)public String getStudyMode() {return studyMode;}public void setStudyMode(String studyMode) {this.studyMode = studyMode;}@Length(min=1, max=20, message="毕业院校长度必须介于 1 和 20 之间")@ExcelField(title="毕业院校", type=1, align=2, sort=15)public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}@Length(min=1, max=20, message="毕业专业长度必须介于 1 和 20 之间")@ExcelField(title="毕业专业", type=1, align=2, sort=16)public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@NotNull(message="毕业时间不能为空")@ExcelField(title="毕业时间", type=1, align=2, sort=17)public Date getGraduationDate() {return graduationDate;}public void setGraduationDate(Date graduationDate) {this.graduationDate = graduationDate;}@Length(min=1, max=20, message="学历长度必须介于 1 和 20 之间")@ExcelField(title="学历", type=1, align=2, sort=18)public String getDiploma() {return diploma;}public void setDiploma(String diploma) {this.diploma = diploma;}@Length(min=1, max=30, message="毕业证号长度必须介于 1 和 30 之间")@ExcelField(title="毕业证号", type=1, align=2, sort=19)public String getGraduationCertificateId() {return graduationCertificateId;}public void setGraduationCertificateId(String graduationCertificateId) {this.graduationCertificateId = graduationCertificateId;}@Length(min=1, max=20, message="工作单位长度必须介于 1 和 20 之间")@ExcelField(title="工作单位", type=1, align=2, sort=20)public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}@Length(min=1, max=20, message="工作岗位长度必须介于 1 和 20 之间")@ExcelField(title="工作岗位", type=1, align=2, sort=21)public String getJob() {return job;}public void setJob(String job) {this.job = job;}@Length(min=1, max=10, message="工作年限长度必须介于 1 和 10 之间")@ExcelField(title="工作年限", type=1, align=2, sort=22)public String getYearsOfWorking() {return yearsOfWorking;}public void setYearsOfWorking(String yearsOfWorking) {this.yearsOfWorking = yearsOfWorking;}@Length(min=1, max=10, message="管理岗位年限长度必须介于 1 和 10 之间")@ExcelField(title="管理岗位年限", type=1, align=2, sort=23)public String getYearsOfManage() {return yearsOfManage;}public void setYearsOfManage(String yearsOfManage) {this.yearsOfManage = yearsOfManage;}@Length(min=1, max=300, message="工作经验长度必须介于 1 和 300 之间")@ExcelField(title="工作经验", type=1, align=2, sort=24)public String getWorkingExperience() {return workingExperience;}public void setWorkingExperience(String workingExperience) {this.workingExperience = workingExperience;}@Length(min=1, max=10, message="紧急联系人姓名长度必须介于 1 和 10 之间")@ExcelField(title="紧急联系人姓名", type=1, align=2, sort=25)public String getEmergencyContactName() {return emergencyContactName;}public void setEmergencyContactName(String emergencyContactName) {this.emergencyContactName = emergencyContactName;}@Length(min=1, max=20, message="紧急联系人电话长度必须介于 1 和 20 之间")@ExcelField(title="紧急联系人电话", type=1, align=2, sort=26)public String getEmergencyContactPhone() {return emergencyContactPhone;}public void setEmergencyContactPhone(String emergencyContactPhone) {this.emergencyContactPhone = emergencyContactPhone;}@Length(min=1, max=10, message="就读教学点长度必须介于 1 和 10 之间")@ExcelField(title="就读教学点", type=1, align=2, sort=27)public String getStudyLocation() {return studyLocation;}public void setStudyLocation(String studyLocation) {this.studyLocation = studyLocation;}@Length(min=1, max=20, message="面試批次在1到20之間")@ExcelField(title="考生面試批次", type=1, align=2, sort=28)public String getinterviewtimes() {return interviewtimes;}public void setinterviewtimes(String interviewtimes) {this.interviewtimes = interviewtimes;}@ExcelField(title="提交报名时间", type=1, align=2, sort=29)public Date getApplytime() {return applytime;}public void setApplytime(Date applytime) {this.applytime = applytime;}public Date getStartDate() {return startDate;}public void setStartDate(Date startDate) {this.startDate = startDate;}public Date getEndDate() {return endDate;}public void setEndDate(Date endDate) {this.endDate = endDate;}@ExcelField(title="报名项目", type=1, align=2, sort=30)public String getProject() {return project;}public void setProject(String project) {this.project = project;}public String getPhoto() {return photo;}public void setPhoto(String photo) {this.photo = photo;}/*** @return the file*/public String getFile() {return file;}/*** @param file the file to set*/public void setFile(String file) {this.file = file;}/*** @return the flag*/public String getFlag() {return flag;}/*** @param flag the flag to set*/public void setFlag(String flag) {this.flag = flag;}/*** @return the qc*/public String getQc() {return qc;}/*** @param qc the qc to set*/public void setQc(String qc) {this.qc = qc;}public String getbDate() {return bDate;}public void setbDate(String bDate) {this.bDate = bDate;}public String getgDate() {return gDate;}public void setgDate(String gDate) {this.gDate = gDate;}
}

新建注解:

/*** Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.*/
package com.newtouch.common.utils.excel.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Excel注解定义* @author ThinkGem* @version 2013-03-10*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField {/*** 导出字段名(默认调用当前字段的“get”方法,如指定导出字段为对象,请填写“对象名.对象属性”,例:“area.name”、“office.name”)*/String value() default "";/*** 导出字段标题(需要添加批注请用“**”分隔,标题**批注,仅对导出模板有效)*/String title();/*** 字段类型(0:导出导入;1:仅导出;2:仅导入)*/int type() default 0;/*** 导出字段对齐方式(0:自动;1:靠左;2:居中;3:靠右)*/int align() default 0;/*** 导出字段字段排序(升序)*/int sort() default 0;/*** 如果是字典类型,请设置字典的type值*/String dictType() default "";/*** 反射类型*/Class<?> fieldType() default Class.class;/*** 字段归属组(根据分组导出导入)*/int[] groups() default {};
}

导出excle的文件工具类

/*** Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.*/
package com.newtouch.common.utils.excel;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
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.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.google.common.collect.Lists;
import com.newtouch.common.utils.Encodes;
import com.newtouch.common.utils.Reflections;
import com.newtouch.common.utils.excel.annotation.ExcelField;
import com.newtouch.modules.sys.utils.DictUtils;/*** 导出Excel文件(导出“XLSX”格式,支持大数据量导出   @see org.apache.poi.ss.SpreadsheetVersion)* @author ThinkGem* @version 2013-04-21*/
public class ExportExcel {public static int index = 1;private static Logger log = LoggerFactory.getLogger(ExportExcel.class);/*** 工作薄对象*/private SXSSFWorkbook wb;/*** 工作表对象*/private Sheet sheet;/*** 样式列表*/private Map<String, CellStyle> styles;/*** 当前行号*/private int rownum;/*** 注解列表(Object[]{ ExcelField, Field/Method })*/List<Object[]> annotationList = Lists.newArrayList();/*** 构造函数* @param title 表格标题,传“空值”,表示无标题* @param cls 实体对象,通过annotation.ExportField获取标题*/public ExportExcel(String title, Class<?> cls){this(title, cls, 1);index = 1;}/*** 构造函数* @param title 表格标题,传“空值”,表示无标题* @param cls 实体对象,通过annotation.ExportField获取标题* @param type 导出类型(1:导出数据;2:导出模板)* @param groups 导入分组*/public ExportExcel(String title, Class<?> cls, int type, int... groups){// Get annotation field Field[] fs = cls.getDeclaredFields();for (Field f : fs){ExcelField ef = f.getAnnotation(ExcelField.class);if (ef != null && (ef.type()==0 || ef.type()==type)){if (groups!=null && groups.length>0){boolean inGroup = false;for (int g : groups){if (inGroup){break;}for (int efg : ef.groups()){if (g == efg){inGroup = true;annotationList.add(new Object[]{ef, f});break;}}}}else{annotationList.add(new Object[]{ef, f});}}}// Get annotation methodMethod[] ms = cls.getDeclaredMethods();for (Method m : ms){ExcelField ef = m.getAnnotation(ExcelField.class);if (ef != null && (ef.type()==0 || ef.type()==type)){if (groups!=null && groups.length>0){boolean inGroup = false;for (int g : groups){if (inGroup){break;}for (int efg : ef.groups()){if (g == efg){inGroup = true;annotationList.add(new Object[]{ef, m});break;}}}}else{annotationList.add(new Object[]{ef, m});}}}// Field sortingCollections.sort(annotationList, new Comparator<Object[]>() {public int compare(Object[] o1, Object[] o2) {return new Integer(((ExcelField)o1[0]).sort()).compareTo(new Integer(((ExcelField)o2[0]).sort()));};});// InitializeList<String> headerList = Lists.newArrayList();for (Object[] os : annotationList){String t = ((ExcelField)os[0]).title();// 如果是导出,则去掉注释if (type==1){String[] ss = StringUtils.split(t, "**", 2);if (ss.length==2){t = ss[0];}}headerList.add(t);}initialize(title, headerList);}/*** 构造函数* @param title 表格标题,传“空值”,表示无标题* @param headers 表头数组*/public ExportExcel(String title, String[] headers) {initialize(title, Lists.newArrayList(headers));}/*** 构造函数* @param title 表格标题,传“空值”,表示无标题* @param headerList 表头列表*/public ExportExcel(String title, List<String> headerList) {initialize(title, headerList);}/*** 初始化函数* @param title 表格标题,传“空值”,表示无标题* @param headerList 表头列表*/private void initialize(String title, List<String> headerList) {this.wb = new SXSSFWorkbook(500);this.sheet = wb.createSheet("Export");this.styles = createStyles(wb);// Create titleif (StringUtils.isNotBlank(title)){Row titleRow = sheet.createRow(rownum++);titleRow.setHeightInPoints(30);Cell titleCell = titleRow.createCell(0);titleCell.setCellStyle(styles.get("title"));titleCell.setCellValue(title);sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(),titleRow.getRowNum(), titleRow.getRowNum(), headerList.size()-1));}// Create headerif (headerList == null){throw new RuntimeException("headerList not null!");}Row headerRow = sheet.createRow(rownum++);headerRow.setHeightInPoints(16);for (int i = 0; i < headerList.size(); i++) {Cell cell = headerRow.createCell(i);cell.setCellStyle(styles.get("header"));String[] ss = StringUtils.split(headerList.get(i), "**", 2);if (ss.length==2){cell.setCellValue(ss[0]);Comment comment = this.sheet.createDrawingPatriarch().createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));comment.setString(new XSSFRichTextString(ss[1]));cell.setCellComment(comment);}else{cell.setCellValue(headerList.get(i));}sheet.autoSizeColumn(i);}for (int i = 0; i < headerList.size(); i++) {  int colWidth = sheet.getColumnWidth(i)*2;sheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);  }log.debug("Initialize success.");}/*** 创建表格样式* @param wb 工作薄对象* @return 样式列表*/private Map<String, CellStyle> createStyles(Workbook wb) {Map<String, CellStyle> styles = new HashMap<String, CellStyle>();CellStyle style = wb.createCellStyle();style.setAlignment(CellStyle.ALIGN_CENTER);style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);Font titleFont = wb.createFont();titleFont.setFontName("Arial");titleFont.setFontHeightInPoints((short) 16);titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);style.setFont(titleFont);styles.put("title", style);style = wb.createCellStyle();style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);style.setBorderRight(CellStyle.BORDER_THIN);style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderLeft(CellStyle.BORDER_THIN);style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderTop(CellStyle.BORDER_THIN);style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderBottom(CellStyle.BORDER_THIN);style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());Font dataFont = wb.createFont();dataFont.setFontName("Arial");dataFont.setFontHeightInPoints((short) 10);style.setFont(dataFont);styles.put("data", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(CellStyle.ALIGN_LEFT);styles.put("data1", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(CellStyle.ALIGN_CENTER);styles.put("data2", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(CellStyle.ALIGN_RIGHT);styles.put("data3", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));
//      style.setWrapText(true);style.setAlignment(CellStyle.ALIGN_CENTER);style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);Font headerFont = wb.createFont();headerFont.setFontName("Arial");headerFont.setFontHeightInPoints((short) 10);headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);headerFont.setColor(IndexedColors.WHITE.getIndex());style.setFont(headerFont);styles.put("header", style);return styles;}/*** 添加一行* @return 行对象*/public Row addRow(){return sheet.createRow(rownum++);}/*** 添加一个单元格* @param row 添加的行* @param column 添加列号* @param val 添加值* @return 单元格对象*/public Cell addCell(Row row, int column, Object val){return this.addCell(row, column, val, 0, Class.class);}/*** 添加一个单元格* @param row 添加的行* @param column 添加列号* @param val 添加值* @param align 对齐方式(1:靠左;2:居中;3:靠右)* @return 单元格对象*/public Cell addCell(Row row, int column, Object val, int align, Class<?> fieldType){Cell cell = row.createCell(column);CellStyle style = styles.get("data"+(align>=1&&align<=3?align:""));try {if (val == null){cell.setCellValue("");} else if (val instanceof String) {cell.setCellValue((String) val);} else if (val instanceof Integer) {cell.setCellValue((Integer) val);} else if (val instanceof Long) {cell.setCellValue((Long) val);} else if (val instanceof Double) {cell.setCellValue((Double) val);} else if (val instanceof Float) {cell.setCellValue((Float) val);} else if (val instanceof Date) {DataFormat format = wb.createDataFormat();style.setDataFormat(format.getFormat("yyyy-MM-dd"));cell.setCellValue((Date) val);} else {if (fieldType != Class.class){cell.setCellValue((String)fieldType.getMethod("setValue", Object.class).invoke(null, val));}else{cell.setCellValue((String)Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), "fieldtype."+val.getClass().getSimpleName()+"Type")).getMethod("setValue", Object.class).invoke(null, val));}}} catch (Exception ex) {log.info("Set cell value ["+row.getRowNum()+","+column+"] error: " + ex.toString());cell.setCellValue(val.toString());}cell.setCellStyle(style);return cell;}/*** 添加数据(通过annotation.ExportField添加数据)* @return list 数据列表*/public <E> ExportExcel setDataList(List<E> list){for (E e : list){int colunm = 0;Row row = this.addRow();StringBuilder sb = new StringBuilder();for (Object[] os : annotationList){ExcelField ef = (ExcelField)os[0];Object val = null;// Get entity valuetry{if (StringUtils.isNotBlank(ef.value())){val = Reflections.invokeGetter(e, ef.value());}else{if (os[1] instanceof Field){val = Reflections.invokeGetter(e, ((Field)os[1]).getName());}else if (os[1] instanceof Method){val = Reflections.invokeMethod(e, ((Method)os[1]).getName(), new Class[] {}, new Object[] {});}}// If is dict, get dict labelif (StringUtils.isNotBlank(ef.dictType())){val = DictUtils.getDictLabel(val==null?"":val.toString(), ef.dictType(), "");}}catch(Exception ex) {// Failure to ignorelog.info(ex.toString());val = "";}this.addCell(row, colunm++, val, ef.align(), ef.fieldType());sb.append(val + ", ");}log.debug("Write success: ["+row.getRowNum()+"] "+sb.toString());}return this;}/*** 输出数据流* @param os 输出数据流*/public ExportExcel write(OutputStream os) throws IOException{wb.write(os);return this;}/*** 输出到客户端* @param fileName 输出文件名*/public ExportExcel write(HttpServletResponse response, String fileName) throws IOException{response.reset();response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Content-Disposition", "attachment; filename="+Encodes.urlEncode(fileName));write(response.getOutputStream());return this;}/*** 输出到文件* @param fileName 输出文件名*/public ExportExcel writeFile(String name) throws FileNotFoundException, IOException{FileOutputStream os = new FileOutputStream(name);this.write(os);return this;}/*** 清理临时文件*/public ExportExcel dispose(){wb.dispose();return this;}//    /**
//   * 导出测试
//   */
//  public static void main(String[] args) throws Throwable {
//
//      List<String> headerList = Lists.newArrayList();
//      for (int i = 1; i <= 10; i++) {
//          headerList.add("表头"+i);
//      }
//
//      List<String> dataRowList = Lists.newArrayList();
//      for (int i = 1; i <= headerList.size(); i++) {
//          dataRowList.add("数据"+i);
//      }
//
//      List<List<String>> dataList = Lists.newArrayList();
//      for (int i = 1; i <=1000000; i++) {
//          dataList.add(dataRowList);
//      }
//
//      ExportExcel ee = new ExportExcel("表格标题", headerList);
//
//      for (int i = 0; i < dataList.size(); i++) {
//          Row row = ee.addRow();
//          for (int j = 0; j < dataList.get(i).size(); j++) {
//              ee.addCell(row, j, dataList.get(i).get(j));
//          }
//      }
//
//      ee.writeFile("target/export.xlsx");
//
//      ee.dispose();
//
//      log.debug("Export success.");
//
//  }}

导入excel的工具类

/*** Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.*/
package com.newtouch.common.utils.excel;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;import com.google.common.collect.Lists;
import com.newtouch.common.utils.Reflections;
import com.newtouch.common.utils.excel.annotation.ExcelField;
import com.newtouch.modules.sys.utils.DictUtils;/*** 导入Excel文件(支持“XLS”和“XLSX”格式)* @author ThinkGem* @version 2013-03-10*/
public class ImportExcel {private static Logger log = LoggerFactory.getLogger(ImportExcel.class);/*** 工作薄对象*/private Workbook wb;/*** 工作表对象*/private Sheet sheet;/*** 标题行号*/private int headerNum;/*** 构造函数* @param path 导入文件,读取第一个工作表* @param headerNum 标题行号,数据行号=标题行号+1* @throws InvalidFormatException * @throws IOException */public ImportExcel(String fileName, int headerNum) throws InvalidFormatException, IOException {this(new File(fileName), headerNum);}/*** 构造函数* @param path 导入文件对象,读取第一个工作表* @param headerNum 标题行号,数据行号=标题行号+1* @throws InvalidFormatException * @throws IOException */public ImportExcel(File file, int headerNum) throws InvalidFormatException, IOException {this(file, headerNum, 0);}/*** 构造函数* @param path 导入文件* @param headerNum 标题行号,数据行号=标题行号+1* @param sheetIndex 工作表编号* @throws InvalidFormatException * @throws IOException */public ImportExcel(String fileName, int headerNum, int sheetIndex) throws InvalidFormatException, IOException {this(new File(fileName), headerNum, sheetIndex);}/*** 构造函数* @param path 导入文件对象* @param headerNum 标题行号,数据行号=标题行号+1* @param sheetIndex 工作表编号* @throws InvalidFormatException * @throws IOException */public ImportExcel(File file, int headerNum, int sheetIndex) throws InvalidFormatException, IOException {this(file.getName(), new FileInputStream(file), headerNum, sheetIndex);}/*** 构造函数* @param file 导入文件对象* @param headerNum 标题行号,数据行号=标题行号+1* @param sheetIndex 工作表编号* @throws InvalidFormatException * @throws IOException */public ImportExcel(MultipartFile multipartFile, int headerNum, int sheetIndex) throws InvalidFormatException, IOException {this(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), headerNum, sheetIndex);}/*** 构造函数* @param path 导入文件对象* @param headerNum 标题行号,数据行号=标题行号+1* @param sheetIndex 工作表编号* @throws InvalidFormatException * @throws IOException */public ImportExcel(String fileName, InputStream is, int headerNum, int sheetIndex) throws InvalidFormatException, IOException {if (StringUtils.isBlank(fileName)){throw new RuntimeException("导入文档为空!");}else if(fileName.toLowerCase().endsWith("xls")){    this.wb = new HSSFWorkbook(is);    }else if(fileName.toLowerCase().endsWith("xlsx")){  this.wb = new XSSFWorkbook(is);}else{  throw new RuntimeException("文档格式不正确!");}  if (this.wb.getNumberOfSheets()<sheetIndex){throw new RuntimeException("文档中没有工作表!");}this.sheet = this.wb.getSheetAt(sheetIndex);this.headerNum = headerNum;log.debug("Initialize success.");}/*** 获取行对象* @param rownum* @return*/public Row getRow(int rownum){return this.sheet.getRow(rownum);}/*** 获取数据行号* @return*/public int getDataRowNum(){return headerNum+1;}/*** 获取最后一个数据行号* @return*/public int getLastDataRowNum(){return this.sheet.getLastRowNum()+headerNum;}/*** 获取最后一个列号* @return*/public int getLastCellNum(){return this.getRow(headerNum).getLastCellNum();}/*** 获取单元格值* @param row 获取的行* @param column 获取单元格列号* @return 单元格值*/public Object getCellValue(Row row, int column){Object val = "";try{Cell cell = row.getCell(column);if (cell != null){if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC){val = cell.getNumericCellValue();}else if (cell.getCellType() == Cell.CELL_TYPE_STRING){val = cell.getStringCellValue();}else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA){val = cell.getCellFormula();}else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){val = cell.getBooleanCellValue();}else if (cell.getCellType() == Cell.CELL_TYPE_ERROR){val = cell.getErrorCellValue();}}}catch (Exception e) {return val;}return val;}/*** 获取导入数据列表* @param cls 导入对象类型* @param groups 导入分组*/public <E> List<E> getDataList(Class<E> cls, int... groups) throws InstantiationException, IllegalAccessException{List<Object[]> annotationList = Lists.newArrayList();// Get annotation field Field[] fs = cls.getDeclaredFields();for (Field f : fs){ExcelField ef = f.getAnnotation(ExcelField.class);if (ef != null && (ef.type()==0 || ef.type()==2)){if (groups!=null && groups.length>0){boolean inGroup = false;for (int g : groups){if (inGroup){break;}for (int efg : ef.groups()){if (g == efg){inGroup = true;annotationList.add(new Object[]{ef, f});break;}}}}else{annotationList.add(new Object[]{ef, f});}}}// Get annotation methodMethod[] ms = cls.getDeclaredMethods();for (Method m : ms){ExcelField ef = m.getAnnotation(ExcelField.class);if (ef != null && (ef.type()==0 || ef.type()==2)){if (groups!=null && groups.length>0){boolean inGroup = false;for (int g : groups){if (inGroup){break;}for (int efg : ef.groups()){if (g == efg){inGroup = true;annotationList.add(new Object[]{ef, m});break;}}}}else{annotationList.add(new Object[]{ef, m});}}}// Field sortingCollections.sort(annotationList, new Comparator<Object[]>() {public int compare(Object[] o1, Object[] o2) {return new Integer(((ExcelField)o1[0]).sort()).compareTo(new Integer(((ExcelField)o2[0]).sort()));};});//log.debug("Import column count:"+annotationList.size());// Get excel dataList<E> dataList = Lists.newArrayList();for (int i = this.getDataRowNum(); i < this.getLastDataRowNum(); i++) {E e = (E)cls.newInstance();int column = 0;Row row = this.getRow(i);StringBuilder sb = new StringBuilder();for (Object[] os : annotationList){Object val = this.getCellValue(row, column++);if (val != null){ExcelField ef = (ExcelField)os[0];// If is dict type, get dict valueif (StringUtils.isNotBlank(ef.dictType())){val = DictUtils.getDictValue(val.toString(), ef.dictType(), "");//log.debug("Dictionary type value: ["+i+","+colunm+"] " + val);}// Get param type and type castClass<?> valType = Class.class;if (os[1] instanceof Field){valType = ((Field)os[1]).getType();}else if (os[1] instanceof Method){Method method = ((Method)os[1]);if ("get".equals(method.getName().substring(0, 3))){valType = method.getReturnType();}else if("set".equals(method.getName().substring(0, 3))){valType = ((Method)os[1]).getParameterTypes()[0];}}//log.debug("Import value type: ["+i+","+column+"] " + valType);try {if (valType == String.class){String s = String.valueOf(val.toString());if(StringUtils.endsWith(s, ".0")){val = StringUtils.substringBefore(s, ".0");}else{val = String.valueOf(val.toString());}}else if (valType == Integer.class){val = Double.valueOf(val.toString()).intValue();}else if (valType == Long.class){val = Double.valueOf(val.toString()).longValue();}else if (valType == Double.class){val = Double.valueOf(val.toString());}else if (valType == Float.class){val = Float.valueOf(val.toString());}else if (valType == Date.class){val = DateUtil.getJavaDate((Double)val);}else{if (ef.fieldType() != Class.class){val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());}else{val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString());}}} catch (Exception ex) {log.info("Get cell value ["+i+","+column+"] error: " + ex.toString());val = null;}// set entity valueif (os[1] instanceof Field){Reflections.invokeSetter(e, ((Field)os[1]).getName(), val);}else if (os[1] instanceof Method){String mthodName = ((Method)os[1]).getName();if ("get".equals(mthodName.substring(0, 3))){mthodName = "set"+StringUtils.substringAfter(mthodName, "get");}Reflections.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val});}}sb.append(val+", ");}dataList.add(e);log.debug("Read success: ["+i+"] "+sb.toString());}return dataList;}//   /**
//   * 导入测试
//   */
//  public static void main(String[] args) throws Throwable {
//
//      ImportExcel ei = new ImportExcel("target/export.xlsx", 1);
//
//      for (int i = ei.getDataRowNum(); i < ei.getLastDataRowNum(); i++) {
//          Row row = ei.getRow(i);
//          for (int j = 0; j < ei.getLastCellNum(); j++) {
//              Object val = ei.getCellValue(row, j);
//              System.out.print(val+", ");
//          }
//          System.out.print("\n");
//      }
//
//  }}

导出excle:

/*** 导出考生数据* * @param applyOnline* @param request* @param response* @param redirectAttributes* @return*/// @RequiresPermissions("mba:applyOnline:view")@RequestMapping(value = "export", method = RequestMethod.POST)public String exportFile(ApplyOnline applyOnline, HttpServletRequest request, HttpServletResponse response,RedirectAttributes redirectAttributes) {try {User user = UserUtils.getUser();String project = user.getProject();if (project != null) {applyOnline.setProject(project);}String fileName = "考生数据" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";List<ApplyOnline> list = applyOnlineService.findList(applyOnline);new ExportExcel("考生数据", ApplyOnline.class).setDataList(list).write(response, fileName).dispose();return null;} catch (Exception e) {logger.error("导出学生信息异常", e);addMessage(redirectAttributes, "导出用户失败!失败信息:" + e.getMessage());}return "redirect:" + adminPath + "/mba/applyOnline/list?repage";}

EXCEL导入导出使用的框架相关推荐

  1. 注解+反射优雅的实现Excel导入导出(通用版)

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...

  2. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  3. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单

    做积极的人,而不是积极废人! 来源:jianshu.com/p/8f3defdc76d4EasyExcelGitHub上的官方说明快速开始maven仓库地址导入导出总结 EasyExcel 在做exc ...

  4. 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

    由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合. 一.现状 本人经历过几家公司的代码封装,导入导 ...

  5. easyexcel 在 设置标题_EasyExcel,让excel导入导出更加简单

    EasyExcel 在做excel导入导出的时候,发现项目中封装的工具类及其难用,于是去gitHub上找了一些相关的框架,最终选定了EasyExcel.之前早有听闻该框架,但是一直没有去了解,这次借此 ...

  6. java超级简单到爆的Excel导入导出(easypoi)

    场景: 在日常工作中,excel导入导出,是十分常见的,有两种主流的技术,一种是jxl,另一种是poi,而easypoi就是对poi进行了封装,使得导入导出变得更加的简单,阿里巴巴也有封装的工具名叫E ...

  7. excel winform 导入 导出_强大的 Excel 导入导出工具 hutool

    " 最近项目上需要用到 Excel 的导入导出功能,想着之前使用的都有点麻烦,所以结合多方资料,终于找到了这个还算不错的 Excel 处理工具,一起来看" 今日安利好物名为 Hut ...

  8. easypoi 多sheet导入_程序员接私活利器 玩转excel导入导出

    为什么会写Easypoi 以前的以前(岁月真TMD的快)我虽然写了不少代码但还是很少写poi,然后跳到一家公司之后就和业务人员聊上了,来这个需要个报表,这个报表样式是这样的,这个表头是这样的,就这样我 ...

  9. SpringBoot集成EasyPoi实现Excel导入导出

    作者介绍: 本人Java特工,代号:Cris Li : 中文名:克瑞斯理 简书地址: 消失的码农 - 简书 CSDN地址: https://blog.csdn.net/jianli95 个人纯洁版博客 ...

最新文章

  1. 电子工程可以报考二建_电子科学与技术专业能报考二级建造师吗?
  2. 开源项目JacpFX
  3. 大剑无锋之介绍几个常见的网络协议且位于哪一层?【面试推荐】
  4. 小程序接入h5页面_微信小程序开发接入colorUI
  5. 数据库-mysql概述
  6. 「搬文工」Mac Finder 右键快速新建、复制、移动文件工具
  7. Web前端-HTTP Cache-control
  8. 简单有效的记录日常收支
  9. JAVA面试总结(初版)
  10. Transformations in signals and systems DSP
  11. 华为手机安装Google Play教程
  12. 谷歌在中国大陆停止谷歌翻译服务,Chrome “翻成中文”无法使用
  13. 股票大作手操盘术[图解]
  14. [IOS APP]蛙-莫言经典有声小说
  15. 计算机solidwork实训报告,SolidWorks实训报告.doc
  16. OO ALV简单报表之DOCKING容器实现
  17. ubuntu系统怎么退出tty模式(开机自动进入)?(仅供参考)
  18. 汶川地震十年祭 | 川大分享会:人如树,把根留住
  19. Android软键盘高度控制的几种方案
  20. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

热门文章

  1. SAP:查找某个请求号的传输者是谁
  2. sap屏幕元素与事件
  3. 项目中用到的BAPI合集
  4. 不做“韭菜”,永洪BI教你逃离币圈骗局
  5. 干货:5个维度构建电商全景大数据分析
  6. “五心”知“五感”,平安打造有温度的智慧城市
  7. 实验代做 行人识别_CVPR 2020 | 针对VI-ReID的分层跨模态行人识别
  8. java13页_Java 13 新特性及实战案例
  9. 有小数点的补码怎么算_写给投资小白,指数基金,在哪买?怎么买?
  10. android透明视频教程,安卓透明教程(Android transparent tutorial).doc