• 使用Excel导入和导出数据


    功能技术:SpringBoot,vue3(restful) 

    前端代码实现

    首先在前端写一个上传和导出功能。

    1. <template>
    2. <el-upload class="upload-demo" drag action="" :on-change="onChange" :auto-upload="false">
    3. <el-icon class="el-icon--upload"><upload-filled />el-icon>
    4. <div class="el-upload__text">
    5. Drop file here or <em>click to uploadem>
    6. div>
    7. el-upload>
    8. <a target="_blank" type="success" href="/api/upload/write">导出Exclea>
    9. template>
    10. <script lang="ts" setup>
    11. import { uploadApi } from "@/api/index";
    12. import { ElMessage } from "element-plus";
    13. //定义文件上传的函数
    14. const onChange = (file: any, _uploadFiles: any) => {
    15. let reader = new FileReader();
    16. reader.readAsDataURL(file.raw);
    17. reader.onload = (f) => {
    18. callUploadApi(file.name, f.target?.result);
    19. };
    20. };
    21. //文件上传的函数
    22. const callUploadApi = (name: any, base64: any) => {
    23. uploadApi.uploadExcel.call({ name, base64 }).then((res: any) => {
    24. ElMessage.success("上传成功");
    25. });
    26. };
    27. script>

    请求配置:uploadApi.ts

    1. import http from "@/http/index";
    2. export default {
    3. uploadExcel: {
    4. name: "上传文件",
    5. url: "/api/upload/excel",
    6. call: async function name(params: any) {
    7. return await http.post(this.url, params);
    8. },
    9. },
    10. };

    index.ts

    1. import uploadApi from "@/api/uploadApi";
    2. export {uploadApi};

    数据库文件

    1. CREATE TABLE `person` (
    2. `id` int(11) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(255) DEFAULT NULL COMMENT '姓名',
    4. `age` int(11) DEFAULT NULL COMMENT '年龄',
    5. PRIMARY KEY (`id`)
    6. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    后端代码实现

    导入操作excel的依赖poi

    1. <dependency>
    2. <groupId>org.apache.poigroupId>
    3. <artifactId>poi-ooxmlartifactId>
    4. <version>5.0.0version>
    5. dependency>

    准备工作:1、一个与你上传数据相对于的实体类;

                      2、定义一个上传信息对象;

     实体类Person:为了方便演示我就定义两个字段,以供参考:

    1. @Data
    2. public class Person {
    3.     private String name;
    4.     private Integer age;
    5. }

     上传信息对象UploadInfo :

    1. @Data
    2. public class UploadInfo {
    3. private String name;
    4. private String base64;
    5. }

    Controller层代码:

    1. @RestController
    2. @RequestMapping("/api/upload")
    3. public class UploadExcel {
    4. @Autowired
    5. private SqlSessionFactory sqlSessionFactory;
    6. @Autowired
    7. private PersonDao personDao;
    8. @Autowired
    9. private UploadService uploadService;
    10. /**
    11. * 导入excle
    12. * @param uploadInfo
    13. * @return
    14. * @throws Exception
    15. */
    16. @PostMapping("/excel")
    17. public String upload1(@RequestBody UploadInfo uploadInfo) throws Exception {
    18. String name = uploadInfo.getName();
    19. String base64 = uploadInfo.getBase64();
    20. String[] strArray = StrUtil.splitToArray(base64, "base64,");
    21. byte[] bytes = Base64.decode(strArray[1]);
    22. //用于创建一个基于字节数组的输入流。它允许你从一个字节数组中读取数据。
    23. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
    24. // 使用Hutool读取Excel文件
    25. ExcelReader reader = ExcelUtil.getReader(byteArrayInputStream);
    26. //将读取到的 reader 转化为 List集合
    27. List persons = reader.readAll(Person.class);
    28. //StopWatch类是 Hutool 工具库中的类,用于测量代码执行时间
    29. StopWatch stopWatch = new StopWatch();
    30. //读取数据的结束时间同时也是写入数据库的开始时间
    31. stopWatch.start();
    32. //sqlSessionFactory是通过ioc容器注入的 设置其SqlSession的执行器格式ExecutorType.SIMPLE(默认)
    33. SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    34. PersonDao mapper = sqlSession.getMapper(PersonDao.class);
    35. //循环将List中的数据插入数据库 方法一
    36. //for (Person person : persons) {
    37. // PoItemMapper.xml.insert(person);
    38. //}
    39. //方法二:
    40. mapper.insertBatch(persons);
    41. sqlSession.commit();
    42. stopWatch.stop();
    43. sqlSession.close();
    44. System.out.println("插入数据库最终的结果为:" + stopWatch.getTotalTimeSeconds());
    45. return "ok";
    46. }
    47. /**
    48. * 导出Excel
    49. * @param response
    50. * @throws IOException
    51. */
    52. @GetMapping("/write")
    53. public void exportExcel(HttpServletResponse response) throws IOException {
    54. // 创建Excel写入器 参数 true 表示追加数据,即在已有的 Excel 文件上追加新数据。如果设为 false,则会覆盖已有的数据。
    55. List person = personDao.selectAll();
    56. // 创建ExcelWriter对象
    57. ExcelWriter writer = ExcelUtil.getWriter(true);
    58. int i = 0;
    59. while (true) {
    60. List list = person.stream().skip(i * 100000).limit(100000).parallel().collect(Collectors.toList());
    61. if (list.isEmpty()) {
    62. break;
    63. }
    64. writer.setSheet("person" + i);
    65. // 写入表头
    66. writer.addHeaderAlias("id", "Id");
    67. writer.addHeaderAlias("name", "姓名");
    68. writer.addHeaderAlias("age", "年龄");
    69. // 写入当前批次的数据
    70. writer.write(list, true);
    71. i++;
    72. }
    73. //response为HttpServletResponse对象 设置响应的内容类型为Excel文件
    74. response.setContentType("application/xlsx;charset=utf-8");
    75. //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
    76. //设置响应头,告诉浏览器以附件形式下载文件,文件名为test.xlsx。这样设置可以让浏览器弹出文件下载对话框。
    77. response.setHeader("Content-Disposition", "attachment;filename="+"test.xlsx");
    78. //获取响应输出流,它是用于将响应的数据发送给客户端的流。
    79. ServletOutputStream out = response.getOutputStream();
    80. //将Excel数据写入输出流。第二个参数为true表示追加写入,即将数据追加到已有的Excel文件中。
    81. writer.flush(out, true);
    82. writer.close();
    83. //关闭输出流
    84. out.close();
    85. }
    86. }

    dao层代码PersonDao :

    1. @Mapper
    2. public interface PersonDao {
    3. void insert(Person person);
    4. void insertBatch(List persons);
    5. List selectAll();
    6. }

    PersonMappr.xml:

    1. "1.0" encoding="UTF-8"?>
    2. "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. "com.by.dao.PersonMapper">
    4. "insert">
    5. insert into person(name,age)
    6. values (#{name},#{age})
    7. "insertBatch" >
    8. insert into person(name,age)
    9. values
    10. "persons" item="entity" separator=",">
    11. (#{entity.name},#{entity.age})

     

  • 相关阅读:
    Python决策树
    Java 编程问题:一、字符串、数字和数学
    外卖项目07---git
    【刷题笔记6】LeetCode 162. 寻找峰值(二分查找优化)
    在Java中操作Redis
    【LeetCode刷题】146. LRU 缓存
    数据结构(栈和队列)
    鸿蒙开发实例 | 鸿蒙原子化服务卡片开发完美体验
    PMP每日一练 | 考试不迷路-9.16(包含敏捷+多选)
    MyBatis快速入门
  • 原文地址:https://blog.csdn.net/m0_74007708/article/details/136716806