我是靠谱客的博主 热心狗,最近开发中收集的这篇文章主要介绍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类使用举例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复