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

相关推荐
10km31 分钟前
java:Apache Commons Configuration2占位符解析异常的正确解法:${prefix:name:-default}
java·apache·configuration2·变量插值·interpolation
customer0831 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
灰色人生qwer39 分钟前
SpringBoot 项目配置日志输出
java·spring boot·后端
2301_793069821 小时前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
阿华的代码王国1 小时前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目
服务端相声演员1 小时前
Oracle JDK、Open JDK zulu下载地址
java·开发语言
是姜姜啊!1 小时前
java连接redis
java·redis
hhw1991121 小时前
spring boot知识点5
java·数据库·spring boot
EQUINOX11 小时前
lab4 CSAPP:Cachelab
java·后端·spring
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源