前言
最近这十几天每天都很充实,刚完成了几个小需求;今天简单记录一下其中一个:从某系统获取csv文件,然后处理成可供用户在浏览器中下载的Excel文件;
这其中有解除到新的内容,也有利用项目已有的部分功能代码。借此机会记录下来,一来方便自己回顾,二来分享这么一种思路;
获取CSV文件
这个需求是和另一个团队合作实现的,需要从他们那里获取csv文件;对接的时候很有意思(***************给我整笑了);
具体就是由他们提供 Amazon S3 的几个配置值,如:AccessID、AccessKey、bucket、path等值,由于需求是产品转述给我的,这些并没有文档;根据demo尝试拼了一下path,都报key的错误;就跟他们确认,希望他们可以提供一个样例;结果对方团队一个非开发的热心好大姐一个劲儿给我解释什么是bucket!
但是我们的需求是以日期作为参数,从上面取文件;bucket应该是他们存储文件时设置的对吧!我们应该在path上拼接日期参数才对~
下面这个是获取文件的demo:
这几个参数配置正确后就可以拿到相应的CSV文件了,接下来就是对CSV文件进行相应的转换;
CSV文件转成Bean对象
基于我们的系统里原有的导出功能,需要把这个CSV文件转换成一个List< Bean > 的格式;
具体实现也是从网上学习的,首先需要有一个对应的bean对象:
每一项都要加上@CsvBindByName注解
然后要对上面那个demo进行改造,要让其对CSV文件按照第一行进行解析,返回格式是一个list:
之后调用的时候,把参数传进去,用List< Bean> 去接收:
List<ExcelCaEngineCSVDTO> csvData = AkskUtil.getCsvData(alertDate, ExcelCaEngineCSVDTO.class);
复制代码
接下来对list进行一些操作,在接口中利用ExcelUtil.export 返回
public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> dataList, Class<T> clazz) {
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding(Charsets.UTF_8.name());
fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(dataList);
} catch (Throwable var6) {
throw var6;
}
}
复制代码
前端处理
前端做的处理首先就是:增加按钮,传参调用后台接口;
export function 接口名(data) {
return request({
url: '',
method: 'post',
data: data,
responseType: 'blob'
})
}
复制代码
以上接口的返回值作为下面导出方法的入参;对上述接口的返回值按下述方法进行处理:
当时在这个地方卡了很久;因为周一到周五天天摸鱼,只能周末写代码,在家写到这里的时候由于前段接口的声明里没加 responseType: 'blob',导致下载的文件打不开(如下图),当时也是很烦哈哈哈哈;周一来了办公室一排查就解决了,当时真的很有成就感!
总结
这个需求的完成真的让我感受到了编程的乐趣;当然前提是工作氛围舒适,领导大部分情况下是按计划推进哈哈哈;作为一个没写过多少代码的不算新人的新人,一步步摸索着完成需求,还是很有成就感的!
以上就是整个需求的实现思路,首先获取csv文件,然后解析成相应的格式,最后下载;期间和其他团队的沟通也让我很有收获,文字永远词不达意,解决问题的更快的途径还不如打个电话!还有就是,工作时间尽可能地工作,别总摸鱼~over