java通過Excel批量上傳數(shù)據(jù)的實現(xiàn)示例
一、首先在前端寫一個上傳功能。
<template>
<!-- 文件上傳 -->
<el-upload class="upload-demo" :on-change="onChange" :auto-upload="false">
<el-button type="primary">上傳Excel</el-button>
</el-upload>
<a target="_blank" type="success" href="/api/upload/write">導(dǎo)出Excle</a>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { uploadApi } from "@/api/index";
import { ElMessage } from "element-plus";
//定義文件上傳的函數(shù)
const onChange = (file: any, _uploadFiles: any) => {
let reader = new FileReader();
reader.readAsDataURL(file.raw);
reader.onload = (f) => {
callUploadApi(file.name, f.target?.result);
};
};
//文件上傳的函數(shù)
const callUploadApi = (name: any, base64: any) => {
uploadApi.uploadExcel.call({ name, base64 }).then((res: any) => {
ElMessage.success("上傳成功");
});
};
</script>
請求配置:uploadApi.ts
uploadExcel: {
name: "上傳文件",
url: "/api/upload/excel",
call: async function name(params: any) {
return await http.post(this.url, params);
},
},
二、后端代碼實現(xiàn)
準(zhǔn)備工作:
1、一個與你上傳數(shù)據(jù)相對于的實體類;
2、定義一個上傳信息對象;
實體類:為了方便演示我就定義兩個字段,以供參考:
@Data
public class Person {
private Integer id;
private String name;
private Integer age;
}
上傳信息對象:
@Data
public class UploadInfo {
private String name;
private String base64;
}
Controller層代碼:
/*
* Copyright (c) 2020, 2024, All rights reserved.
*
*/
package com.by.upload;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.StopWatch;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.by.dao.PersonMapper;
import com.by.model.FileInfo;
import com.by.model.Upload;
import com.by.service.UploadService;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/api/upload")
public class UploadExcel {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Autowired
private PersonMapper personMapper;
@Autowired
private UploadService uploadService;
/**
* 導(dǎo)入excle
* @param uploadInfo
* @return
* @throws Exception
*/
@PostMapping("/excel")
public String upload(@RequestBody Upload uploadInfo) throws Exception {
String name = uploadInfo.getName();
String base64 = uploadInfo.getBase64();
String[] strArray = StrUtil.splitToArray(base64, "base64,");
byte[] bytes = Base64.decode(strArray[1]);
//用于創(chuàng)建一個基于字節(jié)數(shù)組的輸入流。它允許你從一個字節(jié)數(shù)組中讀取數(shù)據(jù)。
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
// 使用Hutool讀取Excel文件
ExcelReader reader = ExcelUtil.getReader(byteArrayInputStream);
//將讀取到的 reader 轉(zhuǎn)化為 List<Man>集合
List<Person> persons = reader.readAll(Person.class);
//StopWatch類是 Hutool 工具庫中的類,用于測量代碼執(zhí)行時間
StopWatch stopWatch = new StopWatch();
//讀取數(shù)據(jù)的結(jié)束時間同時也是寫入數(shù)據(jù)庫的開始時間
stopWatch.start();
//sqlSessionFactory是通過ioc容器注入的 設(shè)置其SqlSession的執(zhí)行器格式ExecutorType.SIMPLE(默認(rèn))
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//循環(huán)將List<Man>中的數(shù)據(jù)插入數(shù)據(jù)庫 方法一
//for (Person person : persons) {
// PoItemMapper.xml.insert(person);
//}
//方法二:
mapper.insertBatch(persons);
sqlSession.commit();
stopWatch.stop();
sqlSession.close();
System.out.println("插入數(shù)據(jù)庫最終的結(jié)果為:" + stopWatch.getTotalTimeSeconds());
return "ok";
}
/**
* 導(dǎo)出Excel
* @param response
* @throws IOException
*/
@GetMapping("/write")
public void exportExcel(HttpServletResponse response) throws IOException {
// 創(chuàng)建Excel寫入器 參數(shù) true 表示追加數(shù)據(jù),即在已有的 Excel 文件上追加新數(shù)據(jù)。如果設(shè)為 false,則會覆蓋已有的數(shù)據(jù)。
List<Person> person = personMapper.selectAll();
// 創(chuàng)建ExcelWriter對象
ExcelWriter writer = ExcelUtil.getWriter(true);
int i = 0;
while (true) {
List<Person> list = person.stream().skip(i * 100000).limit(100000).parallel().collect(Collectors.toList());
if (list.isEmpty()) {
break;
}
writer.setSheet("person" + i);
// 寫入表頭
writer.addHeaderAlias("id", "Id");
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年齡");
// 寫入當(dāng)前批次的數(shù)據(jù)
writer.write(list, true);
i++;
}
//response為HttpServletResponse對象 設(shè)置響應(yīng)的內(nèi)容類型為Excel文件
response.setContentType("application/xlsx;charset=utf-8");
//test.xls是彈出下載對話框的文件名,不能為中文,中文請自行編碼
//設(shè)置響應(yīng)頭,告訴瀏覽器以附件形式下載文件,文件名為test.xlsx。這樣設(shè)置可以讓瀏覽器彈出文件下載對話框。
response.setHeader("Content-Disposition", "attachment;filename="+"test.xlsx");
//獲取響應(yīng)輸出流,它是用于將響應(yīng)的數(shù)據(jù)發(fā)送給客戶端的流。
ServletOutputStream out = response.getOutputStream();
//將Excel數(shù)據(jù)寫入輸出流。第二個參數(shù)為true表示追加寫入,即將數(shù)據(jù)追加到已有的Excel文件中。
writer.flush(out, true);
writer.close();
//關(guān)閉輸出流
out.close();
}
}
dao層代碼:
package com.by.dao;
import com.by.upload.Person;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
public interface PersonMapper {
void insert(Person person);
void insertBatch(List<Person> persons);
List<Person> selectAll();
}Mapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.PersonMapper">
<!--新增數(shù)據(jù)-->
<insert id="insert">
insert into person(name,age)
values (#{name},#{age})
</insert>
<!-- 批量新增數(shù)據(jù) -->
<insert id="insertBatch" >
insert into person(name,age)
values
<foreach collection="persons" item="entity" separator=",">
(#{entity.name},#{entity.age})
</foreach>
</insert>
<select id="selectAll" resultType="com.by.upload.Person">
select * from person
</select>
</mapper>
注意:poi的版本號
org.apache.poi poi-ooxml 5.0.0
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>三、文件導(dǎo)出。
前端代碼:
<template> <a target="_blank" type="success" href="/api/upload/write">導(dǎo)出Excle</a> </template> <script lang="ts" setup> </script>
特別注意:如果你有攔截器和Spring Sercurity,這兩個都需要放開請求。
到此這篇關(guān)于java通過Excel批量上傳數(shù)據(jù)的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)java Excel批量上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下2023-07-07
spring整合redis實現(xiàn)數(shù)據(jù)緩存的實例代碼
JAVA開發(fā)中的一些規(guī)范講解(阿里巴巴Java開發(fā)規(guī)范手冊)
SpringBoot 下集成緩存工具類 CacheManager
SpringBoot整合POI導(dǎo)出通用Excel的方法示例

