亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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">導(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)文章

  • springMVC詳細(xì)介紹

    springMVC詳細(xì)介紹

    下面小編就為大家?guī)硪黄赟pring MVC 詳細(xì)介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • spring整合redis實現(xiàn)數(shù)據(jù)緩存的實例代碼

    spring整合redis實現(xiàn)數(shù)據(jù)緩存的實例代碼

    這篇文章主要介紹了spring整合redis實現(xiàn)數(shù)據(jù)緩存,需要的朋友可以參考下
    2018-09-09
  • JAVA開發(fā)中的一些規(guī)范講解(阿里巴巴Java開發(fā)規(guī)范手冊)

    JAVA開發(fā)中的一些規(guī)范講解(阿里巴巴Java開發(fā)規(guī)范手冊)

    這篇文章主要介紹了JAVA開發(fā)中的一些規(guī)范講解(阿里巴巴Java開發(fā)規(guī)范手冊),需要的朋友可以參考下
    2018-04-04
  • SpringBoot 下集成緩存工具類 CacheManager

    SpringBoot 下集成緩存工具類 CacheManager

    這篇文章主要介紹了Springboot下集成緩存工具類CacheManager,想進一步了解相關(guān)知識的同學(xué),可以詳細(xì)閱讀本文
    2023-03-03
  • SpringBoot整合POI導(dǎo)出通用Excel的方法示例

    SpringBoot整合POI導(dǎo)出通用Excel的方法示例

    這篇文章主要介紹了SpringBoot整合POI導(dǎo)出通用Excel的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 最新評論