我们通常在读写excel时需要创建一个实体类,添加一一对应的字段才能实现。
每次都创建实体都比较麻烦,而且当我们不知道Excel格式时,怎么进行读写呢?有没有一种通用的方法来进行处理?
下面我们来实现通过对EasyExcel封装不用创建实体一步来实现对Excel的读写。
1、创建通用的实体来保存我们的表头和数据
@Data
public class SheetData {
private List<String> header = new ArrayList<>();
private List<List<String>> datas = new ArrayList<>();
public List<List<String>> toExcelHeader(){
List<List<String>> headList = new ArrayList<List<String>>();
for(String row : header){
List<String> h = new ArrayList<>();
h.add(row);
headList.add(h);
}
return headList;
}
}
2、实现AnalysisEventListener接口来处理我们的表头和每一行的数据
@Data
public class ArrayDataListener extends AnalysisEventListener<Map<Integer,String>> {
private SheetData data = new SheetData();
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
super.invokeHead(headMap, context);
for(Integer key : headMap.keySet()){
ReadCellData cellData = headMap.get(key);
String value = cellData.getStringValue();
if(ATool.isEmpty(value)){
value = "none";
}
data.getHeader().add(value);
}
}
@Override
public void invoke(Map<Integer, String> dataMap, AnalysisContext analysisContext) {
List<String> line = new ArrayList<>();
for(Integer key : dataMap.keySet()){
String value = dataMap.get(key);
if(ATool.isEmpty(value)){
value = "none";
}
line.add(value);
}
data.getDatas().add(line);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
3、封装工具类直接对SheetData进行读写
public class ExcelTool {
public static SheetData read(InputStream is, int sheetIndex){
ArrayDataListener arrayDataListener = new ArrayDataListener();
EasyExcel.read(is, arrayDataListener).sheet(sheetIndex).doRead();
return arrayDataListener.getData();
}
public static SheetData read(String path) throws FileNotFoundException {
return read(path, 0);
}
public static SheetData read(String path, int sheetIndex) throws FileNotFoundException {
FileInputStream fis = null;
SheetData data = null;
try{
fis = new FileInputStream(path);
data = read(fis, sheetIndex);
} finally {
ATool.close(fis);
}
return data;
}
public static void write(String dist, SheetData data){
write(dist, data, 0);
}
public static void write(String dist, SheetData data, int sheetIndex){
ExcelWriterBuilder excelWriter = EasyExcel.write(dist);
excelWriter.head(data.toExcelHeader());
excelWriter.sheet(sheetIndex).doWrite(data.getDatas());
}
4、如何使用
//读数据
String path = "D:\\files\\汇总数据.xlsx";
SheetData data = ExcelTool.read(path);
//写数据
ExcelTool.write(path, data);