溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么使用Java+EasyExcel實(shí)現(xiàn)文件上傳功能

發(fā)布時(shí)間:2023-02-24 15:42:42 來(lái)源:億速云 閱讀:144 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“怎么使用Java+EasyExcel實(shí)現(xiàn)文件上傳功能”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“怎么使用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)文件上傳功能

以上就是關(guān)于“怎么使用Java+EasyExcel實(shí)現(xiàn)文件上傳功能”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI