下载模板
 
  

userList.jsp
<a href="downloadUserExcel">下载模板</a>
DownloadUserServlet.java
/**
 * 下载
 */
@WebServlet("/downloadUserExcel")
public class DownloadUserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //因为是给前端响应文件,不是字符串,所以需要设置ContentType和Header信息
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("用户导入模板.xls","utf-8"));
        //获得服务器上模板文件的路径
        String path=request.getSession().getServletContext().getRealPath("/upload/template/用户导入模板.xls");
        //按照设置的mime类型和头部信息,把文件响应给前端
        InputStream inputStream=new FileInputStream(path);//定义输入流读取path路径对应的模板文件
        OutputStream outputStream= response.getOutputStream();//定义输出流为响应输出流
        //读取服务器文件 写入到前端响应流
        byte[] buffer=new byte[8*1024];//缓冲区
        int length=-1;//每次读取的实际长度
        while( (length=inputStream.read(buffer)) !=-1){
        outputStream.write(buffer,0,length);
        }
        //关闭字节流
        outputStream.close();
        inputStream.close();
    }
}效果图,下载成功

批量导入
POI的定义
JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel。而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。
POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本,首先去官网下载如下界面:
下载完后,打开“poi-bin-3.15-20160924.tar.gz”获取操作excel需要的jar包,并将这些jar包复制到项目中。对于只操作2003 及以前版本的excel,只需要poi-3.15.jar ,如果需要同时对2007及以后版本进行操作则需要复制
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar

userList.jsp
<form action="userImport" method="post" enctype="multipart/form-data">
    <input type="file" name="userExcel" value="">
    <input type="submit" value="导入">
</form>dao层:UserDao
public interface UserDao {
    //根据用户名查询用户信息
    User selectByName(String uname) throws SQLException;
    //根据用户id查询用户的菜单权限 
    List<Map<String ,Object>> getMenuByUid(int uid)throws SQLException;
    //获取用户表的总条数
    int selectCount() throws SQLException;
    //分页查询
    List<User> selectByPage(int pageNo,int pageSize) throws SQLException;
    //批量导入
    int insert(User user) throws SQLException;
    //批量删除
    int delete(int uid) throws SQLException;
}userDaoImpl实现类
public class UserDaoImpl implements UserDao {
    private QueryRunner queryRunner=new QueryRunner();
    private Connection conn= JDBCUtil.getCon();
    private String sql=null;
    @Override
    public User selectByName(String uname) throws SQLException {
        sql="select * from user where uname=?";
        BeanHandler<User> userBeanHandler=new BeanHandler<>(User.class);
        User user= queryRunner.query(conn,sql,userBeanHandler,uname);
        return user;
    }
    @Override
    public List<Map<String, Object>> getMenuByUid(int uid) throws SQLException {
        sql="select mname from user u " +
                "inner join user_role ur on u.uid=ur.uid " +
                "inner join role_menu rm on ur.rid=rm.rid " +
                "inner join menu m on rm.mid=m.mid " +
                "where u.uid=?";
        MapListHandler mapListHandler=new MapListHandler();
        List<Map<String,Object>> list=queryRunner.query(conn,sql, mapListHandler,uid);
        return list;
    }
    /**
     * 获取用户表的总条数
     * @return
     * @throws SQLException
     */
    @Override
    public int selectCount() throws SQLException {
        sql="select count(uid) num from user";
        MapHandler mapHandler=new MapHandler();
        Map<String, Object> map = queryRunner.query(conn, sql, mapHandler);
        int count=(int) (long)map.get("num");
        return count;
    }
    /**
     * 分页查询
     * @param pageNo
     * @param pageSize
     * @return
     */
    @Override
    public List<User> selectByPage(int pageNo, int pageSize) throws SQLException {
        sql="select * from user limit ?,?";
        BeanListHandler<User> beanListHandler=new BeanListHandler<>(User.class);
        List<User> userList=queryRunner.query(conn,sql,beanListHandler,(pageNo-1)*pageSize,pageSize);
        return userList;
    }
    /**
     * 批量导入
     * @param user
     * @return
     * @throws SQLException
     */
    @Override
    public int insert(User user) throws SQLException {
        sql="insert into user(uname,pwd,address,state) values(?,?,?,?)";
        return queryRunner.update(conn,sql,user.getUname(),user.getPwd(),user.getAddress(),user.getState());
    }
    /**
     * 批量删除
     * @param uid
     * @return
     * @throws SQLException
     */
    @Override
    public int delete(int uid) throws SQLException {
        sql="delete from user where uid =?";
        return queryRunner.update(conn,sql,uid);
    }
}service层:UserService
public interface UserService {
    User selectByName(String uname);
    List<Map<String ,Object>>getMenuByUid(int uid);
    int selectCount();
    //分页查询
    PageResult selectByPage(int pageNo, int pageSize);
    //批量导入
    boolean insertList(List<User> userList);
    boolean deleteList(String[] idList);
}UserServiceImpl实现类
public class UserServiceImpl implements UserService {
    UserDao userDao=new UserDaoImpl();
    @Override
    public User selectByName(String uname) {
        try {
            return userDao.selectByName(uname);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public List<Map<String, Object>> getMenuByUid(int uid) {
        try {
            return userDao.getMenuByUid(uid);
        }catch (SQLException e){
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public int selectCount(){
        try {
            return userDao.selectCount();
        }catch (SQLException e){
            e.printStackTrace();
        }
        return 0;
    }
    @Override
    public PageResult selectByPage(int pageNo, int pageSize) {
        PageResult pageRes=new PageResult();
        pageRes.setPageNo(pageNo);
        pageRes.setPageSize(pageSize);
        try {
            int totalcount = userDao.selectCount();
            List<User> userList = userDao.selectByPage(pageNo, pageSize);
            pageRes.setTotalCount(totalcount);
            pageRes.setPageTotalCount();
            pageRes.setDataList(userList);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pageRes;
    }
    /**
     * 批量导入
     * @param userList
     * @return
     */
    @Override
    public boolean insertList(List<User> userList) {
        int count=0;
        for (User user : userList) {
            try {
                count+= userDao.insert(user);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //判断成功插入的计数 等于 集合大小,说明全部插入
        if(count==userList.size()){
            return true;
        }else{
            return false;
        }
    }
    /**
     * 批量删除
     */
    @Override
    public boolean deleteList(String[] idList) {
        int count=0;
        for (String id : idList) {
            //把字符串id转换为整数uid
            int uid = Integer.parseInt(id);
            try {
                int n = userDao.delete(uid);
                count+=n;//把每次删除受影响的行数累加
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //累加成功的行数 和 数组长度一致,说明全部删除成功
        if(count==idList.length){
            return true;
        }else{
            //事务回滚
            return false;
        }
    }
}ExcelUtil.java批量导入工具类
public class ExcelUtil {
    public static List<User> getUserListFromExcel(String fileName, InputStream inputStream) throws IOException {
        List<User> userList = new ArrayList<>();
        //判断文件名后缀是否为excel
        if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) {
            //判断是否为老版本.xls
            boolean flag = fileName.endsWith(".xls");
            //poi中对待两种版本的excel会有不同的类进行处理,创建工作簿
            Workbook workbook = flag ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
            //获取工作簿中第一张sheet
            Sheet sheet = workbook.getSheetAt(0);
            //如果sheet表中物理行 大于2说明有数据
            if (sheet.getPhysicalNumberOfRows() > 2) {
                //从索引2 即第三行 开始循环所有表中的行
                for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
                    //根据索引获得当前行
                    Row row = sheet.getRow(i);
                    //获取行中的索引 0的列,即第一列
                    Cell cell0 = row.getCell(0);
                    cell0.setCellType(Cell.CELL_TYPE_STRING);//设置列格式为文本类型
                    //获取列中的字符串并打印
                    String uname = cell0.getStringCellValue();
                    Cell cell1 = row.getCell(1);
                    cell1.setCellType(Cell.CELL_TYPE_STRING);//设置列格式为文本类型
                    String pwd = cell1.getStringCellValue();
                    Cell cell2 = row.getCell(2);
                    cell2.setCellType(Cell.CELL_TYPE_STRING);//设置列格式为文本类型
                    String address = cell2.getStringCellValue();
                    Cell cell3 = row.getCell(3);
                    int state = 0;
                    if (cell3.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                        state = (int) cell3.getNumericCellValue();
                        if (state >= 1) {
                            state = 1;
                        } else {
                            state = 0;
                        }
                    }
                    //定义user对象,把行中的每一列的数据存储到对象中
                    User user = new User();
                    Digester md5 = new Digester(DigestAlgorithm.MD5);
                    user.setUname(uname);
                    user.setPwd(md5.digestHex(pwd));
                    user.setAddress(address);
                    user.setState(state);
                    //再把user对象存入到集合中
                    userList.add(user);
                }
            }
        }
        return userList;
    }
}servlet层:UserImportServlet.java
/**
 * 导入
 */
@WebServlet("/userImport")
@MultipartConfig
public class UserImportServlet extends HttpServlet {
    UserService userService=new UserServiceImpl();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户提交的Excel文件
        Part userExcel =request.getPart("userExcel");
        //获得提交的文件名
        String fileName = userExcel.getSubmittedFileName();
        //调用工具类进行excel文件解析
        List<User> userList= ExcelUtil.getUserListFromExcel(fileName,userExcel.getInputStream());
        //System.out.println(userList);
        boolean mark = userService.insertList(userList);
        if(mark){
            response.sendRedirect("userList");
        }
    }
}效果图

echars图表
ECharts最基本的代码结构:
 引入js文件,DOM容器,初始化对象,设置option
 X轴数据:
 数组1:[‘张三’,‘李四’,‘王五’,‘闰土’,‘小明’,‘茅台’,‘二妞’,‘大强’]
 Y轴数据:
 数组2:[88,92,63,77,94,80,72,86]
 图表类型:在series设置type:bar //bar是柱状图,line是线状,pie是饼状
- 最大值/ 最小值 markPoint
- 平均值 markLine
- 数值显示 label
- 柱宽度 barWidth
 
代码示例
 
 
ComplainChart.java
package com.zhan.nationaltax.servlet.front.complain;
import com.alibaba.fastjson.JSON;
import com.zhan.nationaltax.service.ComplainService;
import com.zhan.nationaltax.service.impl.ComplainServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/nsfw/complainChart.do")
public class ComplainChart extends HttpServlet {
    ComplainService complainService = new ComplainServiceImpl();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String year = request.getParameter("year");
        List<Map<String,Object>> mapList = complainService.selectCountByYear(year);
//        for (Map<String, Object> map : mapList) {
//            System.out.println(map.get("month")+"---"+map.get("num"));
//        }
//        List<int[]> data = new ArrayList<>();
        int[] month = new int[mapList.size()];
        int[] num = new int[mapList.size()];
        for (int i = 0; i < mapList.size(); i++) {
            month[i] = Integer.parseInt(mapList.get(i).get("month").toString());
            num[i] = Integer.parseInt(mapList.get(i).get("num").toString());
        }
        Map<String, Object> data = new HashMap<>();
        data.put("month",month);
        data.put("num",num);
        response.getWriter().println(JSON.toJSON(data));
//        for (int i:month) {
//            System.out.println(i);
//        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
ChartTest.jsp
<%--
  Created by IntelliJ IDEA.
  User: chz
  Date: 2023/6/9
  Time: 22:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>chart入门</title>
    <script src="js/jquery.min.js"></script>
    <script src="js/echarts/echarts.min.js"></script>
    <style>
        #container{
            width: 800px;
            height: 600px;
        }
    </style>
</head>
<body>
<div style="text-align:center;width:100%;">
    <select id="year" name="year" onchange="doAnnualStatistic()"></select>
</div>
<!--创建个容器 -->
<div id="container"></div>
</body>
<script>
    $(function () {
        //文档就绪后动态生成当前年份的后五年
        var currentYear = new Date().getFullYear(); // 拿到当前的年份
        for (var i = currentYear ; i > currentYear- 5 ; i -- ){
            $("#year").append('<option value="'+i+'">'+i+'</option>');
        }
        function doAnnualStatistic(){
            var year=$("#year").val();
            var month;
            var num;
            //获得数据
            $.ajax({
                url:"/nsfw/complainChart.do",
                type:"post",
                data:{"year":year},
                dataType:"json",
                success:function(response){
                    console.log(response);
                }
            });
            //04 实例化echarts
            // 定义渐变
            var linear = {
                type: 'linear',
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [{
                    offset: 0, color: '#02bcff' // 0% 处的颜色
                }, {
                    offset: 1, color: '#5555ff' // 100% 处的颜色
                }],
                global: false // 缺省为 false
            }
            // 4.1 创建一个实例
            var echart = echarts.init(document.getElementById("container"));
            // 4.2 定义配置项
            var option = {
                // 图表的标题
                title:{
                    text:"投诉统计图"
                },
                // 图表的提示
                tooltip:{},
                // 图例
                legend:{data:["投诉量"]},
                // x轴线
                xAxis:{data:response.month},
                // y轴线
                yAxis:{},
                // 设置数据
                series:[
                    {
                        // 数据名称
                        name:"睡眠时长",
                        // 类型为柱状图
                        type:"bar",
                        //设置颜色
                        // color: [
                        //     '#ac4cff'
                        // ],
                        // 数据data
                        data:response.num,
                        itemStyle:{
                            color:linear,
                            borderRadius:[30,30,0,0]
                        }
                    }
                ]
            }
            // 4.3 更新配置
            echart.setOption(option);
        }
    });
</script>
</html>


![uniapp - [全端兼容] 多选弹框选择器,弹框形式的列表多选选择器组件插件(底部弹框式列表多选功能,支持数据回显、动态数据、主题色等配置)](https://img-blog.csdnimg.cn/c0992d442c634f9b8c6f3e1b2a3f5910.gif)
















