1.前端传入文件,控制层需要用MultipartFile类型接收数据,代码如下
@RequestMapping(value = "/downTaxes",method = RequestMethod.POST)
public void downTaxes(@RequestParam("file") MultipartFile file, HttpServletResponse response) {
taskTaxesQueryService.taxesQuery(response,file);
}
2.业务层
public void taxesQuery(HttpServletResponse response, MultipartFile file){
try {
//从excel中,获取数据
HashMap<String, String> hashMap = getExcel(file);
LocalDate dateNow = LocalDate.now();
//response输出文件流
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(dateNow+".xls", "UTF-8"));
}catch (Exception e){
logger.error(e);
}finally {
}
}
public HashMap<String,String> getExcel(MultipartFile file) throws Exception{
HashMap<String, String> hashMap = new HashMap<>();
try {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
//获取数据
InputStream fis = new FileInputStream(toFile);
ExcelListener<Map<String,Object>> listener = new ExcelListener<Map<String,Object>>();
ExcelReader excelReader = EasyExcelFactory.read(fis, null, listener).headRowNumber(0).build();
excelReader.readAll();
List<Map<String,Object>> listMap = listener.getDatas();
excelReader.finish();
}catch (Exception e){
logger.error("读取excel表数据出现异常:"+e);
}
return hashMap;
}
/**
* 获取流文件
* @param ins 输入流
* @param file 要生成的文件
*/
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3.对象监听器
public final class ExcelListener<T> extends AnalysisEventListener<T> {
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<T> datas = new ArrayList<>();
/**
* 每解析一行都会回调invoke()方法
*
* @param object 读取后的数据对象
* @param context 内容
*/
@Override
@SuppressWarnings("unchecked")
public void invoke(Object object, AnalysisContext context) {
T map = (T) object;
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(map);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析结束销毁不用的资源
//注意不要调用datas.clear(),否则getDatas为null
}
/**
* 返回数据
*
* @return 返回读取的数据集合
**/
public List<T> getDatas() {
return datas;
}
/**
* 设置读取的数据集合
*
* @param datas 设置读取的数据集合
**/
public void setDatas(List<T> datas) {
this.datas = datas;
}
}
4.postman测试