Java 中EasyExcel的使用方式
什么是EasyExcel
EasyExcel 是阿里巴巴开源的一个 Java 操作 Excel 的简单工具,具有自动识别 Excel 文件的类型(2003/2007/2010等)及生成 Excel 文件,读取数据和流式写入数据的功能。为我们处理 Excel 带来了很大的便利性。
EasyExcel 的使用方式
1. 添加依赖
在项目的 pom.xml 文件中,添加以下依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
2. 流式读取 Excel 文件
EasyExcel 支持流式读取 Excel 文件,这种方式适用于读取大批量数据时。
public class ExcelReaderDemo {
/**
* 读取普通的 sheet
*/
public void readExcel(String fileName) throws IOException {
// 直接传入文件流,通过回调函数读取excel中的每一行
EasyExcel.read(fileName, new DemoDataListener()).sheet().doRead();
}
/**
* 读取指定的 sheet
*/
public void readSheet(String fileName, String sheetName) throws IOException {
// 直接传入文件流,通过回调函数读取excel中的每一行,指定读取的sheet
EasyExcel.read(fileName, new DemoDataListener()).sheet(sheetName).doRead();
}
/**
* Excel 每一行的实体类,注意需要实现 EasyExcel 的接口
*/
public static class DemoData {
// Excel第一列数据
private String firstCol;
// Excel第二列数据
private String secondCol;
// setter 和 getter 方法省略略
// ...
}
/**
* 回调函数,通过 EasyExcel.read() 指定的示例
*/
public static class DemoDataListener extends AnalysisEventListener<DemoData> {
// 批处理阈值,每解析到这么多个数据就会回调一次 invoke 去处理
private static final int BATCH_COUNT = 5;
// 自定义的数据处理逻辑
@Override
public void invoke(DemoData data, AnalysisContext context) {
// 接收到一条数据就处理一次
System.out.println("接收到数据:" + data);
}
// 所有数据解析完成之后的回调
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 所有数据解析完成之后的回调
System.out.println("所有数据解析完成");
}
}
}
3. 流式写入 Excel 文件
EasyExcel 支持流式写入 Excel 文件,这种方式适用于大批量写入数据时。
public class ExcelWriterDemo {
/**
* 写入 Excel 文件
*/
public void writeExcel(String fileName) throws IOException {
// 文件输出流,用来输出 Excel
OutputStream out = new FileOutputStream(fileName);
// ExcelWriter
ExcelWriter excelWriter = EasyExcel.write(out).build();
// sheet1
writeSheet1(excelWriter);
// sheet2
writeSheet2(excelWriter);
// 最后的操作
excelWriter.finish();
}
/**
* 写入 Sheet1
*/
public void writeSheet1(ExcelWriter excelWriter) {
// 设置sheet名字
Sheet sheet = new Sheet(1, 0, DemoData.class);
sheet.setSheetName("Sheet1");
// 数据集合
List<DemoData> data = getData();
// 写入 Excel
excelWriter.write(data, sheet);
}
/**
* 写入 Sheet2
*/
public void writeSheet2(ExcelWriter excelWriter) {
// 设置sheet名字
Sheet sheet = new Sheet(2, 0, DemoData.class);
sheet.setSheetName("Sheet2");
// 数据集合
List<DemoData> data = getData();
// 写入 Excel
excelWriter.write(data, sheet);
}
/**
* 获取数据
*/
private List<DemoData> getData() {
List<DemoData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setFirstCol("第一列数据" + i);
data.setSecondCol("第二列数据" + i);
list.add(data);
}
return list;
}
/**
* Excel 每一行的实体类,注意需要实现 EasyExcel 的接口
*/
public static class DemoData {
// Excel第一列数据
private String firstCol;
// Excel第二列数据
private String secondCol;
// setter 和 getter 方法省略略
// ...
}
}
EasyExcel 的常见问题
- 读取速度太慢,有没有更快的方法?
答:默认读取是按行读取的,能读多少就要创建多少个对象,所以如果要读取大数据量时,需要用流式读取,这样就可以一行一行地读取,减少对象数量。
EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener()).sheet().doRead();
- 写入 Excel 文件时,如何设置字体?
答:可以通过HeadStyleHandler
和ContentStyleHandler
继承AbstractCellStyleStrategy
然后覆盖getHeadCellStyle
和getContentCellStyle
方法分别返回对应的CellStyle
类型,例如:
public class ExcelCellStyleStrategy extends AbstractCellStyleStrategy {
/**
* 设置表头样式
*/
@Override
protected CellStyle getHeadCellStyle(Head head) {
// 创建 CellStyle 对象
CellStyle cellStyle = head.getHeadRowCellStyles().get(0);
// 设置字体
Font font = cellStyle.getFont();
font.setFontName("宋体");//设置字体名称
font.setFontHeightInPoints((short)12);//设置字号
font.setBold(true);//是否加粗
// 设置背景色
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 边框
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
return cellStyle;
}
/**
* 设置内容样式
*/
@Override
protected CellStyle getContentCellStyle(Head head, List<List<String>> datas, Integer rowIndex,
Integer cellIndex) {
if (rowIndex % 2 == 0) {
return getEvenCellStyle();
} else {
return super.getContentCellStyle(head, datas, rowIndex, cellIndex);
}
}
// 设置偶数行的样式
private CellStyle getEvenCellStyle() {
CellStyle cellStyle = super.getBaseCellStyle();
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
return cellStyle;
}
}
示例
下面是一个复杂的流程,读取 A 文件夹下的多个 Excel 文件,并将它们的内容合并到一个新的 Excel 文件中:
public class ExcelMergeDemo {
/**
* 读取 A 文件夹下所有 Excel 文件,并合并到一个 Excel 文件中
*/
public void merge(String path, String outFile) throws IOException {
// 所有 DataFrame
List<DataFrame> dataFrames = new ArrayList<>();
// 加载所有 Excel 文件
File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
if (f.getName().endsWith(".xlsx")) {
DataFrame dataFrame = Excel.read(f.getAbsolutePath())
.sheet(0)
.headerAlias(getHeaderAlias())
.read();
dataFrames.add(dataFrame);
}
}
}
// 合并成一个 Excel 文件
Excel.write(outFile)
.sheet("Sheet1")
.headerAlias(getHeaderAlias())
.write(dataFrames)
.finish();
}
/**
* 返回表头映射
*/
private Map<String, String> getHeaderAlias() {
Map<String, String> headerAlias = new HashMap<>();
headerAlias.put("编号", "id");
headerAlias.put("姓名", "name");
headerAlias.put("年龄", "age");
return headerAlias;
}
}
以上就是 EasyExcel 的使用方式和示例,我们可以通过 EasyExcel 实现丰富的 Excel 文件交互体验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 中EasyExcel的使用方式 - Python技术站