导入Excel表格时,如何把表头一起导入(停送电信息)
如下代码:
你这个fori循环下标不是从1开始的吗,他把第一行表头给跳过了,你改成0
这是我开发中遇到的困难之一,由于之前没有遇到过这种excel表格批量上传的需求,所以第一次碰到蒙了一下,转而之后就是兴奋,对未知知识的索取与分析问题的喜悦(都有)
-----以上是我的废话
我可以利用easyexcel框架中的ExcelWriter对象实现导入Excel表格时同时导入表头的功能。首先,通过InputStream获取Excel文件流,然后使用EasyExcel.read()方法读取表格,同时设置WriteSheet传入表头的类,最后可以通过ExcelWriter.write()方法传入数据和表头信息,写入到输出流中。具体代码示例如下:
/**
* 导入Excel表格,并同时导入表头
* @param inputStream Excel文件流
* @param clazz 导入数据对应的实体类
* @param <T> 泛型,对应实体类
* @return 返回List<T>类型的数据集合,包括表头信息和其他数据
*/
public static <T> List<T> importExcelWithHeader(InputStream inputStream, Class<T> clazz) {
// 定义Excel监听器,从而获取表头信息
AnalysisEventListener<T> listener = new AnalysisEventListener<T>() {
private List<T> dataList = new ArrayList<>();
@Override
public void invoke(T data, AnalysisContext context) {
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {}
public List<T> getDataList() {
return dataList;
}
};
// 调用EasyExcel方法解析数据
EasyExcel.read(inputStream, clazz, listener).sheet().doRead();
return listener.getDataList();
}
/**
* 写入Excel表格,并同时写入表头
* @param outputStream 输出流,用于写入表格数据
* @param clazz 数据对应的实体类
* @param dataList 导出的数据集合
* @param <T> 泛型,对应实体类
*/
public static <T> void writeExcelWithHeader(OutputStream outputStream, Class<T> clazz, List<T> dataList) {
// 使用EasyExcel创建Excel表格
ExcelWriter excelWriter = EasyExcel.write(outputStream, clazz).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 只有第一个写入的数据才会包含表头,将其作为第一条记录写入
T firstData = dataList.get(0);
excelWriter.write(Arrays.asList(firstData), writeSheet);
// 从集合中移除表头信息
dataList.remove(0);
// 将数据集合写入Excel表格中
excelWriter.write(dataList, writeSheet);
// 关闭ExcelWriter,释放资源
excelWriter.finish();
}