日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EXCEL导入导出使用的框架

發(fā)布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EXCEL导入导出使用的框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以前excel使用的都是poi但是在使用過程中比較麻煩,上次做一個項目,發(fā)現(xiàn)一個很好用的工具們今天分享給大家。
1、使用Easypoi,免費開源是國內(nèi)開發(fā)的,中文文檔看起來比較方便,這個我就不評論了,大家上官網(wǎng)看看。
官網(wǎng)地址:http://easypoi.mydoc.io/#text_173307
2、這個是重點,也是我們項目中使用到的。這個Excle導(dǎo)出工具不知是哪位大神寫的,我只是分享。
引入pom:

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

復(fù)制一下代碼到項目:
新建你要導(dǎo)出的實體類:

/*** 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;/*** 在線報名提交學(xué)員信息Entity* @author long.zhou* @version 2016-08-04*/ public class ApplyOnline extends DataEntity<ApplyOnline> {private static final long serialVersionUID = 1L;private String name; // 學(xué)生姓名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; // 學(xué)習(xí)形式private String school; // 畢業(yè)院校private String major; // 畢業(yè)專業(yè)private Date graduationDate; // 畢業(yè)時間private String diploma; // 學(xué)歷private String graduationCertificateId; // 畢業(yè)證號private String company; // 工作單位private String job; // 工作崗位private String yearsOfWorking; // 工作年限private String yearsOfManage; // 管理崗位年限private String workingExperience; // 工作經(jīng)驗private String emergencyContactName; // 緊急聯(lián)系人姓名private String emergencyContactPhone; // 緊急聯(lián)系人電話private String studyLocation; // 就讀教學(xué)點private Date applytime; //提交時間private String project; //報名項目private String photo; //照片路徑private String file; //附件路徑private String flag; //用于學(xué)生信息查詢過渡參數(shù)private String qc; //用于學(xué)生信息查詢過渡參數(shù)private String interviewtimes;//面試批次private String bDate; //簡歷預(yù)覽生日private String gDate; //簡歷預(yù)覽畢業(yè)時間private Date startDate;private Date endDate;public ApplyOnline() {super();}public ApplyOnline(String id){super(id);}@Length(min=1, max=20, message="學(xué)生姓名長度必須介于 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="學(xué)習(xí)形式長度必須介于 1 和 20 之間")@ExcelField(title="學(xué)習(xí)形式", 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="畢業(yè)院校長度必須介于 1 和 20 之間")@ExcelField(title="畢業(yè)院校", 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="畢業(yè)專業(yè)長度必須介于 1 和 20 之間")@ExcelField(title="畢業(yè)專業(yè)", 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="畢業(yè)時間不能為空")@ExcelField(title="畢業(yè)時間", 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="學(xué)歷長度必須介于 1 和 20 之間")@ExcelField(title="學(xué)歷", 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="畢業(yè)證號長度必須介于 1 和 30 之間")@ExcelField(title="畢業(yè)證號", 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="工作經(jīng)驗長度必須介于 1 和 300 之間")@ExcelField(title="工作經(jīng)驗", 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="緊急聯(lián)系人姓名長度必須介于 1 和 10 之間")@ExcelField(title="緊急聯(lián)系人姓名", 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="緊急聯(lián)系人電話長度必須介于 1 和 20 之間")@ExcelField(title="緊急聯(lián)系人電話", 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="就讀教學(xué)點長度必須介于 1 和 10 之間")@ExcelField(title="就讀教學(xué)點", 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 {/*** 導(dǎo)出字段名(默認(rèn)調(diào)用當(dāng)前字段的“get”方法,如指定導(dǎo)出字段為對象,請?zhí)顚憽皩ο竺?對象屬性”,例:“area.name”、“office.name”)*/String value() default "";/*** 導(dǎo)出字段標(biāo)題(需要添加批注請用“**”分隔,標(biāo)題**批注,僅對導(dǎo)出模板有效)*/String title();/*** 字段類型(0:導(dǎo)出導(dǎo)入;1:僅導(dǎo)出;2:僅導(dǎo)入)*/int type() default 0;/*** 導(dǎo)出字段對齊方式(0:自動;1:靠左;2:居中;3:靠右)*/int align() default 0;/*** 導(dǎo)出字段字段排序(升序)*/int sort() default 0;/*** 如果是字典類型,請設(shè)置字典的type值*/String dictType() default "";/*** 反射類型*/Class<?> fieldType() default Class.class;/*** 字段歸屬組(根據(jù)分組導(dǎo)出導(dǎo)入)*/int[] groups() default {}; }

導(dǎo)出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;/*** 導(dǎo)出Excel文件(導(dǎo)出“XLSX”格式,支持大數(shù)據(jù)量導(dǎo)出 @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;/*** 當(dāng)前行號*/private int rownum;/*** 注解列表(Object[]{ ExcelField, Field/Method })*/List<Object[]> annotationList = Lists.newArrayList();/*** 構(gòu)造函數(shù)* @param title 表格標(biāo)題,傳“空值”,表示無標(biāo)題* @param cls 實體對象,通過annotation.ExportField獲取標(biāo)題*/public ExportExcel(String title, Class<?> cls){this(title, cls, 1);index = 1;}/*** 構(gòu)造函數(shù)* @param title 表格標(biāo)題,傳“空值”,表示無標(biāo)題* @param cls 實體對象,通過annotation.ExportField獲取標(biāo)題* @param type 導(dǎo)出類型(1:導(dǎo)出數(shù)據(jù);2:導(dǎo)出模板)* @param groups 導(dǎo)入分組*/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();// 如果是導(dǎo)出,則去掉注釋if (type==1){String[] ss = StringUtils.split(t, "**", 2);if (ss.length==2){t = ss[0];}}headerList.add(t);}initialize(title, headerList);}/*** 構(gòu)造函數(shù)* @param title 表格標(biāo)題,傳“空值”,表示無標(biāo)題* @param headers 表頭數(shù)組*/public ExportExcel(String title, String[] headers) {initialize(title, Lists.newArrayList(headers));}/*** 構(gòu)造函數(shù)* @param title 表格標(biāo)題,傳“空值”,表示無標(biāo)題* @param headerList 表頭列表*/public ExportExcel(String title, List<String> headerList) {initialize(title, headerList);}/*** 初始化函數(shù)* @param title 表格標(biāo)題,傳“空值”,表示無標(biāo)題* @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.");}/*** 創(chuàng)建表格樣式* @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;}/*** 添加數(shù)據(jù)(通過annotation.ExportField添加數(shù)據(jù))* @return list 數(shù)據(jù)列表*/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;}/*** 輸出數(shù)據(jù)流* @param os 輸出數(shù)據(jù)流*/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;}// /** // * 導(dǎo)出測試 // */ // 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("數(shù)據(jù)"+i); // } // // List<List<String>> dataList = Lists.newArrayList(); // for (int i = 1; i <=1000000; i++) { // dataList.add(dataRowList); // } // // ExportExcel ee = new ExportExcel("表格標(biāo)題", 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."); // // }}

導(dǎo)入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;/*** 導(dǎo)入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;/*** 標(biāo)題行號*/private int headerNum;/*** 構(gòu)造函數(shù)* @param path 導(dǎo)入文件,讀取第一個工作表* @param headerNum 標(biāo)題行號,數(shù)據(jù)行號=標(biāo)題行號+1* @throws InvalidFormatException * @throws IOException */public ImportExcel(String fileName, int headerNum) throws InvalidFormatException, IOException {this(new File(fileName), headerNum);}/*** 構(gòu)造函數(shù)* @param path 導(dǎo)入文件對象,讀取第一個工作表* @param headerNum 標(biāo)題行號,數(shù)據(jù)行號=標(biāo)題行號+1* @throws InvalidFormatException * @throws IOException */public ImportExcel(File file, int headerNum) throws InvalidFormatException, IOException {this(file, headerNum, 0);}/*** 構(gòu)造函數(shù)* @param path 導(dǎo)入文件* @param headerNum 標(biāo)題行號,數(shù)據(jù)行號=標(biāo)題行號+1* @param sheetIndex 工作表編號* @throws InvalidFormatException * @throws IOException */public ImportExcel(String fileName, int headerNum, int sheetIndex) throws InvalidFormatException, IOException {this(new File(fileName), headerNum, sheetIndex);}/*** 構(gòu)造函數(shù)* @param path 導(dǎo)入文件對象* @param headerNum 標(biāo)題行號,數(shù)據(jù)行號=標(biāo)題行號+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);}/*** 構(gòu)造函數(shù)* @param file 導(dǎo)入文件對象* @param headerNum 標(biāo)題行號,數(shù)據(jù)行號=標(biāo)題行號+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);}/*** 構(gòu)造函數(shù)* @param path 導(dǎo)入文件對象* @param headerNum 標(biāo)題行號,數(shù)據(jù)行號=標(biāo)題行號+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("導(dǎo)入文檔為空!");}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);}/*** 獲取數(shù)據(jù)行號* @return*/public int getDataRowNum(){return headerNum+1;}/*** 獲取最后一個數(shù)據(jù)行號* @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;}/*** 獲取導(dǎo)入數(shù)據(jù)列表* @param cls 導(dǎo)入對象類型* @param groups 導(dǎo)入分組*/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;}// /** // * 導(dǎo)入測試 // */ // 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"); // } // // }}

導(dǎo)出excle:

/*** 導(dǎo)出考生數(shù)據(jù)* * @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 = "考生數(shù)據(jù)" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";List<ApplyOnline> list = applyOnlineService.findList(applyOnline);new ExportExcel("考生數(shù)據(jù)", ApplyOnline.class).setDataList(list).write(response, fileName).dispose();return null;} catch (Exception e) {logger.error("導(dǎo)出學(xué)生信息異常", e);addMessage(redirectAttributes, "導(dǎo)出用戶失敗!失敗信息:" + e.getMessage());}return "redirect:" + adminPath + "/mba/applyOnline/list?repage";}

總結(jié)

以上是生活随笔為你收集整理的EXCEL导入导出使用的框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。