zoukankan      html  css  js  c++  java
  • 批量导入数据(excel模板文件方式)

    批量导入数据:
    
    1.在webapp下的template文件下导入excel模板文件
    
    1.前端:提供下载模板文件
        <!DOCTYPE html>
        <html>
            <head>
                <!-- 页面meta -->
                <meta charset="utf-8">
                <meta http-equiv="X-UA-Compatible" content="IE=edge">
                <title>传智健康</title>
                <meta name="description" content="传智健康">
                <meta name="keywords" content="传智健康">
                <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport">
                <!-- 引入样式 -->
                <link rel="stylesheet" href="../plugins/elementui/index.css">
                <link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css">
                <link rel="stylesheet" href="../css/style.css">
                <link rel="stylesheet" href="../css/orderset.css">
                <!-- 引入组件库 -->
                <script src="../js/vue.js"></script>
                <script src="../plugins/elementui/index.js"></script>
                <script type="text/javascript" src="../js/jquery.min.js"></script>
                <script src="../js/axios-0.18.0.js"></script>
            </head>
            <body class="hold-transition">
            <div id="app">
                <div class="content-header">
                    <h1>预约管理<small>预约设置</small></h1>
                    <el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb">
                        <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
                        <el-breadcrumb-item>预约管理</el-breadcrumb-item>
                        <el-breadcrumb-item>预约设置</el-breadcrumb-item>
                    </el-breadcrumb>
                </div>
                <div class="app-container">
                    <div class="box">
                        <div class="box ordersetting">
                            <el-card class="box-card">
                                <div class="boxMain">
                                    <el-button style="margin-bottom: 20px;margin-right: 20px" type="primary" @click="downloadTemplate()">模板下载</el-button>
                                    <el-upload action="/ordersetting/upload.do"
                                               name="excelFile"
                                               :show-file-list="false"
                                               :on-success="handleSuccess"
                                               :before-upload="beforeUpload">
                                        <el-button type="primary">上传文件</el-button>
                                    </el-upload>
                                </div>
                                <div>
                                    操作说明:请点击"模板下载"按钮获取模板文件,在模板文件中录入预约设置数据后点击"上传文件"按钮上传模板文件。
                                </div>
                            </el-card>
                            <div class="calendar">
                                <!-- 年份 月份 -->
                                <div class="month">
                                    <div class="currentdate">
                                        <span class="choose-year">{{ currentYear }}年</span>
                                        <span class="choose-month">{{ currentMonth }}月</span>
                                    </div>
                                    <div class="choose">
                                        <span @click="goCurrentMonth(currentYear,currentMonth)" class="gotoday">今天</span>
                                        <span @click="pickPre(currentYear,currentMonth)">?</span>
                                        <span @click="pickNext(currentYear,currentMonth)">?</span>
                                    </div>
                                    <div class="clearfix"></div>
                                </div>
                                <!-- 星期 -->
                                <div class="caldate">
                                    <ul class="weekdays">
                                        <li>周一</li>
                                        <li>周二</li>
                                        <li>周三</li>
                                        <li>周四</li>
                                        <li>周五</li>
                                        <li>周六</li>
                                        <li>周日</li>
                                    </ul>
                                    <!-- 日期 -->
                                    <ul class="days">
                                        <!-- v-for循环 每一次循环用<li>标签创建一天 -->
                                        <li v-for="dayobject in days">
                                            <template>
                                                <!-- 非当前月份 -->
                                                <div class="other-month" v-if="dayobject.day.getMonth()+1 != currentMonth">
                                                    {{ dayobject.day.getDate() }}
                                                </div>
                                                <!-- 当前月 -->
                                                <div class="everyday" v-if="dayobject.day.getMonth()+1 == currentMonth">
                                                    <span class="datenumber">{{ dayobject.day.getDate()}}</span>
                                                    
                                                    <template>
                                                        <template v-for="obj in leftobj">
                                                            <template v-if="obj.date == dayobject.day.getDate()">
                                                                <template v-if="obj.number > obj.reservations">
                                                                    <div class="usual">
                                                                        <p>可预约{{obj.number}}人</p>
                                                                        <p>已预约{{obj.reservations}}人</p>
                                                                    </div>
                                                                </template>
                                                                <template v-else>
                                                                    <div class="fulled">
                                                                        <p>可预约{{obj.number}}人</p>
                                                                        <p>已预约{{obj.reservations}}人</p>
                                                                        <p>已满</p>
                                                                    </div>
                                                                </template>
                                                            </template>
                                                        </template>
                                                        <button v-if="dayobject.day > today" @click="handleOrderSet(dayobject.day)" class="orderbtn">设置</button>
                                                    </template>
                                                    
                                                </div>
                                            </template>
                                        </li>
                                    </ul>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            </body>
            <!-- 引入组件库 -->
            <script src="../js/vue.js"></script>
            <script src="../plugins/elementui/index.js"></script>
            <script type="text/javascript" src="../js/jquery.min.js"></script>
            <script>
                new Vue({
                    el: '#app',
                    data:{
                        today:new Date(),//当前日期
                        currentDay: 1,
                        currentMonth: 1,
                        LocalMonth: 1,
                        currentYear: 1970,
                        currentWeek: 1,
                        days: [],
                        leftobj: []//用于装载页面显示的月份已经进行预约设置的数据
                    },
                    created: function () {//在vue初始化时调用
                        // 1:初始化当前时间对应的日期,在页面上展示日历
                        this.initData(null);
                        // 2:初始化当前月对应的预约设置的数据,把预约设置信息,显示到页面上,对模型leftobj赋值
                        this.createData();
                    },
                    methods: {
                        createData(){
                            // 传递当前月(date=2020-2),返回Map(json形式)
                            axios.get("/ordersetting/findOrderSettingMapByMonth.do?date="+this.currentYear+"-"+this.currentMonth).then(response=>{
                                // 返回Result(flag,message,data) data:Map(map结构的key:date、number、reservations)
                                if(response.data.flag){
                                    this.leftobj = response.data.data; // 组织数据结构
                                    this.$message({
                                        type:"success",
                                        message:response.data.message
                                    })
                                }else{
                                    this.$message({
                                        type:"error",
                                        message:response.data.message
                                    })
                                }
                            }).catch((error)=>{
    
                            })
                        },
                        //预约设置
                        handleOrderSet(day){
                        },
                        //上传之前进行文件格式校验
                        beforeUpload(file){
                            const isXLS = file.type === 'application/vnd.ms-excel';
                            if(isXLS){
                                return true;
                            }
                            const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                            if (isXLSX) {
                                return true;
                            }
                            this.$message.error('上传文件只能是xls或者xlsx格式!');
                            return false;
                        },
                        //下载模板文件
                        downloadTemplate(){
                            window.location.href="../../template/ordersetting_template.xlsx";
                        },
                        //上传成功提示(ElementUI)
                        handleSuccess(response, file) {
                            // 返回Result(flag,message,data)
                            if(response.flag){
                                this.$message({
                                    message: response.message,
                                    type: 'success'
                                });
                            }else{
                                this.$message.error(response.message);
                            }
                            // console.log(response, file, fileList);
                        },
                        //初始化当前页要展示的日期
                        initData: function (cur) {
                            var date;
                            var index = 0;   //控制显示预定的天数
                            if (cur) {
                                date = new Date(cur);
                            } else {
                                var now = new Date();
                                var d = new Date(this.formatDate(now.getFullYear(), now.getMonth()+1, 1));
                                d.setDate(35);
                                date = new Date(this.formatDate(d.getFullYear(), d.getMonth(), 1));
                            }
                            this.currentDay = date.getDate();
                            this.currentYear = date.getFullYear();
                            this.currentMonth = date.getMonth() + 1;
                            this.currentWeek = date.getDay(); // //本月第一天是周几(周日0 周六 6)
                            var today = new Date();
                            this.LocalMonth = today.getMonth() + 1;
                            if (this.currentWeek == 0) {
                                this.currentWeek = 7;
                            }
                            var str = this.formatDate(this.currentYear, this.currentMonth, this.currentDay);
                            this.days.length = 0;
                            // 今天是周日,放在第一行第7个位置,前面6个
                            //初始化本周
                            for (var i = this.currentWeek - 1; i >= 0; i--) {
                                var d = new Date(str);
                                d.setDate(d.getDate() - i);
                                var dayobject = {};
                                dayobject.day = d;
                                var now = new Date();
                                if (d.getDate() === (now.getDate()) && d.getMonth() === now.getMonth() && d.getFullYear() === now.getFullYear()) {
                                    dayobject.index = index++;//从今天开始显示供预定的数量
                                }
                                else if (index != 0 && index < 3)
                                    dayobject.index = index++;//从今天开始3天内显示供预定的数量
                                this.days.push(dayobject);//将日期放入data 中的days数组 供页面渲染使用
                            }
                            //其他周
                            for (var i = 1; i <= 35 - this.currentWeek; i++) {
                                var d = new Date(str);
                                d.setDate(d.getDate() + i);
                                var dayobject = {};//dayobject   {day:date,index:2}
                                dayobject.day = d;
                                var now = new Date();
                                if (d.getDate() === (now.getDate()) && d.getMonth() === now.getMonth() && d.getFullYear() === now.getFullYear()) {
                                    dayobject.index = index++;
                                }
                                else if (index != 0 && index < 3)
                                    dayobject.index = index++;
                                this.days.push(dayobject);
                            }
                            
                            /**this.leftobj = [
                                { date: 1, number: 120, reservations: 1 },
                                { date: 3, number: 120, reservations: 1 },
                                { date: 4, number: 120, reservations: 120 },
                                { date: 6, number: 120, reservations: 1 },
                                { date: 8, number: 120, reservations: 1 }
                            ];*/
                        },
                        //切换到当前月份
                        goCurrentMonth: function (year, month) {
                            var d = new Date();
                            // 初始化日历
                            this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
                            // 初始化当前月的预约设置信息
                            this.createData();
                        },
                        //向前一个月
                        pickPre: function (year, month) {
                            // setDate(0); 上月最后一天
                            // setDate(-1); 上月倒数第二天
                            // setDate(dx) 参数dx为 上月最后一天的前后dx天
                            var d = new Date(this.formatDate(year, month, 1));
                            d.setDate(0);
                            this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
                            // 初始化当前月的预约设置信息
                            this.createData();
                        },
                        //向后一个月
                        pickNext: function (year, month) {
                            var d = new Date(this.formatDate(year, month, 1));
                            d.setDate(35);////获取指定天之后的日期
                            this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
                            // 初始化当前月的预约设置信息
                            this.createData();
                        },
                        // 返回 类似 2016-01-02 格式的字符串
                        formatDate: function (year, month, day) {
                            var y = year;
                            var m = month;
                            if (m < 10) m = "0" + m;
                            var d = day;
                            if (d < 10) d = "0" + d;
                            return y + "-" + m + "-" + d
                        }
                    }
                })
            </script>
        </html>
        
    后端:实体类封装模板文件对应的数据
        1.模板对应的实体类:
            package com.itheima.health.pojo;
    
            import java.io.Serializable;
            import java.util.Date;
    
            /**
             * 预约设置
             */
            public class OrderSetting implements Serializable{
                private Integer id ;
                private Date orderDate;//预约设置日期
                private int number;//可预约人数
                private int reservations ;//已预约人数
    
                public OrderSetting() {
                }
    
                public OrderSetting(Date orderDate, int number) {
                    this.orderDate = orderDate;
                    this.number = number;
                }
    
                public Integer getId() {
                    return id;
                }
    
                public void setId(Integer id) {
                    this.id = id;
                }
    
                public Date getOrderDate() {
                    return orderDate;
                }
    
                public void setOrderDate(Date orderDate) {
                    this.orderDate = orderDate;
                }
    
                public int getNumber() {
                    return number;
                }
    
                public void setNumber(int number) {
                    this.number = number;
                }
    
                public int getReservations() {
                    return reservations;
                }
    
                public void setReservations(int reservations) {
                    this.reservations = reservations;
                }
            }
    
    2.Controller
        package com.itheima.health.controller;
    
        import com.alibaba.dubbo.config.annotation.Reference;
        import com.itheima.health.constant.MessageConstant;
        import com.itheima.health.entity.Result;
        import com.itheima.health.pojo.OrderSetting;
        import com.itheima.health.service.OrderSettingService;
        import com.itheima.health.utils.POIUtils;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RestController;
        import org.springframework.web.multipart.MultipartFile;
    
        import java.util.ArrayList;
        import java.util.Date;
        import java.util.List;
        import java.util.Map;
    
        /**
         * @ClassName OrderSettingContoller
         * @Description TODO
         * @Author ly
         * @Company 深圳黑马程序员
         * @Date 2020/2/13 16:04
         * @Version V1.0
         */
        @RestController
        @RequestMapping(value = "/ordersetting")
        public class OrderSettingContoller {
    
            @Reference// 订阅 dubbo注解
            OrderSettingService orderSettingService;
    
            // 批量导入预约设置(通过Excel完成)
            @RequestMapping(value = "/upload")
            public Result upload(MultipartFile excelFile){
                try {
                    // 读取Excel文件,并批量导入到数据库
                    List<String[]> list = POIUtils.readExcel(excelFile);
                    // 将List<String[]>集合,转换成List<OrderSetting>
                    if(list!=null && list.size()>0){
                        List<OrderSetting> orderSettingList = new ArrayList<>();
                        for (String[] strings : list) {
                            OrderSetting orderSetting = new OrderSetting(new Date(strings[0]),Integer.parseInt(strings[1]));
                            orderSettingList.add(orderSetting);
                        }
                        // 批量导入
                        orderSettingService.addList(orderSettingList);
                    }
                    return new Result(true, MessageConstant.IMPORT_ORDERSETTING_SUCCESS);
                } catch (Exception e) {
                    e.printStackTrace();
                    return new Result(false, MessageConstant.IMPORT_ORDERSETTING_FAIL);
                }
            }
    
            // 根据传递的年月(2020-2),获取当前月对应的日期数据
            @RequestMapping(value = "/findOrderSettingMapByMonth")
            public Result findOrderSettingMapByMonth(String date){
                try {
                    List<Map<String,Object>> list = orderSettingService.findOrderSettingMapByMonth(date);
                    return new Result(true, MessageConstant.GET_ORDERSETTING_SUCCESS,list);
                } catch (Exception e) {
                    e.printStackTrace();
                    return new Result(false, MessageConstant.GET_ORDERSETTING_FAIL);
                }
            }
        }
    
    2.Service:
        package com.itheima.health.service;
    
        import com.itheima.health.pojo.OrderSetting;
    
        import java.util.List;
        import java.util.Map;
    
        public interface OrderSettingService {
    
            void addList(List<OrderSetting> orderSettingList);
    
            List<Map<String,Object>> findOrderSettingMapByMonth(String date);
        }
    
    impl:
    
            package com.itheima.health.service.impl;
    
            import com.alibaba.dubbo.config.annotation.Service;
            import com.itheima.health.dao.OrderSettingDao;
            import com.itheima.health.pojo.OrderSetting;
            import com.itheima.health.service.OrderSettingService;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.transaction.annotation.Transactional;
    
            import java.util.ArrayList;
            import java.util.HashMap;
            import java.util.List;
            import java.util.Map;
    
            /**
             * @ClassName OrderSettingServiceImpl
             * @Description TODO
             * @Author ly
             * @Company 深圳黑马程序员
             * @Date 2020/2/13 16:03
             * @Version V1.0
             */
            @Service // dubbo提供
            @Transactional
            public class OrderSettingServiceImpl implements OrderSettingService {
    
                @Autowired
                OrderSettingDao orderSettingDao;
    
                @Override
                public void addList(List<OrderSetting> orderSettingList) {
                    // 批量导入
                    if(orderSettingList!=null && orderSettingList.size()>0){
                        for (OrderSetting orderSetting : orderSettingList) {
                            // 判断当前预约设置时间是否已经存在,如果已经存在,执行更新;如果不存在,再执行新增
                            // 1:使用预约设置时间,查询预约设置,判断是否存在
                            long count = orderSettingDao.findOrderSettingCountByOrderDate(orderSetting.getOrderDate());
                            // 2:如果已经存在,执行更新
                            if(count>0){
                                // 根据预约设置时间(orderDate字段),更新最多预约人数(number)
                                orderSettingDao.updateNumberByOrderDate(orderSetting);
                            }
                            // 3:如果不存在,再执行新增
                            else{
                                // 保存预约设置表
                                orderSettingDao.add(orderSetting);
                            }
    
                        }
                    }
                }
    
                @Override
                public List<Map<String,Object>> findOrderSettingMapByMonth(String date) {
                    // 根据当前年月,获取日期(也可以完成)
                    // 开始时间
                    String beginDate = date+"-1";
                    // 结束时间
                    String endDate = date+"-31";
                    // 组织查询条件
                    Map paramsMap = new HashMap();
                    paramsMap.put("beginDate",beginDate);
                    paramsMap.put("endDate",endDate);
                    // 使用查询条件完成查询
                    List<OrderSetting> list = orderSettingDao.findOrderSettingByMonthBetween(paramsMap);
                    // 组织需要返回的数据
                    List<Map<String,Object>> mapList = new ArrayList<>();
                    if(list!=null && list.size()>0){
                        for (OrderSetting orderSetting : list) {
                            Map<String,Object> map = new HashMap<>();
                            map.put("date",orderSetting.getOrderDate().getDate()); // 获取当前日期(1-31)
                            map.put("number",orderSetting.getNumber());
                            map.put("reservations",orderSetting.getReservations());
                            mapList.add(map);
                        }
                    }
                    return mapList;
                }
            }
    
    Dao:
    
        package com.itheima.health.dao;
    
        import com.itheima.health.pojo.OrderSetting;
    
        import java.util.Date;
        import java.util.List;
        import java.util.Map;
    
        public interface OrderSettingDao {
    
            void add(OrderSetting orderSetting);
    
            long findOrderSettingCountByOrderDate(Date orderDate);
    
            void updateNumberByOrderDate(OrderSetting orderSetting);
    
            List<OrderSetting> findOrderSettingByMonthBetween(Map paramsMap);
        }
    
    Dao.xml:
        <?xml version="1.0" encoding="utf-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
        <mapper namespace="com.itheima.health.dao.OrderSettingDao">
    
            <!--新增保存-->
            <insert id="add" parameterType="ordersetting">
                insert into t_ordersetting(orderDate,number,reservations) values (#{orderDate},#{number},#{reservations})
            </insert>
    
            <!--根据预约设置时间,查询预约设置的数量-->
            <select id="findOrderSettingCountByOrderDate" parameterType="date" resultType="long">
                SELECT COUNT(*) FROM t_ordersetting WHERE orderDate = #{orderDate}
            </select>
    
            <!--根据预约设置时间,更新最多预约人数-->
            <update id="updateNumberByOrderDate" parameterType="ordersetting">
                update t_ordersetting set number = #{number} where orderDate = #{orderDate}
            </update>
    
            <!--根据当前年月,查询当前年月对应的预约设置数据(范围查询)-->
            <select id="findOrderSettingByMonthBetween" parameterType="map" resultType="ordersetting">
                SELECT * FROM t_ordersetting WHERE orderDate BETWEEN #{beginDate} AND #{endDate}
            </select>
        </mapper>





    层级结构数据模板:https://blog.csdn.net/zyq1084577627/article/details/78727623




  • 相关阅读:
    git cherrypick 小结
    git 忽略机制
    git revert 小结
    git 忽略机制
    学习 原理图2 电源电路
    git merge 和 git rebase 小结
    git cherrypick 小结
    学习 原理图2 电源电路
    git revert 小结
    使用SMTP发送邮件
  • 原文地址:https://www.cnblogs.com/lyle-liu/p/13034303.html
Copyright © 2011-2022 走看看