导入和导出功能的简单实现

news2024/11/26 12:27:56

理解定义

  1. 导入:将外部文件数据导入到数据库或内存中。
  2. 导出:将数据库或内存中的数据导出为外部文件。

具体实现步骤如下:

  1. 导入数据:可以通过读取外部文件(如Excel、CSV等)的数据,然后将数据保存到数据库中。具体步骤如下:

    a. 首先需要在项目中添加文件上传的依赖,如Apache Commons FileUpload或Spring Boot的MultipartFile依赖。 b. 创建一个Controller来处理文件上传的请求,通过使用@RequestParam注解获取上传的文件。 c. 在Controller中可以使用第三方库(如Apache POI)来读取Excel文件的数据,并将数据保存到数据库中。

    在这个过程中,需要注意以下几点:

    • 需要确保上传的文件格式和内容符合预期,可以通过前端和后端的验证来实现。
    • 需要确保导入的数据在保存到数据库之前经过合适的验证和处理,例如去除重复数据、转换日期格式等。
    • 需要适时地处理异常情况,例如文件上传失败、读取失败等。
  2. 导出数据:可以通过从数据库或内存中获取数据,并将数据转换为外部文件格式(如Excel、CSV等)进行导出。具体步骤如下:

    a. 首先需要在项目中添加文件下载的依赖,如Apache POI或Spring Boot的Resource依赖。 b. 创建一个Controller来处理文件下载的请求,通过使用@RequestParam注解获取导出的文件名和格式等参数。 c. 在Controller中通过查询数据库或从内存中获取需要导出的数据,并使用第三方库(如Apache POI)将数据转换为外部文件格式(如Excel、CSV)。 d. 最后将生成的文件通过ResponseEntity返回给前端即可。

    在这个过程中,需要注意以下几点:

    • 需要确保导出的数据和格式符合预期,可以通过查询语句或后端逻辑来实现。
    • 需要适时地处理异常情况,例如数据查询失败、文件下载失败等。
    • 需要合理地处理大数据量的导出情况,避免性能问题或内存溢出。

总结起来,导入和导出功能实现的关键是文件的处理和数据的转换。其中,文件上传需要考虑文件格式、内容验证和异常处理;数据库的数据导入需要考虑数据验证、处理和异常处理;文件下载需要考虑文件格式、数据查询和异常处理。在实现过程中,可以使用相关的第三方库来简化开发,例如Apache POI用于处理Excel文件。

在Spring Boot项目中实现导入和导出功能,一般需要使用到Apache POI库。Apache POI是一个用于读写Microsoft Office格式文件的Java库,可以支持导入和导出Excel、Word等文件格式。

首先,需要在项目的pom.xml文件中添加Apache POI的依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

导入功能实现

要实现导入功能,首先需要上传Excel文件,然后解析Excel文件,将数据保存到数据库或进行其他操作。

  1. 在前端页面,添加上传文件的功能,可以使用&lt;input type="file">标签。
<form action="/import" method="post" enctype="multipart/form-data">
    <input type="file" name="file" accept=".xlsx, .xls">
    <button type="submit">导入</button>
</form>

  1. 在后端Controller中,编写导入文件的接口。
@PostMapping("/import")
public String importExcel(@RequestParam("file") MultipartFile file) {
    try {
        InputStream inputStream = file.getInputStream();
        Workbook workbook = WorkbookFactory.create(inputStream);
        Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet页

        for (Row row : sheet) {
            // 处理每一行数据
            // 例如:获取每一列数据
            Cell cell1 = row.getCell(0);
            String value1 = cell1.getStringCellValue();
            // ...

            // 将数据保存到数据库或进行其他操作
        }

        workbook.close();
        inputStream.close();

        return "导入成功";
    } catch (Exception e) {
        e.printStackTrace();
        return "导入失败";
    }
}

在导入功能实现的过程中需要注意以下几点:

  • 上传的文件类型限制:通过accept属性限制只能上传Excel文件(.xlsx和.xls格式)。
  • Apache POI的版本:请确保pom.xml文件中引入的Apache POI依赖库版本正确。
  • 解析Excel文件:使用WorkbookFactory.create(inputStream)方法可以根据文件类型(.xlsx或.xls)创建对应的Workbook对象。
  • 获取Sheet页:使用workbook.getSheetAt(0)方法获取Excel文件的第一个Sheet页。
  • 处理每一行数据:使用for (Row row : sheet)语句遍历每一行,然后可通过row.getCell(index)方法获取每一列的数据。

导出功能实现

要实现导出功能,需要从数据库或其他数据源获取数据,然后将数据写入到Excel文件中。

  1. 在后端Controller中,编写导出文件的接口。
@GetMapping("/export")
public ResponseEntity<Resource> exportExcel() {
    try {
        // 从数据库或其他数据源获取需要导出的数据
        List<Data> dataList = getDataList();

        // 创建Workbook对象
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");

        // 写入表头
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("列1");
        headerRow.createCell(1).setCellValue("列2");
        // ...

        // 写入数据
        int rowNum = 1;
        for (Data data : dataList) {
            Row dataRow = sheet.createRow(rowNum++);
            dataRow.createCell(0).setCellValue(data.getValue1());
            dataRow.createCell(1).setCellValue(data.getValue2());
            // ...
        }

        // 将Workbook转为字节数组
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        workbook.write(out);
        byte[] excelBytes = out.toByteArray();

        // 创建ResponseEntity对象,设置文件名和文件内容
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename=data.xlsx");
        headers.add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(excelBytes.length)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(new ByteArrayResource(excelBytes));
    } catch (Exception e) {
        e.printStackTrace();
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }
}

在导出功能实现的过程中需要注意以下几点:

  • 创建Workbook对象:可以根据需要创建XSSFWorkbook(.xlsx格式)或HSSFWorkbook(.xls格式)。
  • 创建Sheet页:使用workbook.createSheet("Sheet1")方法创建一个Sheet页,可以指定Sheet页名称。
  • 写入表头和数据:使用sheet.createRow(rowNum).createCell(cellNum).setCellValue(value)方法可以往指定的单元格写入数据。
  • 将Workbook转为字节数组:使用ByteArrayOutputStream将Workbook对象写入内存中的字节数组。
  • 设置ResponseEntity对象:设置响应头,包括文件名、Content-Type等信息,然后将字节数组返回。

如果只是简单了解的话代码如下:

第一导入依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

第二在springboot中进行测试

    导入:

 @Test
    void importTest() throws IOException {

        FileInputStream fileInputStream=new FileInputStream(new File("./test.xlsx"));
        XSSFWorkbook xssfWorkbook=new XSSFWorkbook(fileInputStream);
        XSSFSheet xssfSheet=xssfWorkbook.getSheetAt(0);
        // 处理数据
        for (Row row : xssfSheet) {
            for (Cell cell : row) {
                // 处理单元格数据
                String stringCellValue = cell.getStringCellValue();
                CellType cellType = cell.getCellType();

                if (cellType == CellType.BLANK){
                    continue;
                }
                if (cellType == CellType.NUMERIC){
                    continue;
                }
                System.out.println("stringCellValue = " + stringCellValue);
            }
        }
    }

导出: 

@Test
public void exportTest() throws Exception {
    // 创建Excel文件
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Sheet1");
   // 写入数据
    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("Data");
   // 保存文件
    FileOutputStream file = new FileOutputStream("./data.xlsx");
    workbook.write(file);
    file.close();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1354551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet

前言 图像分类是根据图像的语义信息对不同类别图像进行区分&#xff0c;是计算机视觉的核心&#xff0c;是物体检测、图像分割、物体跟踪、行为分析、人脸识别等其他高层次视觉任务的基础。图像分类在许多领域都有着广泛的应用&#xff0c;如&#xff1a;安防领域的人脸识别和…

【数据结构】二叉树的创建和遍历:前序遍历,中序遍历,后序遍历,层次遍历

目录 一、二叉树的定义 1、二叉树的定义 2、二叉树的五种形态 二叉树的子树 &#xff1a; 3、满二叉树与完全二叉树 4、二叉树的性质 5、二叉树的存储结构 1、顺序存储 ​编辑 2、链式存储 二、二叉树的遍历 按照前序序列构建二叉树 1、前 (先) 序遍历(Preorder …

没有Kubernetes也可以玩转Dapr?

一、NameResolution组件 虽然Dapr提供了一系列的编程模型&#xff0c;比如服务调用、发布订阅和Actor模型等&#xff0c;被广泛应用的应该还是服务调用。我们知道微服务环境下的服务调用需要解决服务注册与发现、负载均衡、弹性伸缩等问题&#xff0c;其实Dapr在这方面什么都没…

Golang拼接字符串性能对比

g o l a n g golang golang的 s t r i n g string string类型是不可修改的&#xff0c;对于拼接字符串来说&#xff0c;本质上还是创建一个新的对象将数据放进去。主要有以下几种拼接方式 拼接方式介绍 1.使用 s t r i n g string string自带的运算符 ans ans s2. 使用…

STM32 基础知识(探索者开发板)--135讲 ADC转换

ADC定义&#xff1a; ADC即模拟数字转换器&#xff0c;英文详称 Analog-to-digital converter&#xff0c;可以将外部的模拟信号转换 ADC数模转换中一些常用函数&#xff1a; 1. HAL_ADC_Init 函数 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc); 初始化ADC 形参&…

网络连通性批量检测工具

一、背景介绍 企业网络安全防护中&#xff0c;都会要求配置物理网络防火墙以及主机防火墙&#xff0c;加强对网络安全的防护。云改数转之际&#xff0c;多系统上云过程中都会申请开通大量各类网络配置&#xff0c;针对这些复杂且庞大的网络策略开通配置&#xff0c;那么在网络配…

【12】ES6:模块化

一、JavaScript 模块化 JavaScript 模块化是一种组织和管理 JavaScript 代码的方法&#xff0c;它将代码分割为独立的模块&#xff0c;每个模块都有自己的作用域&#xff0c;并且可以导出和导入功能。模块化可以提高代码的可维护性、可重用性和可扩展性。 在JavaScript中&…

AIGC时代-GPT-4和DALL·E 3的结合

在当今这个快速发展的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。从简单的自动化任务到复杂的决策制定&#xff0c;AI的应用范围日益扩大。而在这个广阔的领域中&#xff0c;有两个特别引人注目的名字&#xff1a;GPT-4和D…

2020年认证杯SPSSPRO杯数学建模A题(第二阶段)听音辨位全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 A题 听音辨位 原题再现&#xff1a; 把若干 (⩾ 1) 支同样型号的麦克风固定安装在一个刚性的枝形架子上 (架子下面带万向轮&#xff0c;在平地上可以被水平推动或旋转&#xff0c;但不会歪斜)&#xff0c;这样的设备称为一个麦克风树。不同的麦…

STM32CubeMX RS485接口使用

一、基本知识 TTL&#xff08;Transistor-Transistor Logic&#xff09;&#xff1a; 电平范围&#xff1a; 逻辑1对应于2.4V–5V&#xff0c;逻辑0对应于0V–0.5V。通信特点&#xff1a; 全双工。特点&#xff1a; 常见于单片机和微控制器的IO电平&#xff0c;USB转TTL模块通常…

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…

算法通关村番外篇-数组实现队列

大家好我是苏麟 , 今天来用数组实现一下队列 . 数组实现队列 顺序存储结构存储的队列称为顺序队列&#xff0c;内部使用一个一维数组存储&#xff0c;用一个队头指针 front 指向队列头部节点(即使用int类型front来表示队头元素的下标)&#xff0c;用一个队尾指针rear(有的地方…

HTTP 代理原理及实现(二)

在上篇《HTTP 代理原理及实现&#xff08;一&#xff09;》里&#xff0c;我介绍了 HTTP 代理的两种形式&#xff0c;并用 Node.js 实现了一个可用的普通 / 隧道代理。普通代理可以用来承载 HTTP 流量&#xff1b;隧道代理可以用来承载任何 TCP 流量&#xff0c;包括 HTTP 和 H…

【InnoDB数据存储结构】第2章节:InnoDB行格式

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 行格式。 InnoDB 行格式 InnoDB 一行记录是如何存储的&#xff1f; 这个问题是本文的重点&#xff0c;也是面试中经常问到的问题&#xff0c;所以就引出了下文的 …

水面漂浮物监测识别摄像机

水面漂浮物监测识别摄像机是一种用于监测水体表面上漂浮物的高科技设备。它主要通过安装在水域周边的摄像头实时捕捉水面情况&#xff0c;利用图像识别技术自动识别和监测水面漂浮物。这种设备在环境保护、水域清洁和水质监测等方面具有广泛的应用价值。 水面漂浮物包括各类垃圾…

vc2017编译从github网站上下载的源码

以ZLmediakit为例 1.下载软件 cmakehttps://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5-windows-x86_64.zip Microsoft Visual Studio https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_ido~msft~vscom~older-downloads …

一文搞懂SiLM824x系列SiLM8243BBCL-DG 双通道死区可编程隔离驱动 主要特性与应用 让技术变得更有价值

SiLM824x系列SiLM8243BBCL-DG是一款具有不同配置的隔离双通道门极驱动器。SiLM8243BBCL-DG配置为高、低边驱动&#xff0c;SiLM8243BBCL-DG可提供4A的输出源电流和6A的灌电流能力&#xff0c;并且其驱动输出电压可以支持到33V。支持死区可编程&#xff0c;通过调整DT脚外部的电…

Ansible、Saltstack、Puppet自动化运维工具介绍

本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别&#xff0c;以及Ansible和saltstack的基础安装和使用示例&#xff0c;如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; There are many things that can not be broken&am…

LeetCode刷题---矩阵置零

解题思路&#xff1a; 本题要求原地置换元素 对矩阵进行第一轮遍历&#xff0c;使用第一行第一列来充当该行该列是否要置换为0的标记位&#xff0c;如果第一行或第一列本身就含有零元素&#xff0c;我们使用colZero和rowZero变量来对其标记。如果第i行第j列的那个元素为0&#…

互联网分布式应用之SpringDataJPA

SpringDataJPA Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring整合Hibernate 2…