最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java通過Excel批量上傳數(shù)據(jù)的實現(xiàn)示例

 更新時間:2024年07月01日 10:49:13   作者:wwc_boke  
Excel批量上傳是常見的一種功能,本文就來介紹一下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)文章

  • java使用jaxb操作xml示例

    java使用jaxb操作xml示例

    JAXB主要用來實現(xiàn)對象和XML之間的序列化和反序列化,關(guān)于JAXB的介紹就不多說了,這里主要總結(jié)下基本使用方法和一些注意事項
    2014-04-04
  • Java中大數(shù)據(jù)推薦算法使用場景分析

    Java中大數(shù)據(jù)推薦算法使用場景分析

    在Java中實現(xiàn)大數(shù)據(jù)推薦算法時,通常會使用一些開源的機器學習庫,如Apache Mahout、Weka、DL4J(DeepLearning4j,用于深度學習)或者Spark MLlib(用于在Spark集群上運行),這篇文章主要介紹了Java中可以用的大數(shù)據(jù)推薦算法,需要的朋友可以參考下
    2024-06-06
  • Java設計模式之代理模式

    Java設計模式之代理模式

    這篇文章介紹了Java設計模式之代理模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • IDEA 控制臺中文亂碼4種解決方案

    IDEA 控制臺中文亂碼4種解決方案

    IntelliJ IDEA 如果不進行相關(guān)設置,可能會導致控制臺中文亂碼、配置文件中文亂碼等問題,本文主要介紹了IDEA控制臺中文亂碼4種解決方案,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhà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)換為文本

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)將ppt轉(zhuǎn)換為文本,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-01-01
  • SpringBoot?項目打成?jar后加載外部配置文件的操作方法

    SpringBoot?項目打成?jar后加載外部配置文件的操作方法

    這篇文章主要介紹了SpringBoot?項目打成?jar后加載外部配置文件的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java集合ConcurrentHashMap詳解

    Java集合ConcurrentHashMap詳解

    ConcurrentHashMap?是?J.U.C?包里面提供的一個線程安全并且高效的?HashMap,所以ConcurrentHashMap?在并發(fā)編程的場景中使用的頻率比較高
    2023-01-01
  • 利用Spring Boot創(chuàng)建docker image的完整步驟

    利用Spring Boot創(chuàng)建docker image的完整步驟

    這篇文章主要給大家介紹了關(guān)于如何利用Spring Boot創(chuàng)建docker image的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • SpringBoot多環(huán)境切換的配置實現(xiàn)

    SpringBoot多環(huán)境切換的配置實現(xiàn)

    在日常的開發(fā)中,一般都會分好幾種環(huán)境,本文就來介紹一下SpringBoot多環(huán)境切換的配置實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03

最新評論

崇阳县| 梁山县| 莆田市| 天柱县| 通许县| 罗田县| 田阳县| 德保县| 贵港市| 荣成市| 安丘市| 南澳县| 桐城市| 五原县| 临夏县| 甘泉县| 庆城县| 美姑县| 建瓯市| 衡水市| 大荔县| 竹溪县| 密山市| 德昌县| 株洲县| 柳林县| 都匀市| 大安市| 米林县| 梧州市| 松原市| 綦江县| 卓资县| 永川市| 巨鹿县| 峨眉山市| 平南县| 任丘市| 信阳市| 同德县| 扬中市|