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">導出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)
準備工作:
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;
/**
* 導入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容器注入的 設置其SqlSession的執(zhí)行器格式ExecutorType.SIMPLE(默認)
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";
}
/**
* 導出Excel
* @param response
* @throws IOException
*/
@GetMapping("/write")
public void exportExcel(HttpServletResponse response) throws IOException {
// 創(chuàng)建Excel寫入器 參數(shù) true 表示追加數(shù)據(jù),即在已有的 Excel 文件上追加新數(shù)據(jù)。如果設為 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", "年齡");
// 寫入當前批次的數(shù)據(jù)
writer.write(list, true);
i++;
}
//response為HttpServletResponse對象 設置響應的內(nèi)容類型為Excel文件
response.setContentType("application/xlsx;charset=utf-8");
//test.xls是彈出下載對話框的文件名,不能為中文,中文請自行編碼
//設置響應頭,告訴瀏覽器以附件形式下載文件,文件名為test.xlsx。這樣設置可以讓瀏覽器彈出文件下載對話框。
response.setHeader("Content-Disposition", "attachment;filename="+"test.xlsx");
//獲取響應輸出流,它是用于將響應的數(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>三、文件導出。
前端代碼:
<template> <a target="_blank" type="success" href="/api/upload/write">導出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)文章
Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南
Logback是一個可靠、通用且快速的Java日志框架,作為Log4j的繼承者,由Log4j創(chuàng)始人設計,這篇文章主要介紹了Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南,需要的朋友可以參考下2025-05-05
使用Java實現(xiàn)將ppt轉(zhuǎn)換為文本
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)將ppt轉(zhuǎn)換為文本,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考下2024-01-01
SpringBoot?項目打成?jar后加載外部配置文件的操作方法
這篇文章主要介紹了SpringBoot?項目打成?jar后加載外部配置文件的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
利用Spring Boot創(chuàng)建docker image的完整步驟
這篇文章主要給大家介紹了關(guān)于如何利用Spring Boot創(chuàng)建docker image的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
SpringBoot多環(huán)境切換的配置實現(xiàn)
在日常的開發(fā)中,一般都會分好幾種環(huán)境,本文就來介紹一下SpringBoot多環(huán)境切換的配置實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-03-03

