POI批量导入和echars图表

news2024/10/6 18:31:29

下载模板 

  

 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于环肽试剂:118477-06-8,Cyclo(L-Phe-trans-4-hydroxy-L-Pro),知识普及

●中文名&#xff1a;环(L-苯丙氨酰-反式-4-羟基-L-脯氨酸) ●英文名&#xff1a;Cyclo(L-Phe-trans-4-hydroxy-L-Pro) 西安凯新生物科技有限公司供应的​各种环肽&#xff0c; 任何结构的环肽&#xff0c;可以进行相应的定制服务。环二肽&#xff1a; 2000/g or 3000/g 纯度…

idea 自带git down分支出现莫名其妙的文件

是个坑 大部分场景下&#xff0c;会先down master 再去down 对应分支 例如dev 会出现一种内容&#xff0c;master里面有但dev没有当前文件&#xff0c;直接报错而且引入包排查没任何问题 解决方式&#xff1a; 用tortoiseGit 直接选对应分支。idea目前2022不支持

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

前言 网上的教程都太乱了,各种不兼容且 BUG 太多,注释也没有很难进行改造。 本文 实现了 uniapp 全端兼容的弹框多选选择器,从底部弹出列表项进行多选(可回显已选中和各种主题色、样式配置), 您可以直接复制代码,稍微改改样式就能用了。 如下图所示,数据列表(支持接口…

关于找不到msvcp120.dll,无法继续执行代码的解决方案

小伙伴们知道msvcp120.dll是什么文件吗?那么今天小编就来讲解电脑出现msvcp120.dll丢失的解决方法介绍&#xff0c;希望能够帮助到大家呢。 msvcp120.dll 是windows系统中必备的动态链接库文件。msvcp120.dll可以解决某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。…

【电子量产工具】大纲分析

前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 项目大纲&#xff1a; 可以看到上面的框图&#xff0c;我们可以分为三大部分&#xff1a; 从最下面的 第 1 层开始。这是整个项目的最底层&#xff0c;主要负责处理数据和逻辑&#xff0c;与板…

Docker发布JAVA vhr微人事后端(确保打包没问题再发布)

本文代码来源于&#xff08;感谢作者&#xff09; GitHub - lenve/vhr: 微人事是一个前后端分离的人力资源管理系统&#xff0c;项目采用SpringBootVue开发。1.创建DockerFile文件 创建mail文件夹 创建web文件夹 以下为mail dockerfile FROM java:8 Add *.jar /app/app.ja…

算法chatgpt回答

算法 红黑树和AVL树区别 红黑树和AVL树区别

Windows系统提示丢失xlive.dll怎么办?

xlive.dll微软的动态链接库&#xff08;DLL&#xff09;的一部分&#xff0c;当它被删除或者损坏时&#xff0c;会出现错误消息&#xff0c;提示xlive.dll丢失或未找到。那么Windows系统提示丢失xlive.dll怎么办呢&#xff1f; Windows计算机丢失xlive.dll如何修复&#xff1f;…

云原生之深入解析Docker容器的核心Cgroups的相关概念和使用实现

一、Cgroups 简介 Cgroups 是 Linux 系统内核提供的一种机制&#xff0c;这种机制可以根据需求将一些列系统任务机器子任务整合或分离到按资源划分登记的不同组内&#xff0c;从而为系统资源管理提供一个的框架。简单地说&#xff0c;Cgroups 可以限制、记录任务组所使用的物理…

HCIP-Cloud Service Solutions Architect v3.0

华为职业认证hcip解决方案架构师v3.0 新增题库200题 HCIP-Cloud Service Solutions Architect v3.0 1.关于创建数据盘镜像的约束条件&#xff0c;以下说法错误的是&#xff1f; A.使用云服务器的数据盘创建数据盘镜像时&#xff0c;要确保该云服务器必须有系统盘 B.通过外部文件…

智能化新服务即将惊艳亮相HDC2023 ——华为云Astro爆发低代码能量

​​HDC期间可参与华为开发者大会Astro新人抽奖活动&#xff0c;活动链接在文末。福利多多&#xff0c;快来参与&#xff01; 跃跃欲试的开发者们&#xff0c;是否对2023华为云开发者大会充满期待&#xff1f;华为云Astro将引领新一轮低代码技术革命&#xff01;贯穿AIGC技术的…

HTML5 游戏开发实战 | 五子棋

五子棋是一种家喻户晓的棋类游戏&#xff0c;它的多变吸引了无数的玩家。本章首先实现单机五子棋游戏(两人轮流下)&#xff0c;而后改进为人机对战版。整个游戏棋盘格数为 1515&#xff0c;单击鼠标落子&#xff0c;黑子先落。在每次下棋子前&#xff0c;程序先判断该处有无棋子…

建安三类人企业主要负责人(A证)安全技术考试题库及答案

本题库是根据最新考试大纲要求&#xff0c;结合近年来考试真题的重难点进行汇编整理组成的全真模拟试题&#xff0c;考生们可以进行专项训练&#xff0c;查漏补缺巩固知识点。本题库对热点考题和重难点题目都进行了仔细的整理和编辑&#xff0c;相信考生在经过了针对性的刷题练…

网络安全(黑客)学习路线

前言&#xff1a; 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#xff0c;更多的人会倒在学习语言上&#xff1b; 1、打基础时间太长 对于网络安全基础内容&#xff0c;很多人不清楚需要学到什么程度&#xff0c;囫…

飞行动力学 - 第2节-推进系统、气动力、重要参数及一点点滑翔 之 基础点摘要

飞行动力学 - 第2节-推进系统、气动力、重要参数及一点点滑翔 之 基础点摘要 1. 推进系统介绍2. 推进系统效率/功率/推力3. 涡桨/涡扇/涡喷 桨叶激波 影响4. 典型喷气式发动机数据5. 空气动力6. 升力&法向过载7. 阻力组成8. 最大升阻比 & 最小阻升比9. 飞机阻力10. 重要…

怎么批量禁用公司u盘功能

在某些情况下&#xff0c;禁用U盘的功能可能是必要的。无论是出于安全考虑&#xff0c;还是为了限制员工在工作时间内使用个人设备&#xff0c;禁用U盘可以帮助管理和控制数据的流动。本文将介绍一些禁用U盘的方法&#xff08;其中方法三可以公司局域网内部一键禁止U盘的使用&a…

使用SpringEL获得字符串中的表达式运算结果

概述 有时候会遇上奇怪的需求&#xff0c;比如解析字符串中表达式的结果。 这个时候自己写解析肯定是比较麻烦的&#xff0c; 正好SprinngEL支持加()、减(-)、乘(*)、除(/)、求余&#xff08;%&#xff09;、幂&#xff08;^&#xff09;运算&#xff0c;可以免去造轮子的功夫…

六大设计模式原则

1 单一职责原则 &#xff08;Single Responsibility Principle, SRP&#xff09;&#xff0c;有且仅有一个原因引起类的变更 顾名思义&#xff1a;一个类只负责一项职责 基本介绍 即对类来说&#xff0c;一个类应该只负责一项职责。如类 A 负责两个不同职责&#xff1a;职责 …

Milvus 介绍

Milvus 特点 在万亿矢量数据集上实现惊人的搜索速度&#xff1a;在万亿矢量数据集上&#xff0c;矢量搜索和检索的平均延迟可达毫秒级。简化的非结构化数据管理&#xff1a; Milvus 拥有专为数据科学工作流程设计的丰富 API。可靠、始终在线的矢量数据库&#xff1a; Milvus 内…

MA35D1测试-记录

1.查看拨码开关的启动设定 找到开发板&#xff1a;拨码快关&#xff0c;复位按键、电源开关的位置&#xff01; 2.三根线和软件&#xff08;一根5V/2A电源适配线、两根usb线&#xff09; 三根线&#xff1a;一根5V/2A电源适配线、两根usb线 电源线插上&#xff0c;确保可以波…