首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot整合POIExcel: 实现导入导出Excel功能

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

作者头像
默 语
发布2024-11-20 15:43:15
发布2024-11-20 15:43:15
2.4K0
举报
文章被收录于专栏:JAVAJAVA

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库的依赖:

代码语言:javascript
复制
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表格

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

代码语言:javascript
复制
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表格

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

代码语言:javascript
复制
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表格

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

代码语言:javascript
复制
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);
    }
}

实战测试

导入表格

代码语言:javascript
复制
  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));
    }

导出表格

代码语言:javascript
复制
 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();
    }

代码实现细节

代码语言:javascript
复制
   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);
     
    }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • SpringBoot整合POIExcel: 实现导入导出Excel功能
    • 摘要
    • 引言
    • 依赖
    • Poi包结构
    • 读取Excel表格
    • 读取Excel表格
    • 写入Excel表格
  • 实战测试
    • 导入表格
    • 导出表格
    • 代码实现细节
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档