POI从入门到上手(一)-轻松完成Apache POI使用,完成Excel导入导出.

前言:

Apache POI

是一个流行的 Java 库,用于处理 Microsoft Office 格式文件,提供丰富 API 来创建、读取和修改 Office 文档。

1. 官网Apache POI™ - the Java API for Microsoft Documents

2. 优点 :功能强大,可处理复杂 Excel 文件;稳定性高,受广泛支持与维护;灵活性好,能满足定制需求。

3. 缺点 :学习曲线陡,对初学者成本高;处理大量数据时性能受影响。

EasyPoi

主打功能简单易用,通过简单注解和模板语言就能实现 Excel 导出、导入、Word 模板导出等功能。

1. 官网https://gitee.com/lemur/easypoi

2. 优点 :API 接口简洁,操作便捷;功能丰富,支持多种操作;基于 Apache POI 和 JexcelApi,易于扩展;文档详细,便于学习使用。

3. 缺点 :与 Apache POI 相比,高级功能有限;因封装层存在,处理大量数据有性能损耗。

EasyExcel

是阿里巴巴基于 Apache POI 封装的开源框架,专注 Excel 文件读写。

1. 官网EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

2. 优点 :API 简洁,使用方便;处理大量数据时性能高;支持注解配置导入导出规则,简化开发。

3. 缺点 :相比 Apache POI,功能简单,无法满足复杂需求;定制化能力不如 Apache POI 灵活。

一、ApachePOI

1.1、文件格式和特点

1.1.1、 HSSF

HSSF 用于处理 Excel 97 - 2003 版本的二进制格式 .xls 文件,该文件最大行数 65536、最大列数 256。处理数据时会将整个文件加载到内存,处理大数据量易致内存溢出、性能显著下降;处理小数据量时,因文件结构简单性能较好。它支持 .xls 文件所有特性,但受文件格式限制,功能有限。

1.1.2、X SSF

XSSF 用于处理 Excel 2007 及以后版本基于 XML 的 .xlsx 文件,突破了 .xls 文件行列限制,最多支持 1048576 行和 16384 列。处理时会将整个文档加载到内存,处理大量数据时内存占用问题严重,可能出现内存不足错误,性能受影响;处理中等数据量时性能不错。支持 .xlsx 文件丰富特性,功能强大且兼容性好。

1.1.3、SX SSF

SXSSF 用于处理 Excel 2007 及以后的 .xlsx 文件,是 XSSF 的流式扩展。它采用流式处理,仅在内存保留指定数量的行,超出部分写入临时文件,大幅减少内存占用,适合处理超大数据量,处理大数据时性能优势明显,能避免内存溢出。不过处理小数据量时,因频繁读写临时文件,性能可能不如 HSSF 和 XSSF。它继承了 XSSF 大部分功能,但流式处理会使部分功能受限,如写入磁盘的行无法修改。

1.2、 XSSF 格式导入导出

1.2.1、引入依赖

java 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>

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

1.2.2、数据导入

java 复制代码
/**
     * XSSFE
     * 导入excel
     */
    @RequestMapping(value = "/XSSFImportExcel")
    public List<SysUser> XSSFImportExcel() {
        List<SysUser> userList = new ArrayList<>();
        try (FileInputStream file = new FileInputStream(new File("/Users/admin/Desktop/ExcelPoi.xlsx"));
            Workbook workbook = new XSSFWorkbook(file)) {
            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 跳过表头,从第二行开始读取数据
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if (row != null) {
                    // 假设列顺序为:用户姓名, 真实姓名, 用户名, 密码, 登陆ip, 登陆时间, 登陆次数, 账号状态
                    String uname = getCellValueAsString(row.getCell(0));
                    String realName = getCellValueAsString(row.getCell(1));
                    String iphone = getCellValueAsString(row.getCell(2));
                    String ipassword = getCellValueAsString(row.getCell(3));
                    String lastloginip = getCellValueAsString(row.getCell(4));
                    String lastlogintime = getCellValueAsString(row.getCell(5));
                    long ltime = 0;
                    if (!lastlogintime.isEmpty()){
                        ltime = DateUtils.DateTimeToTimestamp(lastlogintime);
                    }
                    String logintimes = getCellValueAsString(row.getCell(6));
                    String state = getCellValueAsString(row.getCell(7));
                    // 创建用户实例
                    SysUser user = new SysUser();
                    user.setUname(uname);
                    user.setRealName(realName);
                    user.setIphone(iphone);
                    user.setIpassword(ipassword);
                    user.setLastloginip(lastloginip);
                    user.setLastlogintime(ltime);
                    user.setLogintimes(logintimes);
                    user.setState(Integer.parseInt(state));
                    userList.add(user);
                    userList.add(user);
                    // 添加到数据库
                    userService.addUser(user);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return userList;
    }

    private String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                return String.valueOf((int) cell.getNumericCellValue());
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            default:
                return "";
        }
    }

1.2.3、数据导出

java 复制代码
/**
     * XSSFE
     * 导出excel
     */
    @RequestMapping(value = "/XSSFExcelWrite")
    public void XSSFExcelWrite(HttpServletRequest request, HttpServletResponse response) throws ParseException {
        // 创建 SXSSFWorkbook 对象,内存中保留 100 行
        Workbook workbook = new XSSFWorkbook();
        // 创建工作表
        Sheet sheet = workbook.createSheet("用户信息");
        // 创建表头
        Row headerRow = sheet.createRow(0);
        String[] headers = {"用户姓名", "真实姓名", "用户名", "密码", "登陆ip", "登陆时间", "登陆次数", "账号状态"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
        }
        // 获取数据
        List<SysUser> data = userService.userList();
        // 填充数据
        for (int i = 0; i < data.size(); i++) {
            Row row = sheet.createRow(i + 1);
            SysUser user = data.get(i);
            // 用户姓名
            Cell nameCell = row.createCell(0);
            nameCell.setCellValue(user.getUname());
            // 真实姓名
            Cell realNameCell = row.createCell(1);
            realNameCell.setCellValue(user.getRealName());
            // 用户名
            Cell iphoneCell = row.createCell(2);
            iphoneCell.setCellValue(user.getIphone());
            // 密码
            Cell ipasswordCell = row.createCell(3);
            ipasswordCell.setCellValue(user.getIpassword());
            // 登陆ip
            Cell lastloginipCell = row.createCell(4);
            lastloginipCell.setCellValue(user.getLastloginip());
            // 登陆时间
            Cell lastlogintimeCell = row.createCell(5);
            if (user.getLastlogintime() != 0) {
                lastlogintimeCell.setCellValue(DateUtils.TimestampToDateTime(user.getLastlogintime()));
            }
            // 登陆次数
            Cell logintimesCell = row.createCell(6);
            logintimesCell.setCellValue(user.getLogintimes());
            // 账号状态
            Cell stateCell = row.createCell(7);
            stateCell.setCellValue(user.getState());
        }
        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        try {
            String fileName = URLEncoder.encode("ExcelPoi_" + System.currentTimeMillis() + ".xlsx", "UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            OutputStream outputStream = response.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            // 记录日志
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
            } catch (IOException e) {
                // 记录日志
                e.printStackTrace();
            }
        }
    }

通过以上内容便可轻轻松松使用Apache POI.是不是超级简单.有任何问题欢迎留言哦!!!

重点!重点!重点!

遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!

易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)

相关推荐
学习OK呀8 分钟前
日常代码中加解密技术的使用
java·后端
Dcs13 分钟前
Java 消息代理:企业集成的 5 项基本技术
java
木昜先生15 分钟前
知识点:深入理解 Java 虚拟线程(Project Loom)
java·后端
SimonKing17 分钟前
白嫖!开源Java图片验证码框架加固业务安全
java·后端·架构
AronTing22 分钟前
分布式缓存架构优化与实战:从设计到落地
java·后端·面试
parade岁月22 分钟前
Spring Boot配置中YAML文档结构的理解
java·spring boot
掉鱼的猫23 分钟前
把 Java WebApi 快速转为 Mcp-Server(使用 solon-ai-mcp)
java·api·mcp
AronTing26 分钟前
分布式锁深度解析:从原理到实战
java·后端·面试
稻草猫.26 分钟前
【Java 数据结构】List,ArrayList与顺序表
java·数据结构·idea
知其然亦知其所以然26 分钟前
Exchanger 到底能干嘛?99% 的程序员都没用过的 Java API!
java·后端·面试