股票数据报表与导出

YangeIT大约 17 分钟今日指数SpringBoot

股票数据报表与导出

目标

  1. 🎯任务7:理解涨幅榜业务需求🍐✏️
  2. 理解涨停跌停概念,并涨停跌停基本实现;
  3. 理解涨停跌停SQL分析流程,并根据接⼝⽂档⾃定义实现;
  4. 理解echartJs数据格式✏️🚀
  5. 🎯任务8:掌握easyExcel基本使⽤,并实现涨幅榜数据导出功能🍐✏️
    1. 掌握easyExcel基本使⽤(基本导出、高级设置)
    2. 实现涨幅榜数据导出

1. 股票涨幅统计

1.1 涨幅榜更多数据功能实现 🎯此任务是导出Excel任务的基础

涨幅榜更多数据功能实现

image
image

代码操作

  1. 实体类封装
  2. 查询记录实体封装

在stock_common⼯程下封装查询⾏记录数据:StockUpdownDomain.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel("个股涨幅榜数据封装对象")
public class StockUpdownDomain {
    @ApiModelProperty("股票编码")
    @ExcelProperty(value = {"股票涨幅信息统计表","股票编码"},index = 0)
    private String code;

    @ApiModelProperty("股票名称")
    @ExcelProperty(value = {"股票涨幅信息统计表","股票名称"},index = 1)
    private String name;

    @ApiModelProperty("前收盘价格")
    @ExcelProperty(value = {"股票涨幅信息统计表","前收盘价格"},index = 2)
    private BigDecimal preClosePrice;

    @ApiModelProperty("当前价格")
    @ExcelProperty(value = {"股票涨幅信息统计表","当前价格"},index = 3)
    private BigDecimal tradePrice;
    @ApiModelProperty("涨跌值")
    @ExcelProperty(value = {"股票涨幅信息统计表","涨跌值"},index = 4)
    private BigDecimal increase;
    @ApiModelProperty("涨幅")
    @ExcelProperty(value = {"股票涨幅信息统计表","涨幅"},index = 5)
    private BigDecimal upDown;
    @ApiModelProperty("振幅")
    @ExcelProperty(value = {"股票涨幅信息统计表","振幅"},index = 6)
    private BigDecimal amplitude;
    @ApiModelProperty("交易量")
    @ExcelProperty(value = {"股票涨幅信息统计表","交易量"},index = 7)
    private Long tradeAmt;
    @ApiModelProperty("交易金额")
    @ExcelProperty(value = {"股票涨幅信息统计表","交易金额"},index = 8)
    private BigDecimal tradeVol;

    /**
    * 日期
    */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")//springmvc的注解-》json格式数据
    @ApiModelProperty("交易时间")
    @DateTimeFormat("yyyy-MM-dd HH:mm")
    @ExcelProperty(value = {"股票涨幅信息统计表","交易时间"},index = 9)
    private Date curDate;
}

  1. 封装分⻚实体类

分⻚实体类是前端响应对象,我们维护到stock_backend⼯程下即可;

分⻚实体对象的数据来⾃分⻚PageInfo对象,所以我们在构造器中传⼊PageInfo直接转化即可:PageResult.java

分⻚实体类维护到stock_backend下vo/resp下即可------>直接导⼊:day03\资料\后端资料\PageResult.java;


  /**
  * 分页工具类
  */
  @Data
  public class PageResult<T> implements Serializable {
      /**
      * 总记录数
      */
      private Long totalRows;

      /**
      * 总页数
      */
      private Integer totalPages;

      /**
      * 当前第几页
      */
      private Integer pageNum;
      /**
      * 每页记录数
      */
      private Integer pageSize;
      /**
      * 当前页记录数
      */
      private Integer size;
      /**
      * 结果集
      */
      private List<T> rows;

      /**
      * 分页数据组装
      * @param pageInfo
      * @return
      */
      public PageResult(PageInfo<T> pageInfo) {
          totalRows = pageInfo.getTotal();
          totalPages = pageInfo.getPages();
          pageNum = pageInfo.getPageNum();
          pageSize = pageInfo.getPageSize();
          size = pageInfo.getSize();
          rows = pageInfo.getList();
      }
  }

1.2 涨幅榜功能实现🎯当做作业,做完其他任务在做

涨幅榜功能实现

  • 原型需求
image
image
  • 表结构 image

参考答案点击这里查看(需要密码)open in new window👈part3_涨幅榜(前10条)代码实现.txt

1.3 涨停跌停数据统计功能 🎯 当做作业,难度大,最后做

涨停跌停数据统计功能

image
image
  • 说明:
  1. A股市场有涨幅±10%限制;
  2. 股票是否涨停和跌停并不以我们的统计结果为基准,⽽是由证券交易所来确定,可能真实情况是涨幅超过10%或者低于-10%;

代码操作

  1. 查询数据组装思路
  • 涨跌停数据包含了涨停统计数据和跌停统计数据,⽽每个数据组中的元素⼜仅仅包含时间和数量,这些数据是⾼度聚合得出的结果,所以我们可以把每组数据封装到map下,数据类型为:Map<String,List>
  • 涨停统计SQL和跌停统计的SQL除了条件外,结构是⼀致的,我们可定义⼀个flag标识,mapper中传⼊时,0代表涨停,1代表跌停;

2. EasyExcel入门 🎯

EasyExcel入门

传统操作Excel⼤多都是利⽤Apach POI进⾏操作的,但是POI框架并不完善,使⽤过程⾮常繁琐且有较多的缺陷:

  • 动态操作Excel⾮常繁琐,对于新⼿来说,很难在短时间内上⼿;

  • 读写时需要占⽤较⼤的内存,当数据量⼤时容易发⽣内存溢出问题(OOM);

    基于上述原因,阿⾥开源出⼀款易于上⼿,且⽐较节省内存的Excel框架:EasyExcel 官⽹地址:https://www.yuque.com/easyexcel/doc/easyexcelopen in new window

<!--引⼊easyexcel-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>3.0.4</version>
</dependency>

注意:

  1. easyExcel底层也是使⽤POI实现的;

  2. ⽬前版本与JDK8较为契合,⾼版本的JDK可能会出现兼容性问题

代码实操

步骤

  1. EasyExcel导出数据快速⼊⻔
  2. EasyExcel导出数据⾼级设置
  1. 构建测试实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements Serializable {
 private String userName;
 private Integer age;
 private String address;
 private Date birthday;
}
  1. 数据导出到excel
public class TestEasyExcel {
  public List<User> init(){
      //组装数据
      ArrayList<User> users = new ArrayList<>();
      for (int i = 0; i < 10; i++) {
          User user = new User();
          user.setAddress("上海"+i);
          user.setUserName("张三"+i);
          user.setBirthday(new Date());
          user.setAge(10+i);
          users.add(user);
          }
      return users;
    }
 /**
 * 直接导出后,表头名称默认是实体类中的属性名称
 */
 @Test
 public void test02(){
    List<User> users = init();
    //不做任何注解处理时,表头名称与实体类属性名称⼀致
    EasyExcel.write("C:\\Users\\46035\\Desktop\\ex\\⽤户.xls",User.class).sheet("⽤户信息").doWrite(users);
 }
}
效果
效果
  1. ⾃定义表头

修改User实体类,设置表头数据和排序规则

/**
 * 通过注解⾃定义表头名称 注解添加排序规则,值越⼤ 越靠近右边
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements Serializable {
 @ExcelProperty(value = {"⽤户名"},index = 1)
 private String userName;
 @ExcelProperty(value = {"年龄"},index = 2)
 private Integer age;
 @ExcelProperty(value = {"地址"} ,index = 4)
 private String address;
 @ExcelProperty(value = {"⽣⽇"},index = 3)
 private Date birthday;
}
导出效果图
导出效果图

4. 股票涨幅数据导出 🎯

股票涨幅数据导出

通过点击【导出数据】按钮,将当前⻚的数据导出到excel下:

image
image

代码操作

  1. 在stock_common⼯程下引⼊easyExcel依赖:
<!--引⼊easyExcel-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
</dependency>
  1. 调整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

面试点:

  1. 使用读取百万级的Excel数据,且不发生OOM问题?
    • 使用POI,一次性全量读--->OOM
    • EasyExcel读取-->基于事件机制逐行扫描数据-->逐行处理后,只要对象不被引用,可被jvm快速垃圾回收,避免OOM(内存溢出)
  2. 测试excel文件导入?-练习题
    • 参考:easyExcel官网
  3. lombok底层实现原理?@Data @Slf4j等;
    • 底层编译期间通过字节码技术动态为class字节码插入增强的相关代码(增强的时机:编译期);