EasyExcel

依赖配置:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel<artifactId>
    <version>2.2.0-beta2</version>
</dependency>

实体类配置:

@Data
public class SubjectEeVo {

    @ExcelProperty(value = "id" ,index = 0)
    private Long id;

    @ExcelProperty(value = "课程分类名称" ,index = 1)
    private String title;

    @ExcelProperty(value = "上级id" ,index = 2)
    private Long parentId;

    @ExcelProperty(value = "排序" ,index = 3)
    private Integer sort;

}

导入时,需要配置监听器

@Component
public class SubjectListener extends AnalysisEventListener<SubjectEeVo> {
    @Resource
    private SubjectMapper dictMapper;
    //一行一行读取
    @Override
    public void invoke(SubjectEeVo subjectEeVo, AnalysisContext analysisContext) {
        //调用方法添加数据库
        Subject subject = new Subject();
        BeanUtils.copyProperties(subjectEeVo,subject);
        dictMapper.insert(subject);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

导入业务:

 @PostMapping("importData")
    public Result importData(MultipartFile file) {
        subjectService.importDictData(file);
        return Result.ok();
    }
    /**
           * 导入
    */
    @Override
    public void importDictData(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(),
                    SubjectEeVo.class,subjectListener).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

导出业务:

 @GetMapping(value = "/exportData")
    public void exportData(HttpServletResponse response) {
        subjectService.exportData(response);
    } 
    /**
     * 导出课表
     * @param response
     */
    @Override
    public void exportData(HttpServletResponse response) {

        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("课程分类", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
            List<Subject> dictList = baseMapper.selectList(null);
            List<SubjectEeVo> dictVoList = dictList.stream().map(sub -> {
                SubjectEeVo subjectEeVo = new SubjectEeVo();
                BeanUtils.copyProperties(sub, subjectEeVo);
                return subjectEeVo;
            }).collect(Collectors.toList());
            EasyExcel.write(response.getOutputStream(), SubjectEeVo.class)
                    .sheet("课程分类").doWrite(dictVoList);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

曲线图:

<template>
    <div class="app-container">
      <!--表单-->
      <el-form :inline="true" class="demo-form-inline">
        <el-form-item>
          <el-date-picker
            v-model="startDate"
            type="date"
            placeholder="选择开始日期"
            value-format="yyyy-MM-dd" />
        </el-form-item>
        <el-form-item>     
          <el-date-picker
            v-model="endDate"
            type="date"
            placeholder="选择截止日期"
            value-format="yyyy-MM-dd" />
        </el-form-item>
        <el-button
          :disabled="btnDisabled"
          type="primary"
          icon="el-icon-search"
          @click="showChart()">查询</el-button>
      </el-form>
      <div id="chart" class="chart" style="height:500px;" />
    </div>
  </template>
  <script>
  import echarts from 'echarts'
  import api from '@/api/vod/videoVisitor'
  
  export default {
    data() {
      return {
        courseId: '',
        startDate: '',
        endDate: '',
        btnDisabled: false
      }
    },
    created() {
      this.courseId = this.$route.params.id
      // 初始化最近十天数据
      let currentDate = new Date();
      this.startDate = this.dateFormat(new Date(currentDate.getTime()-7*24*3600*1000))
      this.endDate = this.dateFormat(currentDate)
      this.showChart()
    },
    methods: {
      showChart() {
        api.findCount(this.courseId, this.startDate, this.endDate).then(response => {
          this.setChartData(response.data)
        })
      },
      setChartData(data) {
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('chart'))
        // 指定图表的配置项和数据
        var option = {
          title: {
            text: '观看课程人数统计'
          },
          xAxis: {
            data: data.xData
          },
          yAxis: {
            minInterval: 1
          },
          series: [{
            type: 'line',
            data: data.yData
          }]
        }
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option)
      },
      dateFormat(date) {
        let fmt = 'YYYY-mm-dd'
        let ret;
        const opt = {
          "Y+": date.getFullYear().toString(),        //
          "m+": (date.getMonth() + 1).toString(),     //
          "d+": date.getDate().toString(),            //
          "H+": date.getHours().toString(),           //
          "M+": date.getMinutes().toString(),         //
          "S+": date.getSeconds().toString()          //
          // 有其他格式化字符需求可以继续添加,必须转化成字符串
        };
        for (let k in opt) {
          ret = new RegExp("(" + k + ")").exec(fmt);
          if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
          };
        };
        return fmt;
      }
    }
  }
  </script>

 

posted @ 2023-07-22 13:34  jessi呀  阅读(201)  评论(0编辑  收藏  举报