Layui练习(读取mysql数据库表并导出为word)

Layui的练习(读取mysql数据库表并导出为word)

本Demo主要是为了练习layui的使用(Layui+SSH)。

整体流程

页面首先将数据库的所有表名加载到下拉框中,由我们手动选择数据库表之后点击查询,然后将数据库表查询出来,利用分页查询,防止表中数据量过大造成浏览器卡死的情况,加载完成之后,依据是否需要进行导出,点击导出之后利用POI将数据库表导出到word文档中。

页面部分

html部分
<hr align=center width=100% color=black size="1" style="height: 3px;color: black">
<form class="layui-form" action="">
<div class="layui-inline">
    <label class="layui-form-label">选择数据表</label>
    <div class="layui-input-inline">
        <select id="select" name="modules" lay-filter="tablename" lay-verify="">
        </select>
    </div>
</div>
    <button type="button" id="query" class="layui-btn layui-btn-normal" style="width: 70px;height: 35px;margin-left: 10px" onclick="xxx()">查询</button>
    <button type="button" class="layui-btn layui-btn-normal" style="width: 70px;height: 35px;margin-left: 10px" onclick="word()">导出</button>
<table id="tableinfo" lay-filter="test"></table>
js部分

预加载部分,声明Layui模块化,同时从后台获取数据库中的所有数据表

$(function () {
        layui.use(['form','table'],function () {
            form = layui.form;
            var table = layui.table;
        });
            $.ajax({
                type: 'post',
                url: '/tabledata/gettablename.do',
                async: false,
                dataType: "json",
                cache: false,
                success: function (data) {
                    var htmls = '<option value = "">选择数据表</option>';
                    //动态给Layui下拉框赋值
                    $.each(data,function(index,item){
                        $('#select').append(new Option(item));// 下拉菜单里添加元素
                    });
                }
            });
    });

返回的json数据是一个json数组,数组内是表名,返回后用data接收

后台代码
 //下拉框表名
@Action("gettablename")
public void gettablename(){
    List<String> tablename = tableservice.tablename();
    this.printJson(JsonUtil.ObjectToJson(tablename));
}

Service层

    @Override
    public List<String> tablename() {
        List<String> tableName = mysqlUtil.getTableName();
        return tableName;
    }

获取数据库的所有表名

//获取数据库连接
public static Connection getConnection() throws Exception{
    Class.forName(driver);
    connection = DriverManager.getConnection(url, username, password);
    return connection;
}
    //获取数据库下的所有的表名
    public static List<String> getTableName() {
        List<String> tableNames = new ArrayList<>();
        ResultSet resultSet = null;
        try {
            connection = getConnection();//获取数据库连接
            DatabaseMetaData metaData = getmetaData();
            //参数输入为null代表不启用该种约束
            resultSet = metaData.getTables(null, null, null, new String[]{"TABLE"});
            while(resultSet.next()){
                tableNames.add(resultSet.getString(3));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                resultSet.close();
                closeConnection(connection);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return tableNames;
    }
获取下拉框中选择的表名
  function gettablename() {
        var tablename = $("#select option:selected").text();
        return tablename;
    }

select是下拉框标签的id

获取Layui表头的数据格式

接受从后台返回的动态表头,用来构成Layui数据表格部分的col表头部分

 //接受后台传回的动态表头
    function col() {
        var tablename = gettablename();//获取下拉框中的表名
        var first = {};
        var res = [];
        $.ajax({
            type: 'post',
            async: false,//注意是同步
            url: '/tabledata/col.do?tablename='+tablename,
            success: function (data) {
                first = {type: 'checkbox'};//开启数据表格的第一列的复选框
                res.push(first);
                for (var i = 0; i<=data.length;i++){
                    for (var key in data[i]){
                        var tempinfo = {field: key,title: data[i][key]};
                        res.push(tempinfo);
                    }
                }
            }
        });
        return res;
    }

json数据格式,以某张表为例,都是表的列名{field:title}

[{"id":"id"},
 {"pid":"pid"},
 {"line_name":"line_name"},
 {"start_lng":"start_lng"},
 {"start_lag":"start_lag"},
 {"end_lng":"end_lng"},
 {"end_lag":"end_lag"},
 {"alarm_point":"alarm_point"}]
后台代码
//查询表格的表头列名
@Action("col")
public void tablecol() throws Exception {
    String tablename = request.getParameter("tablename");
    List<Map<String,String>> tablecol = tableservice.tablecol(tablename);
    this.printJson(JsonUtil.ObjectToJson(tablecol));
}

Service层

@Override
public List<Map<String,String>> tablecol(String tablename) throws Exception {
    List<Map<String,String>> list = tabledao.gettableColumns(tablename);
    List<Map<String,String>> colname = new ArrayList<>();
    for (int i = 0 ; i < list.size(); i++){
        HashMap<String,String> fieldtitlemap = new HashMap<>();
        fieldtitlemap.put(list.get(i).get("columnname"),list.get(i).get("columnname"));
        colname.add(fieldtitlemap);
    }
    return colname;
}

dao层

//获取一张表的列名
@Override
public List<Map<String,String>> gettableColumns(String tablename) throws Exception {
    String sql = "select COLUMN_NAME as columnname FROM information_schema.columns where table_name="+"'"+tablename+"'";
    List<Map<String,String>> list = baseDao.queryListJdbc(sql, null);//执行sql
    return list;
}
点击查询后渲染动态表格

使用layui数据表格和分页结合时:

1.接受前台传输的page和limit数据(当前页、每页数据)

2.sql查询时使用接受的page和limit进行分页查询

3.将要查询表的行总数填入表格格式的count字段(可见Layui官网的数据表格部分的参数说明)

 //查询渲染展示表格
    function xxx() {
        var tablename = gettablename();//获取下拉框中的表名
        cols = col();//获取格式部分的数据
        $.ajax({
            type: 'post',
            dataType: 'json',
            async: false,//注意是同步
            //page和limit应该是默认传输的,可能我的写法有问题,直接获取获取不到,所以我自定义了
            url: '/tabledata/selectdata.do?tablename='+tablename+"&page="+1+"&limit="+10,
            success: function (data) {
                var temp = {
                 "code":data['code'],//0
                 "msg":"",           //随便写
                 "count":data['count'],//表格中数据的总数count(1)
                 "data":data['data']//表格数据利用sql进行分页查询
             };
                layui.use(['table','layer'], function(){
                    var table = layui.table;
                    var tableinfo = table.render({
                        elem: '#tableinfo',
                        id: 'test',
                        url: '/tabledata/selectdata.do?tablename='+tablename,
                        limit: 10,
                        parseData: function (temp){//重新整理数据格式
                            return{
                                "code": temp['code'],
                                "msg": temp['msg'],
                                "count":temp['count'],
                                "data":temp['data']
                            }
                        },
                        //让表格单元格的宽度自适应
                        done: function (res, curr, count) {
                            $("table").css("width", "100%");
                        },
                        data: temp,
                        cols: [
                            cols//是一个全局变量var cols= col()
                        ],
                        //开启分页
                        page: true,
                    });
                });
            }
        });
    }
后台代码
//查询表格数据和具体信息
@Action("selectdata")
public void selectAll() throws Exception {
    String tablename = request.getParameter("tablename");
    String page = request.getParameter("page");
    String limit = request.getParameter("limit");
    Map<Object, Object> resultmap = tableservice.selectAll(tablename,page,limit);
    this.printJson(JsonUtil.ObjectToJson(resultmap));
}

Service层

//页面渲染表格时需要的数据
@Override
public Map<Object, Object> selectAll(String tablename,String page,String limit) throws Exception {
    Map<Object, Object> map = new LinkedHashMap<>();
    map.put("code", 0);
    map.put("msg", "");
    List<Map<String,String>> list1 = tabledao.gettableRow(tablename);//表的行数
    map.put("count", list1.get(0).get("row"));
    List list = tabledao.selectAllinfo(tablename,page,limit);//表的所有数据
    map.put("data", list);
    List list2 = tabledao.gettableColumns(tablename);//表的列名集合
    map.put("column", list2);
    List list3 = tabledao.gettableColumnsnum(tablename);//表的列数
    map.put("columnnum", list3);
    return map;
}

获取表的行数

//获取一张表的行数
@Override
public List gettableRow(String tablename) throws Exception {
    String sql = "select count(1) as row from "+ tablename;
    List list = baseDao.queryListJdbc(sql, null);
    return list;
}

获取表的所有数据(sql进行分页查询,page为当前页,limit为每页的显示数量)

 @Override
public List<Map<String, String>> selectAllinfo(String tablename,String page,String limit) throws Exception {
    String sql = "select * from "+tablename + " limit "+ (Integer.parseInt(page) -                         1)*Integer.parseInt(limit) + "," + limit;
    List list = baseDao.queryListJdbc(sql, null);
    return list;
}

获取一张表的所有列名

//获取一张表的列名
@Override
public List<Map<String,String>> gettableColumns(String tablename) throws Exception {
    String sql = "select COLUMN_NAME as columnname FROM information_schema.columns where                   table_name="+"'"+tablename+"'";
    List<Map<String,String>> list = baseDao.queryListJdbc(sql, null);
    return list;
}

获取一张表的列数

//获取一张表的列数
@Override
public List<Map<String,String>> gettableColumnsnum(String tablename) throws Exception {
    String sql ="select count(COLUMN_NAME) as columnname FROM information_schema.columns                  where table_name="+"'"+tablename+"'";
    List<Map<String,String>> list = baseDao.queryListJdbc(sql,null);
    return list;
}
导出为word
 function word() {
        var tablename = gettablename();//获取下拉框中的表名
        res = '';
        var rownum = '';
        var columnname = '';
        var columnnum = '';
        $.ajax({
            type: 'post',
            url: '/tabledata/selectdata.do?tablename='+tablename,
            async:false,
            success: function (data) {
                res=data['data'];//表格数据内容
                rownum=data['count'];//表格行数
                columnname=data['column'];//表格的列名集合
                columnnum=data['columnnum'][0]['columnname'];//列名数量
                debugger;
                $.ajax({
                    type: 'post',
                    url: '/word/toword.do',
                    async:false,
                    data: {
                        "row": rownum,//行数
                        "column": columnnum,//列数
                        "tablename":tablename,//表名
                        "res": JSON.stringify(res),//表格数据
                        "columnname": JSON.stringify(columnname)//列名集合
                    },
                    success:function (data) {
                        layui.use('layer',function () {//是否成功的窗口提示
                            var layer = layui.layer;
                            layer.open({
                                title: '数据导出',
                                content: data,
                            });
                        })
                    }
                });
            }
        });
    }
后台代码
@Action("toword")
public void tabletoword() throws Exception {
    String row = request.getParameter("row");//行数
    String column = request.getParameter("column");//列数
    String tablename = request.getParameter("tablename");//表名
    String columnname = request.getParameter("columnname");//列名

    Type type = new TypeToken<String>() {}.getType();
    String table = new Gson().fromJson(tablename,type);

    Type type1 = new TypeToken<List<Map<String,String>>>() {}.getType();
    List<Map<String,String>> columnnames = new Gson().fromJson(columnname,type1);

    List<Map<String,String>> datainfo = serviceddata.selectAllinfo(tablename);//表信息
    try {
        tabletoword.writeword(Integer.parseInt(row), Integer.parseInt(column), table,datainfo,columnnames);
        this.printJson(JsonUtil.ObjectToJson("导出成功"));
    }catch (Exception e){
        this.printJson(JsonUtil.ObjectToJson("导出失败"));
    }
}

Service层

//导出时的数据
@Override
public List<Map<String, String>> selectAllinfo(String tablename) throws Exception {
    List<Map<String, String>> list = tabledao.wordAllinfo(tablename);
    return list;
}

Dao直接获取所有数据

//获取一张表的所有数据(导出表格使用)
@Override
public List wordAllinfo(String tablename) throws Exception {
    String sql = "select * from "+tablename;
    List list = baseDao.queryListJdbc(sql, null);
    return list;
}

利用POI绘制表格并导出到word文档

/*
    * row:表格行数
    * column:表格列数
    * tablename:表名
    * data:表格所有数据
    * columnnames:表格列名集合
    *
    * */
public static void writeword(int row, int column, String tablename, List<Map<String,String>> data,List<Map<String,String>> columnnames) throws IOException {
    String docname = tablename+".docx";
    //新建一个文档
    XWPFDocument doc = new XWPFDocument();
    FileOutputStream OutputStream = new FileOutputStream(new File("文件路径"+docname));
    //创建一个表格
    XWPFTable table = doc.createTable(row+1,column);
    //获取表格的第一行
    XWPFTableRow row1 = table.getRow(0);
    for (int i = 0 ; i < row+1 ; i++){//按行遍历
        //填充首行列名
        if (i == 0) {
            for (int j = 0; j < column; j++) {//按列遍历(表头)
                row1.getCell(j).setText(columnnames.get(j).get("columnname"));
            }
        } else {
            XWPFTableRow row2 = table.getRow(i);
            for (int m = 0 ; m <column ; m++){//按列遍历(数据)
                row2.getCell(m).setText(String.valueOf(data.get(i-1).get(columnnames.get(m).get("columnname"))));
            }
        }
    }
    doc.write(OutputStream);
    OutputStream.close();
}