1、涨幅榜数据导出功能分析
1.1 原型效果
通过点击【导出数据】按钮,将当前页的数据导出到excel下:
1.2 数据导出接口说明
功能说明:将分页涨幅榜下指定页码的数据导出到excel表格下 请求地址:/api/quot/stock/export 请求方式:GET
请求参数:
参数名称 | 参数说明 | 是否必须 | 数据类型 | 备注 |
---|---|---|---|---|
当前页 | page | false | Integer | 默认值:1 |
每页大小 | pageSize | false | Integer | 默认值:20 |
响应:excel格式的文件流
1.3 功能实现准备
在stock_common工程下引入easyExcel依赖:
<!--引入easyExcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
调整StockUpdownDomain实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StockUpdownDomain {
@ExcelProperty(value = {"股票涨幅信息统计表","股票编码"},index = 0)
private String code;
@ExcelProperty(value = {"股票涨幅信息统计表","股票名称"},index = 1)
private String name;
@ExcelProperty(value = {"股票涨幅信息统计表","前收盘价格"},index = 2)
private BigDecimal preClosePrice;
@ExcelProperty(value = {"股票涨幅信息统计表","当前价格"},index= 3)
private BigDecimal tradePrice;
@ExcelProperty(value = {"股票涨幅信息统计表","涨跌"},index= 4)
private BigDecimal increase;
@ExcelProperty(value = {"股票涨幅信息统计表","涨幅"},index= 5)
private BigDecimal upDown;
@ExcelProperty(value = {"股票涨幅信息统计表","振幅"},index= 6)
private BigDecimal amplitude;
@ExcelProperty(value = {"股票涨幅信息统计表","交易总量"},index = 7)
private Long tradeAmt;
@ExcelProperty(value = {"股票涨幅信息统计表","交易总金额"},index = 8)
private BigDecimal tradeVol;
@ExcelProperty(value = {"股票涨幅信息统计表","日期"},index = 9)
@DateTimeFormat("yyy-MM-dd HH:mm")//easyExcel的注解-》excel
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")//springmvc支持的注解-》json格式数据
private Date curDate;
}
详见:day03\资料\后端资料\easyExcel修饰\StockUpdownDomain.java
2、涨幅信息数据导出功能实现
2.1 定义web访问方法
/**
* 将指定页的股票数据导出到excel表下
* @param response
* @param page 当前页
* @param pageSize 每页大小
*/
@GetMapping("/stock/export")
public void stockExport(HttpServletResponse response,Integer page,Integer pageSize){
stockService.stockExport(response,page,pageSize);
}
2.2 定义服务接口及实现
接口定义:
/**
* 将指定页的股票数据导出到excel表下
* @param response
* @param page 当前页
* @param pageSize 每页大小
*/
void stockExport(HttpServletResponse response, Integer page, Integer pageSize);
接口实现:
/**
* 将指定页的股票数据导出到excel表下
* @param response
* @param page 当前页
* @param pageSize 每页大小
*/
@Override
public void stockExport(HttpServletResponse response, Integer page, Integer pageSize) {
try {
//1.获取最近最新的一次股票有效交易时间点(精确分钟)
Date curDate = DateTimeUtil.getLastDate4Stock(DateTime.now()).toDate();
//因为对于当前来说,我们没有实现股票信息实时采集的功能,所以最新时间点下的数据
//在数据库中是没有的,所以,先临时指定一个假数据,后续注释掉该代码即可
curDate=DateTime.parse("2022-01-05 09:47:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).toDate();
//2.设置分页参数 底层会拦截mybatis发送的sql,并动态追加limit语句实现分页
PageHelper.startPage(page,pageSize);
//3.查询
List<StockUpdownDomain> infos=stockRtInfoMapper.getAllStockUpDownByTime(curDate);
//如果集合为空,响应错误提示信息
if (CollectionUtils.isEmpty(infos)) {
//响应提示信息
RequestInfoUtil.setUtf8(response);
R<Object> r = R.error(ResponseCode.NO_RESPONSE_DATA);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().write(new ObjectMapper().writeValueAsString(r));
return;
}
//设置响应excel文件格式类型
response.setContentType("application/vnd.ms-excel");
//2.设置响应数据的编码格式
response.setCharacterEncoding("utf-8");
//3.设置默认的文件名称
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("stockRt", "UTF-8");
//设置默认文件名称:兼容一些特殊浏览器
response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
//4.响应excel流
EasyExcel
.write(response.getOutputStream(),StockUpdownDomain.class)
.sheet("股票信息")
.doWrite(infos);
} catch (IOException e) {
e.printStackTrace();
log.info("当前导出数据异常,当前页:{},每页大小:{},异常信息:{}",page,pageSize,e.getMessage());
}
}
2.3 访问测试效果
测试方式:
-
通过浏览器直接访问http://localhost/aip/quot/stock/export?page=1&pageSize=20,可直接获取stockRt.xlsx文件
-
通过前端点击按钮获取,则会获取其它名称的文件,因为前端对文件进行了重命名操作;
最终效果: