我是靠谱客的博主 热心狗,最近开发中收集的这篇文章主要介绍Java:实现对表格文件的便捷读取和保存概述ArmedFile类ArmedFilesArmedExcel类使用举例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

概述

表格文件一般是存储在磁盘中的,要想操作表格文件,以POI为例,需要把磁盘中的表格文件转化成内存中的Workbook对象,保存表格文件则是把内存中的Workbook转化成磁盘中的表格文件,那么我这篇文章要讲的是把上面说的转化过程的代码进行封装,最终的效果就是,给我一个Excel表格的路径,我就能马上拿到可操作的Workbook,我只要一个save方法,就能保存表格。

下图是三个类的大体情况:
在这里插入图片描述

提示:在以下代码中,会用到Nio、POI、Consumer等等这些东西。


以下是Maven项目需要添加的依赖

<dependencies>
    <!--支持操作文件名后缀为xls的表格-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.0</version>
    </dependency>

    <!--支持操作文件名后缀为xlsx的表格-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.0</version>
    </dependency>
</dependencies>

ArmedFile类

这个类的价值主要体现在read和write方法,把磁盘和内存之间流的操作进行了封装

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Consumer;

public class ArmedFile {

    private Path path;

    public Path getPath() {
        return path;
    }

    /**
     * 构造函数
     *
     * @param strPath 文件或文件夹的路径
     */
    public ArmedFile(String strPath) {
        this.path = Paths.get(strPath);
    }

    /**
     * 构造函数
     *
     * @param path
     */
    public ArmedFile(Path path) {
        this.path = path;
    }

    /**
     * 创建文件
     * @throws IOException
     */
    public void createFile() throws IOException {

        // 创建上级目录
        Files.createDirectories(path.getParent());

        // 创建文件
        Files.createFile(path);
    }

    /**
     * 把磁盘中的文件读取到内存中
     *
     * @param consumer
     * @throws IOException
     */
    public void read(Consumer<InputStream> consumer) throws IOException {
        InputStream inputStream = new FileInputStream(path.toString());
        consumer.accept(inputStream);
        inputStream.close();
    }

    /**
     * 把内存中的文件存储到磁盘中
     *
     * @param consumer
     * @throws IOException
     */
    public void write(Consumer<OutputStream> consumer) throws IOException {
        OutputStream outputStream = new FileOutputStream(path.toString());
        consumer.accept(outputStream);
        outputStream.close();
    }

    /**
     * 获取后缀名
     *
     * @return
     */
    public String getSuffix() {
        String name = path.toString();
        int index = name.lastIndexOf(".");
        String suffix = name.substring(index + 1);
        return suffix;
    }
}

ArmedFiles

可以用来帮助处理某文件夹内的多个文件,处理多个表格时也是用它来辅助

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Consumer;
import java.util.stream.Stream;

public class ArmedFiles {

    private Stream<Path> paths;

    /**
     * 构造函数
     * @param strPath 文件夹路径
     */
    public ArmedFiles(String strPath) throws IOException {
        paths = Files.list(Paths.get(strPath));
    }

    /**
     * 遍历文件或文件夹,并执行操作
     * @param consumer
     */
    public void forEach(Consumer<ArmedFile> consumer) {
        paths.forEach(path -> {
            consumer.accept(
                    new ArmedFile(path)
            );
        });
    }
}

ArmedExcel类

这个类是表现类,你只要给它的一个正确的Excel文件的路径,就可以加载得到Workbook,接着就可以自行读取数据、修改保存等操作了。

import file.ArmedFile;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ArmedExcel {

    private Path path;
    private Workbook workbook;

    public Workbook getWorkbook() {
        return workbook;
    }

    /**
     * 构造函数
     *
     * @param strPath
     */
    public ArmedExcel(String strPath) {
        path = Paths.get(strPath);
    }

    /**
     * 构造函数
     *
     * @param path
     */
    public ArmedExcel(Path path) {
        this.path = path;
    }

    /**
     * 加载Excel文件
     * 从磁盘读取Excel文件到内存中
     * @throws IOException
     */
    public Workbook load() throws IOException {

        ArmedFile file = new ArmedFile(path);
        file.read(inputStream -> {
            try {
                String suffix = file.getSuffix();

                // 如果Excel文件后缀是xlsx,那么表格就是2007以上的版本,交给XSSFWorkbook处理
                if ("xlsx".equals(suffix)) {
                    workbook = new XSSFWorkbook(inputStream);
                }

                // 如果Excel文件后缀是xls,那么表格就是2003旧版本,交给HSSFWorkbook处理
                else if ("xls".equals(suffix)) {
                    workbook = new HSSFWorkbook(inputStream);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

        return workbook;
    }

    /**
     * 保存Excel文件
     * @throws IOException
     */
    public void save() throws IOException {
        new ArmedFile(path).write(outputStream -> {
            try {
                workbook.write(outputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 判断本身路径是否存在文件并且为Excel文件
     *
     * @return
     */
    public boolean existsExcel() {

        // 如果文件不存在,则结果为否
        if (!Files.exists(path)) {
            return false;
        }

        // 如果是文件夹,则结果为否
        if (Files.isDirectory(path)) {
            return false;
        }

        // 文件后缀是xlsx或xls的,则为Excel文件
        String suffix = new ArmedFile(path).getSuffix();
        if ("xlsx".equals(suffix) || "xls".equals(suffix)) {
            return true;
        }

        return false;
    }
}

使用举例

举个最简单的使用例子,如:
获取某个Excel文件第一个标签页第一行第一个格子的内容,接着修改它并且保存。

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;

public class Test {
    public static void main(String[] args) throws IOException {
        ArmedExcel excel = new ArmedExcel("D://记账本.xlsx");
        Workbook workbook = excel.load();
        Cell cell = workbook
                .getSheetAt(0)
                .getRow(0)
                .getCell(0);
        System.out.println(cell.getStringCellValue());
        cell.setCellValue("某某某");
        excel.save();
    }
}

处理某文件夹内多个表格的举例:

import org.apache.poi.ss.usermodel.Workbook;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        ArmedFiles files = new ArmedFiles("E://一堆表格");
        files.forEach(file -> {
            try {
                Workbook workbook = new ArmedExcel(file.getPath()).load();
                // ......
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}

最后

以上就是热心狗为你收集整理的Java:实现对表格文件的便捷读取和保存概述ArmedFile类ArmedFilesArmedExcel类使用举例的全部内容,希望文章能够帮你解决Java:实现对表格文件的便捷读取和保存概述ArmedFile类ArmedFilesArmedExcel类使用举例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部