如何将数据库的表导出生成Excel?

本篇博客知识点
1.如何通过元数据拿到数据库的信息?
2.如何用Java生成Excel表?
3.将数据库中的表导出生成Excel案例

如何通过元数据拿到数据库的信息

元数据:描述数据的数据

Java中使用元数据的两个方法

  • DatabaseMetaData 通过连接可以拿到的信息:数据库软件,所有数据库名,所有数据库里面的表名,描述数据库的元数据
  • ResultSetMetaData 拿到的表结构信息:获得表的列数目 类型和属性 ,描述数据库表的元数据

DatabaseMetaData 的使用学习

@Test// DatabaseMetaData 通过连接可以拿到的信息:数据库软件,所有数据库名,所有数据库里面的表名
    public void DatabaseMetaData_Demo() throws Exception{
        // 自己写的工具包来获得数据库连接
        Connection con = ConnUtils4.getConn();
        //DatabaseMetaData 通过连接获得
        DatabaseMetaData dbmt =  con.getMetaData();
        // 数据库软件名
        System.out.println(" 数据库软件名:"+dbmt.getDatabaseProductName());
        // 拿到所有数据库名字
        ResultSet rs =dbmt.getCatalogs();
        List<String> tablenames = new ArrayList<String>();
        while(rs.next()){
            String tabname=rs.getString("TABLE_CAT");
            tablenames.add(tabname);
            System.out.println("数据库名字:"+tabname);
        }
        System.out.println("--------------");;
        //拿到某个数据库李曼所有的表名---可以指定表的类型
        rs = dbmt.getTables("ake", "ake", null, new String[]{"TABLE","VIEW"});
        while(rs.next()){
            System.out.println("数据库ake里的表名:"+rs.getString("TABL`````
_NAME"));
        }
    }

这里写图片描述

ResultSetMetaData的使用学习

@Test// ResultSetMetaData 拿到的表结构信息:获得表的列数目  类型和属性 
    public void ResultSetMetaData_Demo2() throws Exception{
        // 自己写的工具包来获得数据库连接
        Connection con = ConnUtils4.getConn();
        String sql = "select * from ake.book";
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery(sql);
        // ResultSetMetaData 通过 查询的返回集获取
        ResultSetMetaData rsmt = rs.getMetaData();
        //获得表的列数
        int n =rsmt.getColumnCount();
        //类型---某一列
//       getColumnTypeName:INT
        //某医疗的名字
//      getColumnName:id
        //某一列的长度
//      getColumnDisplaySize:11
        for(int i=1;i<n;i++){
            System.out.println(rsmt.getTableName(i)+"表的第"+i+"列描述信息");
            System.out.println("getColumnDisplaySize:"+rsmt.getColumnDisplaySize(i));
            System.out.println("getColumnLabel:"+rsmt.getColumnLabel(i));
            System.out.println("getColumnName:"+rsmt.getColumnName(i));
            System.out.println("getColumnType:"+rsmt.getColumnType(i));
            System.out.println("getColumnTypeName:"+rsmt.getColumnTypeName(i));
            System.out.println("getPrecision:"+rsmt.getPrecision(i));
            System.out.println("getScale:"+rsmt.getScale(i));
            System.out.println("getSchemaName:"+rsmt.getSchemaName(i));
            System.out.println("------------");
        }
        con.close();
    }

这里写图片描述

拿出ake表里面所有的内容~~~~

// 拿出ake表里面所有的内容~~~~
    public static void main(String[] args) throws Exception{
        Connection con = ConnUtils4.getConn();
        System.out.println(con);
        DatabaseMetaData dbmt = con.getMetaData();
        //拿到所有的ake所有表名
        ResultSet rs =dbmt.getTables("ake", "ake", null, new String[]{"TABLE","VIEW"});
        List<String> tablenames = new ArrayList<String>();
        while(rs.next()){
            String tablename = rs.getString("TABLE_NAME");
            tablenames.add(tablename);
        }
        for(String tablename:tablenames){
            System.out.println(tablename+"表:");
            if(tablename.equals("img")){
                continue;
            }
            String sql = "select * from ake."+tablename;
            Statement st = con.createStatement();
            ResultSet RS = st.executeQuery(sql);
            ResultSetMetaData rsmt = RS.getMetaData();
            // 拿到列数
            int colnums = rsmt.getColumnCount();
            for(int i=1;i<=colnums;i++){
                //拿到表头信息
                String colName = rsmt.getColumnName(i);
                System.out.print(colName+"\t");
            }
            System.out.println();

            while(RS.next()){
                for(int i=1;i<=colnums;i++){
                    //拿到表信息
                    System.out.print( RS.getString(i)+"\t");
                }
                System.out.println();
            }

        }
        con.close();
    }

我把那到的表格信息输出
这里写图片描述
这里写图片描述

如何用Java生成Excel表?

需要一个插件工具包
这里写图片描述

@Test
    public void Workbook_demo() throws Exception{
        // 建立一个工作表--相当于一个数据库
        Workbook book = new HSSFWorkbook();
        // 数据库中的一个表
        Sheet sheet1 =book.createSheet("表1");
        // 行
        Row row =sheet1.createRow(4);
        // 单元格
        Cell cell = row.createCell(3);
        // 写入数据
        cell.setCellValue("通过java写的Excel");
        // 保存到银盘
        book.write( new FileOutputStream("d:a/a.xls"));
    }

这里写图片描述

将数据库中的表导出生成Excel案例

public static void main(String[] args) throws Exception {
        //把数据库里所有的信息导入到Excel表中~
        Connection con = ConnUtils4.getConn();
        DatabaseMetaData dbmt = con.getMetaData();
        //要通过 DatabaseMetaData 拿到所有数据库的名字
        List<String> Database_Names = new ArrayList<String>();
        ResultSet rs =dbmt.getCatalogs();
        while(rs.next()){
            Database_Names.add(  rs.getString("TABLE_CAT"));
        }
        //DatabaseMetaData 拿到所有数据表名
        int m = 0;
        for(String Database_Name:Database_Names){
            if(!Database_Name.equals("ake")){
                continue;
            }
//          if(m++>=3){
//              break;
//          }
            // 一个数据库对于一个 Excel文档~
            Workbook book = new HSSFWorkbook();
            rs = dbmt.getTables(Database_Name, Database_Name, null, new String[]{"TABLE","VIEW"});
            //封装所有表名
            List<String> Table_Names = new ArrayList<String>();
            while(rs.next()){
                Table_Names.add(  rs.getString("TABLE_NAME"));
            }
            for(String Table_Name:Table_Names){
                if("img".equals(Table_Name) ||"note".equals(Table_Name) ){ // img为二进制文件导入会出错
                    continue;
                }
                //创建一个表
                Sheet sheet = book.createSheet(Table_Name);
                Statement st = con.createStatement();
                String sql = "select * from "+Database_Name+"."+Table_Name;
//              System.out.println("sql:"+sql);
                rs = st.executeQuery(sql);
                //设置表头信息
                 Row row1 = sheet.createRow(0);
                 ResultSetMetaData rsmd = rs.getMetaData();
                 int colnum = rsmd.getColumnCount();
                 for(int i=1;i<=colnum;i++){
                     String name = rsmd.getColumnName(i);
                     Cell cell = row1.createCell(i-1);
                     cell.setCellValue(name);
//                   System.out.print(name+"\t");
                 }
//               System.out.println();
                 //设置表格信息
                 int idx = 1;
                 while(rs.next()){
                     Row row = sheet.createRow(idx++);
                     for(int i=1;i<=colnum;i++){
                         String str = rs.getString(i);
//                       System.out.print(str+"\t");
                         Cell cell = row.createCell(i-1);
                         cell.setCellValue(str);
                     }
//                   System.out.println();
                 }
            }

            book.write( new FileOutputStream( "d:a/"+Database_Name+".xls"));
        }


    }

执行结果就成功啦!
这里写图片描述
这里写图片描述
这里写图片描述

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值