zoukankan      html  css  js  c++  java
  • 导出数据库表以及备注为excel

    import com.alibaba.excel.annotation.ExcelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class FieldData{
        //表名
        @ExcelProperty(value = "表名", index = 0)
        private String tableName;
        //表字段
        @ExcelProperty(value = "表字段", index = 1)
        private String field;
        //表字段类型
        @ExcelProperty(value = "表字段类型", index = 2)
        private String fieldType;
        //表字段备注
        @ExcelProperty(value = "表字段备注", index = 3)
        private String fieldCommit;
    }
    View Code
    import com.alibaba.excel.annotation.ExcelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class TableData {
        //表名
        @ExcelProperty(value = "表名", index = 0)
        private String tableName;
        //表备注
        @ExcelProperty(value = "表备注", index = 1)
        private String remark;
    }
    View Code
    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.ExcelWriter;
    import com.alibaba.excel.write.metadata.WriteSheet;
    
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Test{
        private final static String fileName = "D:\MyDocuments\wangyong77\桌面\topTable3.xlsx";
        private final static String driver = "com.mysql.cj.jdbc.Driver";
        private final static String ip = "10.130.201.237:";
        private final static String user = "tkbus";
        private final static String password = "tkbus123";
        private final static String mydata = "tkbus";
    
        private static Connection conn;
    
        public static void main(String[] args) {
            DBinit ();
            getTableInfo ();
            DBclose ();
        }
    
        public static void getTableInfo() {
            try {
                //获取数据库的元数据
                DatabaseMetaData dbMetaData = conn.getMetaData ();
                System.out.println ("---------------获取" + conn.getCatalog () + "库的所有表名----------------");
                //从元数据中获取到所有的表名
                ResultSet rs = dbMetaData.getTables (conn.getCatalog (),null,null,new String[]{"TABLE"});
                //存放所有表名
                List<String> tableNames = new ArrayList<> ();
                //存放当前表的字段
                List<String> fields = new ArrayList<> ();
                //存放当前表的字段类型
                List<String> fieldstype = new ArrayList<> ();
                //存放当前表的字段属性
                List<String> commits = new ArrayList<> ();
                List<TableData> tableList = new ArrayList ();
                Map<Integer,List<FieldData>> map = new HashMap<> ();
                TableData table;
                while (rs.next ()) {
    //                System.out.println("表名: "+rs.getString("TABLE_NAME"));
    //                System.out.println("表类型: "+rs.getString("TABLE_TYPE"));
    //                System.out.println("表所属数据库: "+rs.getString("TABLE_CAT"));
    //                System.out.println("表所属用户名: "+rs.getString("TABLE_SCHEM"));
    //                System.out.println("表备注: "+rs.getString("REMARKS"));
                    if (rs.getString ("TABLE_NAME").contains ("copy") || HasDigit (rs.getString ("TABLE_NAME"))) {
                        continue;
                    }
                    tableNames.add (rs.getString ("TABLE_NAME"));
                    table = new TableData ();
                    table.setTableName (rs.getString ("TABLE_NAME"));
                    table.setRemark (rs.getString ("REMARKS"));
                    tableList.add (table);
                }
                //查询每个表的字段
                for (int i = 0;i < tableNames.size ();i++) {
                    List<FieldData> filedlist = new ArrayList ();
                    if (tableNames.get (i).contains ("copy") || HasDigit (tableNames.get (i))) {
                        continue;
                    }
                    String sql = "select * from " + tableNames.get (i);
                    System.out.println ("表开始" + tableNames.get (i));
                    PreparedStatement ps = conn.prepareStatement (sql);
                    ResultSet rstable = ps.executeQuery ();
                    //结果集元数据
                    ResultSetMetaData meta = rstable.getMetaData ();
                    //表列数量
                    int columeCount = meta.getColumnCount ();
                    FieldData data;
                    for (int k = 1;k <= columeCount;k++) {
                        data = new FieldData ();
                        data.setTableName (tableNames.get (i));
                        data.setField (meta.getColumnName (k));
                        data.setFieldType (meta.getColumnTypeName (k));
                        filedlist.add (data);
                        fields.add (meta.getColumnName (k));
                        fieldstype.add (meta.getColumnTypeName (k));
                    }
    //                System.out.println("表"+tableNames.get(i)+"字段: "+fields);
    //                System.out.println("表"+tableNames.get(i)+"字段类型: "+fieldstype);
                    fields.clear ();
                    ResultSet rs1 = rs = ps.executeQuery ("show full columns from " + tableNames.get (i));
                    while (rs1.next ()) {
                        commits.add (rs.getString ("Comment"));
                    }
    //                System.out.println("表"+tableNames.get(i)+"字段备注类型: "+commits);
                    for (int j = 0;j < filedlist.size ();j++) {
                        filedlist.get (j).setFieldCommit (commits.get (j));
                    }
                    map.put (i,filedlist);
                    commits.clear ();
                    System.out.println ("表完成" + tableNames.get (i));
                }
    //            createTableExcel(tableList);
                createExcel (map);
            } catch (Exception e) {
                e.printStackTrace ();
            }
        }
    
        public static void DBinit() {
            //驱动程序名
            Properties props = new Properties ();
            props.put ("user",user);
            props.put ("password",password);
            props.put ("useInformationSchema","true"); //表注释
            //不同端口号
            String[] db_url_port = {"3306"};
            //数据库服务器
            String dbServer;
            for (String db_port : db_url_port) {
                dbServer = ip + db_port;
                //URL指向要访问的数据库名mydata
                String url = "jdbc:mysql://" + dbServer + "/" + mydata;
                try {
                    Class.forName (driver);
                    //声明Connection对象
                    conn = DriverManager.getConnection (url,props);
                    if (!conn.isClosed ()) {
                        System.out.println ("当前访问数据库端口号为" + db_port + ",数据库连接成功!");
                        break;
                    }
                } catch (Exception e) {
                    System.out.println ("当前访问数据库端口号为" + db_port + ",数据库连接失败!");
                    continue;
                }
            }
        }
    
        public static void DBclose() {
            try {
                conn.close ();
            } catch (SQLException e) {
                System.out.println ("数据关闭异常");
                e.printStackTrace ();
            }
        }
    
    
        /**
         * 生成表内容详细信息
         * @param map
         */
        public static void createExcel(Map<Integer,List<FieldData>> map) {
            System.out.println ("开始写入excel");
            ExcelWriter excelWriter = EasyExcel.write (fileName).build ();
            WriteSheet writeSheet;
            //map根据key排序
            for (Map.Entry<Integer,List<FieldData>> map1 : map.entrySet ()) {
    //            EasyExcel.write(fileName, FieldData.class).sheet(map1.getKey()).doWrite(map1.getValue());
                // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
                writeSheet = EasyExcel.writerSheet (map1.getKey (),map1.getValue ().get (0).getTableName ()).head (FieldData.class).build ();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                excelWriter.write (map1.getValue (),writeSheet);
            }
            excelWriter.finish ();
            System.out.println ("excel生成完毕");
        }
    
    
        /**
         * 生成表信息
         * @param tableList
         */
        public static void createTableExcel(List<TableData> tableList) {
            System.out.println ("开始写入Tableexcel");
            EasyExcel.write (fileName,TableData.class).sheet ("top表").doWrite (tableList);
            System.out.println ("Tableexcel生成完毕");
        }
    
        public static boolean HasDigit(String content) {
            boolean flag = false;
            Pattern p = Pattern.compile (".*\d+.*");
            Matcher m = p.matcher (content);
            if (m.matches ()) {
                flag = true;
            }
            return flag;
        }
    
    }
    View Code

    import com.alibaba.excel.annotation.ExcelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class FieldData{
    //表名
    @ExcelProperty(value = "表名", index = 0)
    private String tableName;
    //表字段
    @ExcelProperty(value = "表字段", index = 1)
    private String field;
    //表字段类型
    @ExcelProperty(value = "表字段类型", index = 2)
    private String fieldType;
    //表字段备注
    @ExcelProperty(value = "表字段备注", index = 3)
    private String fieldCommit;
    }
  • 相关阅读:
    平台建设-用户反馈跟踪模块(简单爬虫)
    Android Send event 汇总 (点击,滑动,两指操作 源码)
    uiautomator 获取控件,点击的原理
    自动化进程调用CommomService获取androidapi功能
    大快搜索“大数据与智慧城市”南京技术交流会成功举办
    系统架构都经历了怎样的演变?
    云计算的云数据安全与加密技术
    从服务端视角看高并发难题
    动态分配多任务资源的移动端深度学习框架
    详谈分布式系统缓存的设计细节
  • 原文地址:https://www.cnblogs.com/sunny-miss/p/14991687.html
Copyright © 2011-2022 走看看