实现导入Excel表导入数据库并显示在echarts图形上面

实现导入Excel表导入数据库并显示在echarts图形上面

页面效果:

在这里插入图片描述

前端是使用:https://docs.sheetjs.com/
sheetjs 读取excel表里面的数据转化为 json数据

<script type="text/javascript">
  // 读取本地excel文件
  function readWorkbookFromLocalFile(file) {
    var reader = new FileReader();
    reader.onload = function(e) {
      var data = e.target.result;
      var workbook = XLSX.read(data, {type: 'binary'});
      // 处理excel文件
      handle(workbook);
    };
    reader.readAsBinaryString(file);
    //通过FileReader对象读取文件,利用js-xlsx转成json数据
    //FileReader共有4种读取方法:
    //1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。
    //2.readAsBinaryString(file):将文件读取为二进制字符串
    //3.readAsDataURL(file):将文件读取为Data URL
    //4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'
  }

  // 处理excel文件
  var date1=[];
  var date2=[];
  function handle(workbook) {
    // workbook.SheetNames[0] excel第一个sheet
    var datas = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
    var title=[];
    if(datas.length > 0){
      // 获取列名是汇总列名,避免某行某个字段没有值,会缺少字段
      // 标题

      // 获取每行数据
      first:
              for(var index in datas){ // datas数组,index为索引
                second:
                        for(var key in datas[index]){ // datas[index]对象,key为键
                          if (-1 === title.indexOf(key)) {
                            title.push(key);

                          }
                        }
              }
      // 数据
      console.log(datas);
      for(var i=0;i<datas.length;i++){
        date1[i]=datas[i].time;
        date2[i]=datas[i].sum;
      }
      aaa();
      bbb(datas);
    }

  }

然后把拿到的json数据返回到后端进行批量新增

/**
     * 导入
     * @param times
     */
    @PostMapping
    private void save(@RequestBody Times[] times){
        for (Times time : times) {
            timesService.save(time);
        }

    }

后端还写了一个 查询全部数据的方法 用于前端图形数据的在展示

/**
 * 查询所有
 */
@GetMapping
public List<Times> list(){
    return timesService.list();
}

这个方法 的调用写在了 前端的body里面 这样可以在打开页面的时候允许这个查询的方法,意思就是说打开页面 图形就去获取数据库的数据 从而显示

在这里插入图片描述

最后还有一个导出的功能

导出的功能是使用了 阿里的 easyexcel 下面是jar包

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.3</version>
</dependency>

直接上代码:

  /**
     * 导出excel
     * @param response
     */
    @SneakyThrows(IOException.class)
    @GetMapping("/easyExcel")
    public void easyExcel(HttpServletResponse response){
        System.out.println("2222222222222222222222222222222222222222222222222222");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //设置响应内容类型
        response.setCharacterEncoding("utf-8");//编码
        // 设置文件名, ps:把字符串中所有的'+'替换成'%20',在URL中%20代表空格
        String fileName = URLEncoder.encode("用户信息表", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        List<Times> applicantByPage = timesService.list();// 获取全部用户数据
        ExcelWriter writer = EasyExcel.write(response.getOutputStream(), Times.class).build();//获取写出流
        WriteSheet sheet = EasyExcel.writerSheet("用户").build();//创建表格,设置表格页名称
        writer.write(applicantByPage, sheet);//读出
        writer.finish();//关闭流
    }

你需要导出的实体类也要加上注释

@Data
@ContentRowHeight(18)//内容行高
@HeadRowHeight(25)//标题行高
@ColumnWidth(20)//列宽,可设置成员变量上
public class Times {
    @ExcelProperty("用户编号")
    private int id;
    @ExcelProperty("用户时间")
    private String time;
    @ExcelProperty("用户人数")
    private String sum;
}

最后附上所有前端代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>ECharts</title>
  <!-- 引入 echarts.js -->
  <script src="../static/js/echarts.min.js"></script>
  <script src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script>
  <script src="js/jquery.js"></script>
  <script src="../static/js/axios.js"></script>
</head>

<body onload="ccc()">
<!--input file打开文件选择框,获取文件信息,并传参给readWorkbookFromLocalFile函数-->
<form>
  <input type="file" name="file" onchange="readWorkbookFromLocalFile(this.files[0])"/>
  <a href="http://localhost:8081/times/easyExcel">导出</a>
</form>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="display: block;width: 500px;height:350px;"></div>
<div  id="main2" style="width: 500px;height:350px;"></div>



<script type="text/javascript">
  // 读取本地excel文件
  function readWorkbookFromLocalFile(file) {
    var reader = new FileReader();
    reader.onload = function(e) {
      var data = e.target.result;
      var workbook = XLSX.read(data, {type: 'binary'});
      // 处理excel文件
      handle(workbook);
    };
    reader.readAsBinaryString(file);
    //通过FileReader对象读取文件,利用js-xlsx转成json数据
    //FileReader共有4种读取方法:
    //1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。
    //2.readAsBinaryString(file):将文件读取为二进制字符串
    //3.readAsDataURL(file):将文件读取为Data URL
    //4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'
  }

  // 处理excel文件
  var date1=[];
  var date2=[];
  function handle(workbook) {
    // workbook.SheetNames[0] excel第一个sheet
    var datas = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
    var title=[];
    if(datas.length > 0){
      // 获取列名是汇总列名,避免某行某个字段没有值,会缺少字段
      // 标题

      // 获取每行数据
      first:
              for(var index in datas){ // datas数组,index为索引
                second:
                        for(var key in datas[index]){ // datas[index]对象,key为键
                          if (-1 === title.indexOf(key)) {
                            title.push(key);

                          }
                        }
              }
      console.log(datas);


      //时间转化,并把datas中数据分列
      for(var i=0;i<datas.length;i++){
        date1[i]=datas[i].time;
        date2[i]=datas[i].sum;
      }

      //

      // console.log(date2);
      aaa();
      bbb(datas);
    }

  }

</script>
<script>

  var data;


  /**
   * 导入数据库的方法
   * @param datas
   */
  function bbb(datas){
    axios({
      method:"post",
      url:"http://localhost:8081/times",
      dataType:"json",
      data:datas
    }).then(function (resp){
        alert("导入数据库成功!")
    })
  }
  function ccc(){
    var _this=this;
    axios({
      method:"get",
      url:"http://localhost:8081/times",
    }).then(function (resp){
        console.log(resp.data)
      this.data=resp.data
      for(var i=0;i<data.length;i++){
        date1[i]=data[i].time;
        date2[i]=data[i].sum;
      }
      aaa()
    })
  }

</script>


<script type="text/javascript">
  // 基于准备好的dom,初始化echarts实例
  function aaa()
  {
    var da = date1.map((time, i) => ({ time, sum: date2[i] }))
    console.log(da);
    var _this=this;

    console.log(_this.data)
    console.log(_this.date1)
    console.log(_this.date2)
    var myChart = echarts.init(document.getElementById('main'));
    var myChart2 = echarts.init(document.getElementById('main2'));

    //饼状图
    var option2;
      option2 = {
      title: {
        text: 'Referer of a Website',
        subtext: 'Fake Data',
        left: 'center'
      },
      tooltip: {
        trigger: 'item'
      },
      legend: {
        orient: 'vertical',
        left: 'left'
      },
      series: [
        {
          name: 'Access From',
          type: 'pie',
          radius: '50%',
          data:_this.date1 ,
          emphasis: {
            itemStyle: {
              shadowBlur: 10,
              shadowOffsetX: 0,
              shadowColor: 'rgba(0, 0, 0, 0.5)'
            }
          }
        },
      ]
    };

    // 指定图表的配置项和数据
    option = {
      //鼠标放上去 有数据提示
      tooltip: {
        trigger: 'axis',
        position: function (pt) {
          return [pt[0], '10%'];
        }
      },
      //标题
      title: {
        left: 'center',
        text: '作业',
      },
      //右上角的工具栏
      toolbox: {
        feature: {
          dataZoom: {
            yAxisIndex: 'none'
          },
          restore: {},
          saveAsImage: {}
        }
      },
      //x轴的数据
      xAxis: {
        type: 'category',
        boundaryGap: false,
        /**
         * 给x轴赋予数据
         */
        data: date1
      },
      //显示的配置
      yAxis: {
        type: 'value',
        boundaryGap: [0, '100%']  //已百分之百显示
      },
      //y轴的数据
      series: [
        {
          type: 'line',
          data: date2
        }
      ]
    };

    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
    myChart2.setOption(option2);
  }

</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值