Java+EasyExcel實(shí)現(xiàn)文件上傳功能
需求描述
頁(yè)面中當(dāng)用戶(hù)將excel表格上傳到服務(wù)器后,將該excel文件保存在本地然后在服務(wù)器中將excel中的數(shù)據(jù)讀取出來(lái)然后存入數(shù)據(jù)庫(kù)
實(shí)現(xiàn)
0、依賴(lài)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<!-- 糊涂工具類(lèi)-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
1、編寫(xiě)配置類(lèi)
文件上傳的路徑:用戶(hù)傳來(lái)的文件存放在哪
# 文件上傳
spring:
servlet:
multipart:
max-file-size: 5MB
max-request-size: 50MB
???????## 文件上傳路徑
savepath: C:\Users\86186\Desktop\pp
2、文件上傳工具類(lèi)
文件上傳時(shí)需要使用到的一些方法
/**
* 文件上傳的工具類(lèi)
*/
public class FileUploadUtil {
/**
* 得到filename文件名的后綴名
* @param filename 文件名
* aasdsad.jpg asaa.gif
* @return
*/
public static String getFileSuffix(String filename){
if(filename == null || filename.isEmpty()){
throw new RuntimeException("文件名不能為空,filename:"+filename);
}
return filename.substring(filename.lastIndexOf("."));
}
/**
* 使用UUID生成一個(gè)唯一的字符串
* @return
*/
public static String randomFilename(){
return UUID.randomUUID().toString().replaceAll("-","");
}
/**
* 基于時(shí)間戳生成文件名
* @return
*/
public static String randomFilename2(){
return System.currentTimeMillis()+"";
}
/**
* 基于時(shí)間戳 + UUID生成文件名
* @return
*/
public static String randomFilename3(){
return System.currentTimeMillis()+randomFilename();
}
/**
* 創(chuàng)建目錄
*/
public static void mkdir(String path){
File file = new File(path);
if(!file.exists()){ //不存在
file.mkdirs();
}
}
/**
* 基于當(dāng)前時(shí)間創(chuàng)建文件名
*/
public static String getTimeFilename(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd-HH-mm-ss");
Date date = new Date(System.currentTimeMillis());
return simpleDateFormat.format(date)+"-"+randomFilename2();
}
}
3、編寫(xiě)Controller
需要接受前端返回回來(lái)的文件
/**
* excel文件導(dǎo)入進(jìn)數(shù)據(jù)庫(kù)中
* @param file
* @return
*/
@Autowired
private FileUploadService fileUploadService;
@PostMapping("excelImport")
public ResponseData excelImport(MultipartFile file) throws Exception {
// 由于easyExcel所以需要傳入fileUploadService對(duì)象
String upload = fileUploadService.upload(file,fileUploadService);
return ResponseDataUtil.buildOk(upload);
}
4、編寫(xiě)Service
@Service("fileUploadService")
@Slf4j
public class FileUploadServiceImpl implements FileUploadService {
// 注入environment來(lái)獲取在配置文件中文件保存的路徑
@Autowired
private Environment environment;
// 注入數(shù)據(jù)層的對(duì)象
@Autowired
private productMapper productMapper;
@Override
public String upload(MultipartFile file, FileUploadService fileUploadService) throws Exception {
if (file == null) {
throw new Exception("文件不可以為空");
}
//得到上傳的保存路徑
String savePath = environment.getProperty("savepath");
//創(chuàng)建目錄
FileUploadUtil.mkdir(savePath);
String dbPath = "";
//得到上傳的原文件名
String originalFilename = file.getOriginalFilename();
String suffix = FileUploadUtil.getFileSuffix(originalFilename);
String filename = FileUploadUtil.getTimeFilename() + suffix;
dbPath += filename;
//保存
file.transferTo(new File(savePath, filename));
dbPath = savePath +"\\"+ dbPath;
//調(diào)用方法進(jìn)行讀取
EasyExcel.read(dbPath, ExcelDTO.class, new PageReadListener<ExcelDTO>(dataList -> {
for (ExcelDTO demoData : dataList) {
log.info("讀取到一條數(shù)據(jù){}", JSON.toJSONString(demoData));
insert(demoData);
}
})).sheet().doRead();
return dbPath;
}
// 插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中
@Override
public void insert(ExcelDTO excelDTO) {
// 使用hutool工具類(lèi)將excelDTO類(lèi)轉(zhuǎn)換成product類(lèi),因?yàn)閜roduct類(lèi)對(duì)應(yīng)的是數(shù)據(jù)庫(kù)中的字段
Product product = BeanUtil.copyProperties(excelDTO, Product.class);
productMapper.insert(product);
}
}
5、編寫(xiě)excel對(duì)應(yīng)的類(lèi)
@Data
public class ExcelDTO {
@ExcelProperty("藥品名稱(chēng)")
private String pname;
@ExcelProperty("藥品價(jià)格")
private BigDecimal pprice;
@ExcelProperty("藥品數(shù)量")
private String pcount;
@ExcelProperty("藥品描述")
private String pdes;
@ExcelProperty("藥品類(lèi)別")
private Integer ptype;
}6、創(chuàng)建easyExcel的監(jiān)聽(tīng)器
ExcelDTO = excel對(duì)應(yīng)的類(lèi)
fileUploadService = service對(duì)象
@Slf4j
@Component
public class DataListener extends AnalysisEventListener<ExcelDTO> {
public FileUploadService fileUploadService;
public DataListener(FileUploadService fileUploadService) {
this.fileUploadService = fileUploadService;
}
public DataListener() {
}
//讀取excel內(nèi)容,一行一行讀取
@Override
public void invoke(ExcelDTO excelDTO, AnalysisContext analysisContext) {
if (excelDTO == null) {
try {
throw new Exception("文件數(shù)據(jù)為空");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
7、最終效果

以上就是Java+EasyExcel實(shí)現(xiàn)文件上傳功能的詳細(xì)內(nèi)容,更多關(guān)于Java EasyExcel文件上傳的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java讀取http請(qǐng)求中的body實(shí)例代碼
下面小編就為大家?guī)?lái)一篇java讀取http請(qǐng)求中的body實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
IDEA與模擬器安裝調(diào)試失敗的處理方法:INSTALL_PARSE_FAILED_NO_CERTIFICATES
這篇文章主要介紹了IDEA與模擬器安裝調(diào)試失敗的處理方法:INSTALL_PARSE_FAILED_NO_CERTIFICATES,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
java中通過(guò)網(wǎng)卡名稱(chēng)獲取IP地址
java中通過(guò)網(wǎng)卡名稱(chēng)獲取IP地址,需要的朋友可以參考一下2013-04-04
淺談Spring如何解決循環(huán)依賴(lài)的問(wèn)題
這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴(lài)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
通過(guò)Spring AOP實(shí)現(xiàn)異常捕捉機(jī)制
在開(kāi)發(fā)過(guò)程中,異常處理是一個(gè)不可忽視的重要環(huán)節(jié),合理、優(yōu)雅地處理異常不僅能提高代碼的魯棒性,還能提升系統(tǒng)的用戶(hù)體驗(yàn),本文將介紹如何通過(guò)Spring AOP實(shí)現(xiàn)一個(gè)高效的異常捕捉機(jī)制,使得異常處理變得更加優(yōu)雅和統(tǒng)一,需要的朋友可以參考下2024-08-08
RabbitMq報(bào)錯(cuò)reply-code=406 reply-text=PRECONDITION_FAILED
這篇文章主要為大家介紹了RabbitMq報(bào)錯(cuò)reply-code=406 reply-text=PRECONDITION_FAILED分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

