Java操作Excel最佳实践

Java操作Excel最佳实践

1、背景描述

在数据开发中通常会涉及到Excel的处理。Java和Apache Spark都不支持读取Excel文件,除了使用Python外,Spark操作Excel一般有两个框架:Apache POI和Spark-Excel

2、Apache POI简介

官网:http://poi.apache.org/index.html

官方文档:https://poi.apache.org/apidocs/index.html

3、Java解析Excel

3.1、导入依赖

xml 复制代码
<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>com.crealytics</groupId>
    <artifactId>spark-excel_2.12</artifactId>
    <version>0.13.7</version>
</dependency>
<!--日期时间格式化库-->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.10</version>
</dependency>

3.2、工具类POIUtils.java

为方便使用,直接封装成工具类

java 复制代码
package com.cc;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;


public class POIUtils {

    private static Workbook workbook = null;
    private static InputStream excel = null;


    // 获取列数
    public static Integer getColsNum(Sheet sheet) {
        return sheet.getLastRowNum() == -1 ? -1 : sheet.getRow(0).getPhysicalNumberOfCells();
    }

    // 获取行数
    public static Integer getRowsNum(Sheet sheet) {
        return sheet.getLastRowNum() == -1 ? -1 : sheet.getPhysicalNumberOfRows();
    }

    // 初始化Excel
    public static Sheet excelInit(String path, String name, Boolean ooxml) throws IOException {
        excel = Files.newInputStream(Paths.get(path));
        // Excel加载
        if (ooxml){
            // Microsoft Office 2007起(xlsx)
            workbook = new XSSFWorkbook(excel);
        } else {
            // Microsoft Office 2007之前(xls)
            workbook = new HSSFWorkbook(excel);
        }
        return workbook.getSheet(name);
    }

    // 读取Excel,返回字符串类型
    public static String excelReader(Sheet sheet) {
        // 行数判断
        if (sheet.getLastRowNum() == -1){
            return "";
        }
        // 遍历行和单元格(除了迭代器和如下遍历,其他遍历可能解析报错)
        StringBuilder builder = new StringBuilder();
        for (Row row : sheet) {
            StringBuilder line = new StringBuilder();
            for (Cell cell : row) {
                line.append(cell.toString()).append("\001");
            }
            builder.append(line.toString().trim()).append("\n");
        }
        return builder.toString().trim();
    }

    // 读取Excel,返回列表类型
    public static List<List<String>> excelParser(Sheet sheet) {
        // 行数判断
        if (sheet.getLastRowNum() == -1){
            return null;
        }
        // 遍历行和单元格(除了迭代器和如下遍历,其他遍历可能解析报错)
        ArrayList<List<String>> rows = new ArrayList<>();
        for (Row row : sheet) {
            ArrayList<String> cells = new ArrayList<>();
            for (Cell cell : row) {
                cells.add(cell.toString().trim());
            }
            rows.add(cells);
        }
        return rows;
    }

    // 释放资源
    public static void excelDestroy() throws IOException {
        workbook.close();
        excel.close();
    }
    

}

3.3、测试类POIUtilsTest.java

java 复制代码
package com.cc;

import org.apache.poi.ss.usermodel.Sheet;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class POIUtilsTest {


    @Test
    public void test() throws IOException {
        // 文件
        String path = "F:\\...\\file.xlsx";

        // 加载Excel
        Sheet sheet = POIUtils.excelInit(path, "Sheet1", true);

        // 获取行列数
        System.out.println(POIUtils.getRowsNum(sheet));
        System.out.println(POIUtils.getColsNum(sheet));

        // 读取Excel
         System.out.println(POIUtils.excelReader(sheet));
        // List<List<String>> lines = POIUtils.excelParser(sheet);
        // lines.forEach(System.out::println);

        // 释放资源
        POIUtils.excelDestroy();
    }


}

参考文章:https://blog.csdn.net/qq_47387991/article/details/136207565

https://blog.csdn.net/hadues/article/details/113859228

https://blog.csdn.net/xueguchen/article/details/108741429

相关推荐
学长毕设31 分钟前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn1 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川1 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵1 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David2 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1002 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin2 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质3 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3763 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02144 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法