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的方法示例