最近項目中需要用到Excel表格的上傳下載功能,于是選擇了EasyExcel這款工具,總的來說非常的好用,下面就做一個簡單的演示。
官方文檔地址?
- EasyExcel · 語雀
- Alibaba Easy Excel - 簡單、省內(nèi)存的Java解析Excel工具 | 首頁
一、依賴?
pom.xml?中需要添加的依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
二、創(chuàng)建實體類:和模板一致對應(yīng)?
這里用到了?@ExcelProperty?注解,這個注解很重要必要的一個注解,注解中的兩個參數(shù)value,index分別代表列名,列序號
1.value 通過標(biāo)題文本對應(yīng)
2.index 通過文本行號對應(yīng)
package com.sinosoft.springbootplus.org.param;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* <pre>
* 監(jiān)管機構(gòu)系統(tǒng)-考勤管理 導(dǎo)入
* </pre>
*
* @author ljk
* @date 2022-05-18
*/
@Data
@ContentRowHeight(21)
@HeadRowHeight(30)
@ColumnWidth(25)
public class JgjgPersonAttendanceImport {
@ExcelProperty(value = {"地區(qū)"},index = 0)
private String areaName;
@ExcelProperty(value = {"處室"},index = 1)
private String officeName;
@ExcelProperty(value = {"姓名"},index = 2)
private String personName;
@ExcelProperty(value = {"請假類型"},index = 3)
private String leaveType;
@ExcelProperty(value = {"開始時間"},index = 4)
private Date startTime;
@ExcelProperty(value = {"結(jié)束時間"},index = 5)
private Date endTime;
@ExcelProperty(value = {"時長"},index = 6)
private Integer time;
@ExcelProperty(value = {"天數(shù)"},index = 7)
private BigDecimal day;
}
三、監(jiān)聽器(easyexcel是在監(jiān)聽器層完成excel數(shù)據(jù)讀?。??
? ? ? ?由于讀取excel需要實現(xiàn)監(jiān)聽器,并且該監(jiān)聽器不能被spring容器管理,所以我們spring的注解不能在里面用,所以我們需要將service層的接口傳入該監(jiān)聽器,實現(xiàn)將excel的內(nèi)容存儲至數(shù)據(jù)庫中。
? ? ? ?有個很重要的點 監(jiān)聽器不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構(gòu)造方法傳進去
package com.sinosoft.springbootplus.org.domain.entity;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.sinosoft.springbootplus.org.convert.JgjgPersonAttendanceConvert;
import com.sinosoft.springbootplus.org.domain.service.JgjgPersonAttendanceDomain;
import com.sinosoft.springbootplus.org.param.JgjgPersonAttendanceImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* <pre>
* 監(jiān)管機構(gòu)系統(tǒng)-考勤管理
* </pre>
*
* @author ljk
* @since 2022-05-20
*/
public class JgjgPersonAttendanceListener extends AnalysisEventListener<JgjgPersonAttendanceImport> {
private static final Logger LOGGER = LoggerFactory.getLogger(JgjgPersonAttendanceListener.class);
/**
* 每隔5條存儲數(shù)據(jù)庫,實際使用中可以3000條,然后清理list ,方便內(nèi)存回收
*/
private static final int BATCH_COUNT = 5;
List<JgjgPersonAttendanceImport> list = new ArrayList<JgjgPersonAttendanceImport>();
private JgjgPersonAttendanceDomain jgjgPersonAttendanceDomain;
public JgjgPersonAttendanceListener() {
}
public JgjgPersonAttendanceListener(JgjgPersonAttendanceDomain jgjgPersonAttendanceDomain) {
this.jgjgPersonAttendanceDomain = jgjgPersonAttendanceDomain;
}
/**
* 這個每一條數(shù)據(jù)解析都會來調(diào)用
*
* @param jgjgPersonAttendanceImport
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(JgjgPersonAttendanceImport jgjgPersonAttendanceImport, AnalysisContext context) {
LOGGER.info("解析到一條數(shù)據(jù):{}", JSON.toJSONString(jgjgPersonAttendanceImport));
list.add(jgjgPersonAttendanceImport);
// 達(dá)到BATCH_COUNT了,需要去存儲一次數(shù)據(jù)庫,防止數(shù)據(jù)幾萬條數(shù)據(jù)在內(nèi)存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存儲完成清理 list
list.clear();
}
}
/**
* 所有數(shù)據(jù)解析完成了 都會來調(diào)用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 這里也要保存數(shù)據(jù),確保最后遺留的數(shù)據(jù)也存儲到數(shù)據(jù)庫
saveData();
LOGGER.info("所有數(shù)據(jù)解析完成!");
}
/**
* 加上存儲數(shù)據(jù)庫
*/
private void saveData() {
LOGGER.info("{}條數(shù)據(jù),開始存儲數(shù)據(jù)庫!", list.size());
for (JgjgPersonAttendanceImport jgjgPersonAttendanceImport : list) {
/*SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd");
jgjgPersonAttendanceImport.setStartTime(formatTime.format(jgjgPersonAttendanceImport.getStartTime()));
jgjgPersonAttendanceImport.setEndTime(formatTime.format(jgjgPersonAttendanceImport.getEndTime()));*/
//判斷狀態(tài)重新賦值
if (jgjgPersonAttendanceImport.getLeaveType().equals("病假")){
jgjgPersonAttendanceImport.setLeaveType("0");
}else if (jgjgPersonAttendanceImport.getLeaveType().equals("事假")){
jgjgPersonAttendanceImport.setLeaveType("1");
}else if (jgjgPersonAttendanceImport.getLeaveType().equals("產(chǎn)假")){
jgjgPersonAttendanceImport.setLeaveType("2");
}else if (jgjgPersonAttendanceImport.getLeaveType().equals("婚假")){
jgjgPersonAttendanceImport.setLeaveType("3");
}else if (jgjgPersonAttendanceImport.getLeaveType().equals("喪假")){
jgjgPersonAttendanceImport.setLeaveType("4");
}else if (jgjgPersonAttendanceImport.getLeaveType().equals("其他")){
jgjgPersonAttendanceImport.setLeaveType("5");
}
JgjgPersonAttendance jgjgPersonAttendance =
JgjgPersonAttendanceConvert.INSTANCE.jgjgPersonAttendanceImportToJgjgPersonAttendance(jgjgPersonAttendanceImport);
jgjgPersonAttendanceDomain.saveJgjgPersonAttendance(jgjgPersonAttendance);
}
LOGGER.info("存儲數(shù)據(jù)庫成功!");
}
}
四、controller層?文章來源:http://www.zghlxwxcb.cn/news/detail-404207.html
//導(dǎo)入
@PostMapping("/insertList")
@ApiOperation(value = "獲取JgjgPersonAttendance導(dǎo)入", notes = "監(jiān)管機構(gòu)系統(tǒng)-導(dǎo)入")
public void insetJgjgPersonAttendanceImport(MultipartFile file){
jgjgPersonAttendanceServiceImpl.insetJgjgPersonAttendanceImport(file);
}
五、service層?文章來源地址http://www.zghlxwxcb.cn/news/detail-404207.html
//導(dǎo)入
public void insetJgjgPersonAttendanceImport(MultipartFile file){
try {
InputStream inputStream = file.getInputStream();
EasyExcel.read(inputStream, JgjgPersonAttendanceImport.class, new JgjgPersonAttendanceListener(jgjgPersonAttendanceDomain)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
到了這里,關(guān)于easyExcel模板數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!