SpringBoot整合POIExcel: 实现导入导出Excel功能

news2024/12/23 1:57:03

SpringBoot整合POIExcel: 实现导入导出Excel功能

  • SpringBoot整合POIExcel: 实现导入导出Excel功能
    • 摘要
    • 引言
    • 依赖
    • Poi包结构
    • 读取Excel表格
    • 读取Excel表格
    • 写入Excel表格
  • 实战测试
    • 导入表格
    • 导出表格
    • 代码实现细节

在这里插入图片描述
在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨

SpringBoot整合POIExcel: 实现导入导出Excel功能

摘要

本文将介绍如何在Spring Boot项目中整合POI(Poor Obfuscation Implementation)库来实现Excel文件的导入和导出功能。通过使用POI库,我们可以方便地读取和写入Excel文件,为项目的数据管理提供了便利。

引言

在许多企业应用程序中,Excel文件是一种常见的数据交换和管理方式。Spring Boot作为一个流行的Java开发框架,提供了许多便捷的工具和库来简化开发过程。POI库是Apache软件基金会的一个项目,提供了Java操作Microsoft Office格式文件的功能。结合Spring Boot和POI库,我们可以轻松地实现Excel文件的导入和导出。

依赖

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

xmlCopy code<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>

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

Poi包结构

Apache POI库提供了多个子模块来处理不同类型的Office文件,例如HSSF用于操作Excel的XLS格式,XSSF用于操作Excel的OOXML格式,HWPF用于操作Word的DOC格式,HSLF用于操作PowerPoint文件等。

读取Excel表格

读取一行,获取一行的所有单元格数据的示例代码如下:

public static void t1(){
    try {
        // 1. 获取工作簿
        XSSFWorkbook workbook = new XSSFWorkbook("E:\\test.xlsx");
        // 2. 获取工作表
        XSSFSheet sheet = workbook.getSheetAt(0);
        // 3. 获取行
        for (Row row : sheet){
            // 4. 获取单元格
            for (Cell cell : row){
                // 获取单元格的内容
                String value = cell.getStringCellValue();
                System.out.println(value);
            }
        }
        // 释放资源
        workbook.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

读取Excel表格

读取一行,获取一行的所有单元格数据

public static void t1(){
    try {
        // 1. 获取工作簿
        XSSFWorkbook workbook = new XSSFWorkbook("E:\\test.xlsx");
        // 2. 获取工作表
        XSSFSheet sheet = workbook.getSheetAt(0);
        // 3. 获取行
        for (Row row : sheet){
            // 4. 获取单元格
            for (Cell cell : row){
                // 获取单元格的内容
                String value = cell.getStringCellValue();
                System.out.println(value);
            }
        }
        // 释放资源
        workbook.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

写入Excel表格

写入一行之后,写入第二行

public static void t1(){
    try {
        // 1. 获取工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        // 2. 获取工作表
        XSSFSheet sheet = workbook.createSheet("工作表一");
        // 3.创建行
        XSSFRow row = sheet.createRow(0);
        // 4.创建单元格
        row.createCell(0).setCellValue("郭明然");
        row.createCell(1).setCellValue("窦凯欣");
        row.createCell(2).setCellValue("郭明然");
        // 创建行
        XSSFRow row1 = sheet.createRow(1);
        // 创建单元格
        row1.createCell(0).setCellValue("汤姆");
        row1.createCell(1).setCellValue("杰瑞");
        row1.createCell(2).setCellValue("皮神");

        FileOutputStream out = new FileOutputStream("E:\\t.xlsx");
        workbook.write(out);
        out.flush(); // 刷新资源
        // 释放资源
        out.close();
        workbook.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

实战测试

导入表格

  public static void main(String[] args) throws IOException, ParseException {
        List<User> read = read("E:\\test.xlsx");
    }
   /**
     * 读取 Excel 文件并将数据转换为 User 对象列表
     *
     * @param path Excel 文件路径
     * @return User 对象列表
     * @throws IOException    读取文件时可能抛出的异常
     * @throws ParseException 解析日期时可能抛出的异常
     */
    public static List<User> read(String path) throws IOException, ParseException {
        List<User> userList = new ArrayList<>();

        // 1. 获取工作簿
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(path);
        // 2. 获取工作表
        XSSFSheet sheet = xssfWorkbook.getSheetAt(0);

        // 获取实际的行数,不包括空行
        int totalRows = sheet.getPhysicalNumberOfRows();
        for (int i = 1; i < totalRows; i++) {
            XSSFRow row = sheet.getRow(i);
            if (row != null) {
                ArrayList<String> list = new ArrayList<>();
                for (Cell cell : row) {
                    if (cell != null) {
                        cell.setCellType(CellType.STRING);

                        String value = cell.getStringCellValue();// 读取数据
                        System.out.println("单元格值: '" + value + "'");

                        // 检查单元格值是否为空
                        if (value != null && !value.trim().isEmpty()) {
                            list.add(value);
                        }
                    }
                }

                // 检查是否有足够的列数
                if (list.size() >= 6) {
                    String dateString = list.get(4);
                    String dateString2 = list.get(5);

                    // 处理 Excel 序列数转换为日期
                    double excelDate1 = Double.parseDouble(dateString);
                    double excelDate2 = Double.parseDouble(dateString2);

                    // 转换 Excel 日期为 Java 日期
                    Date parse = convertExcelDateToJavaDate(excelDate1);
                    Date parse2 = convertExcelDateToJavaDate(excelDate2);

                    // 创建 User 对象并添加到列表
                    User user = new User(Long.parseLong(list.get(0)), list.get(1), Integer.parseInt(list.get(2)),
                            list.get(3), parse, parse2);
                    userList.add(user);
                }
            }
        }
        return userList;
    }

    /**
     * 将 Excel 序列数转换为 Java 日期
     *
     * @param excelDate Excel 中的日期序列数
     * @return Java 日期对象
     */
    private static Date convertExcelDateToJavaDate(double excelDate) {
        // Excel 的起始日期是 1900 年 1 月 1 日
        // Excel 序列数中,1 对应于 1900 年 1 月 1 日
        // 所以需要减去 1,然后使用 Date 类的构造函数转换为 Java 的 Date 对象
        return new Date((long) ((excelDate - 1) * 24 * 60 * 60 * 1000));
    }

导出表格

 public static void main(String[] args) throws IOException, ParseException {
        ArrayList<User> users = new ArrayList<>();
        User user = new User();
        user.setId(1L);
        user.setName("郭明然");
        user.setAge(18);
        user.setEmail("18@...cc");
        User user2 = new User();
        user2.setId(2L);
        user2.setName("窦凯欣");
        user2.setAge(18);
        user2.setEmail("18@...cc");
        users.add(user);
        users.add(user2);

        write(users,"E:\\test3.xlsx");
    }

    public static void write(List<User> userList, String path) throws IOException {
        // 创建一个工作簿
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
        // 创建工作表
        XSSFSheet sheet = xssfWorkbook.createSheet("用户");
        // 创建行
        XSSFRow row = sheet.createRow(0);
        row.createCell(0).setCellValue("id");
        row.createCell(1).setCellValue("姓名");
        row.createCell(2).setCellValue("年龄");
        row.createCell(3).setCellValue("邮箱");


        for (int i = 0; i < userList.size(); i++) {
            XSSFRow row1 = sheet.createRow(i + 1);
            row1.createCell(0).setCellValue(userList.get(i).getId());
            row1.createCell(1).setCellValue(userList.get(i).getName());
            row1.createCell(2).setCellValue(userList.get(i).getAge());
            row1.createCell(3).setCellValue(userList.get(i).getEmail());
        }
        FileOutputStream fileOutputStream = new FileOutputStream(path);
        xssfWorkbook.write(fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

代码实现细节

   package com.lyh.mp.utils;
    
    
    import com.lyh.mp.entity.User;
    import org.apache.poi.hpsf.DocumentSummaryInformation;
    import org.apache.poi.hpsf.SummaryInformation;
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.ss.usermodel.FillPatternType;
    import org.apache.poi.ss.usermodel.IndexedColors;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.List;
    
    public class POIUtils {
        public static ResponseEntity<byte[]> student2Excel(List<User> list){
            //1. 创建一个 Excel 文档
            HSSFWorkbook workbook = new HSSFWorkbook();
            //2. 创建文档摘要
            workbook.createInformationProperties();
            //3. 获取并配置文档信息
            DocumentSummaryInformation docInfo = workbook.getDocumentSummaryInformation();
            //文档类别
            docInfo.setCategory("学生信息");
            //文档管理员
            docInfo.setManager("huanji");
            //设置公司信息
            docInfo.setCompany("www.huanji.org");
            //4. 获取文档摘要信息
            SummaryInformation summInfo = workbook.getSummaryInformation();
            //文档标题
            summInfo.setTitle("学生信息表");
            //文档作者
            summInfo.setAuthor("huanji");
            // 文档备注
            summInfo.setComments("本文档由 huanji 提供");
            //5. 创建样式
            //创建标题行的样式
            HSSFCellStyle headerStyle = workbook.createCellStyle();
            headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
            headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            //创建日期单元格的样式
            HSSFCellStyle dateCellStyle = workbook.createCellStyle();
            dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
            HSSFSheet sheet = workbook.createSheet("学生信息表");
            //设置列的宽度
            sheet.setColumnWidth(0, 5 * 256);
            sheet.setColumnWidth(1, 12 * 256);
            sheet.setColumnWidth(2, 10 * 256);
            sheet.setColumnWidth(3, 5 * 256);
            sheet.setColumnWidth(4, 12 * 256);
            sheet.setColumnWidth(5, 20 * 256);
            sheet.setColumnWidth(6, 10 * 256);
            sheet.setColumnWidth(7, 10 * 256);
            sheet.setColumnWidth(8, 16 * 256);
            sheet.setColumnWidth(9, 12 * 256);
            sheet.setColumnWidth(10, 15 * 256);
            sheet.setColumnWidth(11, 20 * 256);
            sheet.setColumnWidth(12, 16 * 256);
            sheet.setColumnWidth(13, 14 * 256);
            sheet.setColumnWidth(14, 14 * 256);
            sheet.setColumnWidth(15, 12 * 256);
            sheet.setColumnWidth(16, 8 * 256);
            sheet.setColumnWidth(17, 20 * 256);
            sheet.setColumnWidth(18, 20 * 256);
            sheet.setColumnWidth(19, 15 * 256);
            sheet.setColumnWidth(20, 8 * 256);
            sheet.setColumnWidth(21, 25 * 256);
            sheet.setColumnWidth(22, 14 * 256);
            sheet.setColumnWidth(23, 15 * 256);
            sheet.setColumnWidth(24, 15 * 256);
            //6.创建标题行
            HSSFRow r0 = sheet.createRow(0);
            HSSFCell c0 = r0.createCell(0);
            c0.setCellValue("ID");
            c0.setCellStyle(headerStyle);
            HSSFCell c1 = r0.createCell(1);
            c1.setCellStyle(headerStyle);
            c1.setCellValue("名字");
            HSSFCell c2 = r0.createCell(2);
            c2.setCellStyle(headerStyle);
            c2.setCellValue("年龄");
            HSSFCell c3 = r0.createCell(3);
            c3.setCellStyle(headerStyle);
            c3.setCellValue("email");
            HSSFCell c4 = r0.createCell(4);
            c4.setCellStyle(headerStyle);
            c4.setCellValue("创建时间");
            HSSFCell c5 = r0.createCell(5);
            c5.setCellStyle(headerStyle);
            c5.setCellValue("更新时间");
            for(int i = 0; i < list.size(); i++){
                User s = list.get(i);
                HSSFRow row = sheet.createRow(i + 1);
                row.createCell(0).setCellValue(s.getId());
                row.createCell(1).setCellValue(s.getName());
                row.createCell(2).setCellValue(s.getAge());
                row.createCell(3).setCellValue(s.getEmail());
        // 设置时间格式
            HSSFCellStyle cellStyle = workbook.createCellStyle();
            HSSFDataFormat dataFormat = workbook.createDataFormat();
            cellStyle.setDataFormat(dataFormat.getFormat("yyyy-MM-dd HH:mm:ss"));
     
            HSSFCell createTimeCell = row.createCell(4);
            createTimeCell.setCellValue(s.getCreateTime());
            createTimeCell.setCellStyle(cellStyle);
     
            HSSFCell updateTimeCell = row.createCell(5);
            updateTimeCell.setCellValue(s.getUpdateTime());
            updateTimeCell.setCellStyle(cellStyle);
        }
     
          // 将Excel数据写入字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        HttpHeaders headers = new HttpHeaders();
        try {
            //设置到处文件的文件名,病指定编码
            headers.setContentDispositionFormData("attachment", new String("学生信息表.xls".getBytes("UTF-8"), "ISO-8859-1"));
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            // 将Excel数据写入字节数组
            workbook.write(baos);
        } catch (IOException e) {
            e.printStackTrace();
        }
     
        // 返回包含Excel 数据字节数组的ResponseEntity对象
        return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);
     
    }
    }

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

文章来源为:1,2
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++面向对象程序设计-北京大学-郭炜【课程笔记(四)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;四&#xff09;】 1、this指针1.1、this指针的作用1.2、this指针和静态成员函数 2、静态成员变量和静态成员函数2.1、基本概念2.2、基本概念总结2.3、如何访问静态成员2.4、静态成员变量的使用场景&#xff08;重要&…

stm32——hal库学习笔记(ADC)

这里写目录标题 一、ADC简介&#xff08;了解&#xff09;1.1&#xff0c;什么是ADC&#xff1f;1.2&#xff0c;常见的ADC类型1.3&#xff0c;并联比较型工作示意图1.4&#xff0c;逐次逼近型工作示意图1.5&#xff0c;ADC的特性参数1.6&#xff0c;STM32各系列ADC的主要特性 …

(done) Positive Semidefinite Matrices 什么是半正定矩阵?如何证明一个矩阵是半正定矩阵? 可以使用特征值

参考视频&#xff1a;https://www.bilibili.com/video/BV1Vg41197ew/?vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料(半正定矩阵的定义)&#xff1a;https://baike.baidu.com/item/%E5%8D%8A%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/2152711?frge_ala 看看半正定矩阵的…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-21-处理鼠标拖拽-番外篇

1.简介 前边宏哥拖拽有提到那个反爬虫机制&#xff0c;加了各种参数&#xff0c;以及加载js脚本文件还是有问题&#xff0c;偶尔宏哥好像发现了解决问题的办法&#xff0c;看到了黎明的曙光&#xff0c;宏哥就说试一下看看行不行&#xff0c;万一实现了。结果宏哥试了结果真的…

从零开始学习Netty - 学习笔记 - NIO基础 - 网络编程: Selector

4.网络编程 4.1.非阻塞 VS 阻塞 在网络编程中&#xff0c;**阻塞&#xff08;Blocking&#xff09;和非阻塞&#xff08;Non-blocking&#xff09;**是两种不同的编程模型&#xff0c;描述了程序在进行网络通信时的行为方式。 阻塞&#xff08;Blocking&#xff09;&#xff1…

Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

1、NFS介绍 NFS&#xff08;Network File System&#xff09;是一种分布式文件系统协议&#xff0c;允许客户端远程访问服务器上的文件&#xff0c;实现数据共享。它整合多个存储设备为统一文件系统&#xff0c;方便数据存储和管理&#xff0c;支持负载均衡和故障转移&#xf…

《咸鱼之王》简单拆解图(持续更新)

文章目录 一、 介绍二、 角色设定阿咸咸将 三、游戏拆解 一、 介绍 《咸鱼之王》是一款由阿咸工作室开发的手机游戏&#xff0c;战斗方式为回合制卡牌对战&#xff0c;同时玩家点击屏幕可以为阵容提供助攻。该游戏于2021年3月4日公测。 在游戏中&#xff0c;玩家将化身主角阿…

测试环境搭建整套大数据系统(四:ubuntu22.4创建普通用户)

一&#xff1a;创建用户&#xff0c;修改密码&#xff0c;增加sudo权限。 useradd dolphinscheduler #输入密码 passwd dolphinscheduler # 配置 sudo 免密 sed -i $adolphinscheduler ALL(ALL) NOPASSWD: NOPASSWD: ALL /etc/sudoers sed -i s/Defaults requirett/#Defa…

【Java面试】MQ(Message Queue)消息队列

目录 一、MQ介绍二、MQ的使用1应用解耦2异步处理3流量削峰4日志处理5消息通讯三、使用 MQ 的缺陷1.系统可用性降低:2.系统复杂性变高3.一致性问题四、常用的 MQActiveMQ:RabbitMQ:RocketMQ:Kafka:五、如何保证MQ的高可用?ActiveMQ:RabbitMQ:RocketMQ:Kafka:六、如何保…

Python环境下基于门控双注意力机制的滚动轴承剩余使用寿命RUL预测(Tensorflow模块)

机械设备的寿命是其从开始工作持续运行直至故障出现的整个时间段&#xff0c;以滚动轴承为例&#xff0c;其寿命为开始转动直到滚动体或是内外圈等元件出现首次出现故障前。目前主流的滚动轴承RUL预测分类方法包含两种&#xff1a;一是基于物理模型的RUL预测方法&#xff0c;二…

【计算机科学基础】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 计算机科学基础还包括诸如人工智能、机器学习、图形学、密码学等更专业的领域。随着技术的不断发展&#xff0c;计算机科学基础也在不断扩大和深化。 知识图谱 计算理论 这是研究计算的本质和…

docker pullpush 生成镜像文件并push 到阿里云

pull docker docker pull ultralytics/ultralytics # 拉取yolov8的镜像仓库 docker run -it ultralytics/ultralytics # 运行镜像 conda create -n gsafety python3.8 # 创建环境 source activate gsafety # 激活环境 pip install -i https://pypi.tuna.tsinghua.edu.cn/simp…

BOSS直聘招聘经验

招聘低端兼职岗位。流量很大&#xff0c;来的人通常实力也不足。 招聘高端兼职岗位。流量不多。来的人通常具备一定实力。 招聘高薪职位&#xff0c;流量一般&#xff0c;会有有实力的勾搭。 招聘低薪职位&#xff0c;流量一般。通常没什么实力。

Unity Shader ASE基础效果思路与代码(一):遮罩、硬边溶解、光边溶解、UV扰动

Unity Shader ASE基础效果思路与代码(一)&#xff1a;遮罩、硬边溶解、光边溶解、UV扰动 文章目录 Unity Shader ASE基础效果思路与代码(一)&#xff1a;遮罩、硬边溶解、光边溶解、UV扰动遮罩效果硬边溶解光边溶解UV扰动 遮罩效果 效果展示&#xff1a; 思路与代码&#xff1…

Python3零基础教程之Python解释器与开发环境搭建

大家好&#xff0c;我是千与编程&#xff0c;硕士毕业于北京大学&#xff0c;曾先后就职于字节跳动&#xff0c;京东等互联网大厂&#xff0c;目前在编程导航知识星球担任星球嘉宾&#xff0c;著有《AI算法毕设智囊袋》&#xff0c;《保姆级带你通关秋招教程》两大专栏。 今天开…

HTML5-CSS3

一、HTML5的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 **IE9 以上版本的浏览器**才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性…

华为笔记本原厂系统镜像恢复安装教程方法

1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f …

力扣精选算法100道——Z字形变换(模拟专题)

目录 &#x1f388;了解题意 &#x1f388;算法原理 &#x1f6a9;先处理第一行和最后一行 &#x1f6a9;再处理中间行 &#x1f388;实现代码 &#x1f388;了解题意 大家看到这个题目的时候肯定是很迷茫的&#xff0c;包括我自己也是搞不清楚题目什么意思&#xff0c;我…

Linux CAfile 文件下的/ca-bundle.crt怎么生成的

在配置Linux Nginx SSL证书后&#xff0c;通过服务器访问域名时发现&#xff0c;服务器返回的CA证书是&#xff1a;/etc/pki/tls/certs/ca-bundle.crt 正式我在使用Spring Native安装了Docker自动生成的&#xff0c;而且开启了Docker的自启动&#xff0c;如果你和我一样&#x…

如何实现一个K8S DevicePlugin?

什么是device plugin k8s允许限制容器对资源的使用&#xff0c;比如CPU和内存&#xff0c;并以此作为调度的依据。 当其他非官方支持的设备类型需要参与到k8s的工作流程中时&#xff0c;就需要实现一个device plugin。 Kubernetes提供了一个设备插件框架&#xff0c;你可以用…