首頁 > 軟體

Java+EasyExcel實現檔案上傳功能

2023-02-25 06:03:05

需求描述

頁面中當用戶將excel表格上傳到伺服器後,將該excel檔案儲存在本地然後在伺服器中將excel中的資料讀取出來然後存入資料庫

實現

0、依賴

<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>
 <!-- 糊塗工具類-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</dependency>

1、編寫設定類

檔案上傳的路徑:使用者傳來的檔案存放在哪

  # 檔案上傳
spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 50MB

​​​​​​​## 檔案上傳路徑
savepath: C:Users86186Desktoppp

2、檔案上傳工具類

檔案上傳時需要使用到的一些方法

/**
 * 檔案上傳的工具類
 */
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生成一個唯一的字串
     * @return
     */
    public static String randomFilename(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }

    /**
     * 基於時間戳生成檔名
     * @return
     */
    public static String randomFilename2(){
        return System.currentTimeMillis()+"";
    }
    /**
     * 基於時間戳 + UUID生成檔名
     * @return
     */
    public static String randomFilename3(){
        return System.currentTimeMillis()+randomFilename();
    }


    /**
     * 建立目錄
     */
    public static void mkdir(String path){
        File file = new  File(path);
        if(!file.exists()){ //不存在
            file.mkdirs();
        }
    }

    /**
     * 基於當前時間建立檔名
     */
    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、編寫Controller

需要接受前端返回回來的檔案

/**
    * excel檔案匯入進資料庫中
    * @param file
    * @return
    */
   @Autowired
   private FileUploadService fileUploadService;

   @PostMapping("excelImport")
   public ResponseData excelImport(MultipartFile file) throws Exception {
   		// 由於easyExcel所以需要傳入fileUploadService物件
       String upload = fileUploadService.upload(file,fileUploadService);
       return ResponseDataUtil.buildOk(upload);
   }

4、編寫Service

@Service("fileUploadService")
@Slf4j
public class FileUploadServiceImpl implements FileUploadService {
	// 注入environment來獲取在組態檔中檔案儲存的路徑
    @Autowired
    private Environment environment;
    // 注入資料層的物件
    @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");
        //建立目錄
        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;

        //呼叫方法進行讀取
        EasyExcel.read(dbPath, ExcelDTO.class, new PageReadListener<ExcelDTO>(dataList -> {
            for (ExcelDTO demoData : dataList) {
                log.info("讀取到一條資料{}", JSON.toJSONString(demoData));
                insert(demoData);
            }
        })).sheet().doRead();

        return dbPath;
    }

	// 插入資料到資料庫中
    @Override
    public void insert(ExcelDTO excelDTO) {
    	// 使用hutool工具類將excelDTO類轉換成product類,因為product類對應的是資料庫中的欄位
        Product product = BeanUtil.copyProperties(excelDTO, Product.class);
        productMapper.insert(product);
    }

}

5、編寫excel對應的類

@Data
public class ExcelDTO {
   @ExcelProperty("藥品名稱")
   private String pname;
   @ExcelProperty("藥品價格")
   private BigDecimal pprice;
   @ExcelProperty("藥品數量")
   private String pcount;
   @ExcelProperty("藥品描述")
   private String pdes;
   @ExcelProperty("藥品類別")
   private Integer ptype;
}

6、建立easyExcel的監聽器

ExcelDTO = excel對應的類

fileUploadService = service物件

@Slf4j
@Component
public class DataListener extends AnalysisEventListener<ExcelDTO> {

    public FileUploadService fileUploadService;

    public  DataListener(FileUploadService fileUploadService) {
        this.fileUploadService = fileUploadService;
    }

    public  DataListener() {
    }

    //讀取excel內容,一行一行讀取
    @Override
    public void invoke(ExcelDTO excelDTO, AnalysisContext analysisContext) {
        if (excelDTO == null) {
            try {
                throw new Exception("檔案資料為空");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

7、最終效果

以上就是Java+EasyExcel實現檔案上傳功能的詳細內容,更多關於Java EasyExcel檔案上傳的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com