我們通常在讀寫excel時需要創(chuàng)建一個實體類,添加一一對應的字段才能實現(xiàn)。
每次都創(chuàng)建實體都比較麻煩,而且當我們不知道Excel格式時,怎么進行讀寫呢?有沒有一種通用的方法來進行處理?
下面我們來實現(xiàn)通過對EasyExcel封裝不用創(chuàng)建實體一步來實現(xiàn)對Excel的讀寫。
1、創(chuàng)建通用的實體來保存我們的表頭和數(shù)據(jù)
@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、實現(xiàn)AnalysisEventListener接口來處理我們的表頭和每一行的數(shù)據(jù)
@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、如何使用
//讀數(shù)據(jù)
String path = "D:\\files\\匯總數(shù)據(jù).xlsx";
SheetData data = ExcelTool.read(path);
//寫數(shù)據(jù)
ExcelTool.write(path, data);