在 Android 应用开发中,操作 Excel 文件是一项常见的需求。为了简化开发过程并提供更强大的功能,我们可以使用第三方库来处理 Excel 文件。使用 EasyExcel 实现 Excel 文件操作。
Apache POI:
Apache POI 是一个流行的 Java 库,提供了强大的功能来读取、写入和操作 Microsoft Office 格式的文件,包括 Excel 文件。可以通过以下方式将 Apache POI 库引入您的项目:
implementation 'org.apache.poi:poi:5.0.0'
implementation 'org.apache.poi:poi-ooxml:5.0.0'
EasyExcel:
EasyExcel 是一个基于 Apache POI 封装的易用的 Excel 文件处理库,提供了简洁的 API,使得操作 Excel 文件更加简单和高效。
implementation 'com.alibaba:easyexcel:2.4.3'
读取 Excel 文件
// 读取 Excel 文件
String filePath = "path/to/excel/file.xlsx";
ExcelReader excelReader = EasyExcel.read(filePath).build();
List<MyData> dataList = excelReader.readAll(MyData.class, new AnalysisEventListener<MyData>() {
@Override
public void invoke(MyData data, AnalysisContext context) {
// 处理每一行的数据
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 数据读取完成
}
});
excelReader.finish();
写入 Excel 文件
// 写入 Excel 文件
String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class).sheet("Sheet1").doWrite(dataList);
写入复杂数据结构:
EasyExcel 支持将复杂的数据结构写入到 Excel 文件中,例如嵌套的对象、Map、List 等。您可以使用 @ExcelProperty
注解来指定每个字段对应的 Excel 列,使用 @ExcelIgnore
注解来忽略某些字段。
public class MyData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private int age;
// 构造函数、getter 和 setter 方法省略
}
List<MyData> dataList = new ArrayList<>();
// 添加数据到 dataList
String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class).sheet("Sheet1").doWrite(dataList);
数据转换和校验:
EasyExcel 提供了数据转换和校验的功能,您可以使用 @ExcelProperty
注解的 converter
属性来指定数据转换器,使用 @ExcelProperty
注解的 validator
属性来指定数据校验器。
public class AgeConverter implements Converter<Integer> {
@Override
public Integer convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
// 将年龄转换为 Excel 数据
}
@Override
public Integer convertToJavaData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
// 将 Excel 数据转换为年龄
}
}
public class MyData {
@ExcelProperty(value = "年龄", converter = AgeConverter.class)
private int age;
// 构造函数、getter 和 setter 方法省略
}
大数据量写入和读取:
EasyExcel 支持大数据量的写入和读取,通过使用 excelWriter
和 excelReader
的 finish
方法,可以实现分批次写入和读取数据,避免占用过多内存。
ExcelWriter excelWriter = EasyExcel.write("path/to/save/excel/file.xlsx").build();
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
// 分批次写入数据
for (int i = 0; i < totalDataSize; i += batchSize) {
List<MyData> dataList = fetchData(i, batchSize); // 模拟获取数据的方法
excelWriter.write(dataList, writeSheet);
}
excelWriter.finish();
ExcelReader excelReader = EasyExcel.read("path/to/excel/file.xlsx").build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
// 分批次读取数据
List<MyData> dataList = new ArrayList<>();
excelReader.read(readSheet, new AnalysisEventListener<MyData>() {
@Override
public void invoke(MyData data, AnalysisContext context) {
dataList.add(data);
if (dataList.size() >= batchSize) {
processData(dataList); // 处理数据
的方法
dataList.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
processData(dataList); // 处理最后一批数据
}
});
excelReader.finish();
通过分批次处理数据,可以提高性能和内存利用率。
设置表头样式:
可以使用TableStyle
类来设置表头的样式,包括字体、背景色、边框等。示例代码:
// 创建表头样式
TableStyle tableStyle = new TableStyle();
Font font = new Font();
font.setBold(true);
tableStyle.setTableHeadFont(font);
tableStyle.setTableHeadBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
tableStyle.setTableHeadBorderStyle(BorderStyle.THIN);
String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class)
.registerWriteHandler(new TableStyleWriteHandler(tableStyle))
.sheet("Sheet1")
.doWrite(dataList);
我们创建了一个TableStyle
对象,并设置了表头字体为粗体、背景色为灰色、边框为细线。然后,我们通过registerWriteHandler()
方法将这个样式应用于写入操作,实现了表头样式的设置。
自定义监听器:
EasyExcel 提供了监听器接口,允许在读取和写入 Excel 文件时处理特定事件。可以实现AnalysisEventListener
接口或WriteHandler
接口,并重写相应的方法来实现自定义监听器。
// 自定义读取监听器
public class MyReadListener extends AnalysisEventListener<MyData> {
@Override
public void invoke(MyData data, AnalysisContext context) {
// 处理每一行的数据
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 数据读取完成
}
}
// 自定义写入监听器
public class MyWriteListener extends WriteHandlerAdapter {
@Override
public void sheet(int sheetNo, Sheet sheet) {
// 在写入每个工作表之前的处理
}
@Override
public void row(int rowNum, Row row) {
// 在写入每一行之前的处理
}
@Override
public void cell(int cellNum, Cell cell) {
// 在写入每个单元格之前的处理
}
}
// 使用自定义监听器进行读取和写入操作
String filePath = "path/to/excel/file.xlsx";
ExcelReader excelReader = EasyExcel.read(filePath, MyData.class, new MyReadListener()).build();
excelReader.read();
String filePath = "path/to/save/excel/file.xlsx";
ExcelWriter excelWriter = EasyExcel.write(filePath, MyData.class)
.registerWriteHandler(new MyWriteListener())
.build();
excelWriter.write(dataList);
excelWriter.finish();
创建了MyReadListener
和MyWriteListener
,分别继承自AnalysisEventListener
和WriteHandlerAdapter
。通过在读取和写入操作中传入自定义监听器,可以实现对读取和写入过程的定制化处理。
处理空白单元格:
EasyExcel 默认会跳过空白单元格,不进行读取或写入操作。如果想要处理空白单元格,可以使用@ExcelProperty
注解的defaultValue
属性来设置默认值。
public class MyData {
@ExcelProperty(value = "姓名", defaultValue = "未知")
private String name;
@ExcelProperty(value = "年龄", defaultValue = "0")
private int age;
// 构造函数、getter 和 setter 方法省略
}
// 读取 Excel 文件
String filePath = "path/to/excel/file.xlsx";
ExcelReader excelReader = EasyExcel.read(filePath).build();
List<MyData> dataList = excelReader.readAll(MyData.class);
excelReader.finish();
// 写入 Excel 文件
String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class).sheet("Sheet1").doWrite(dataList);
通过在@ExcelProperty
注解中设置defaultValue
属性,为姓名和年龄字段指定了默认值。这样,在读取过程中,如果某个单元格为空,将会使用指定的默认值进行填充;在写入过程中,如果某个字段的值为默认值,则会将默认值写入到对应的单元格中。
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
