POI导出Oracle数据库中的表(不包含数据)

最近接到一个任务,就是把oracle数据中的表导出到excel表格,只需要表名及字段名即可,目的是对数据库表进行再次整理。方便二次开发及维护,顺便在此记录一下。开始吧!

首先,需要用到POI当然要先导入POI的相关依赖和jar包,我是在maven项目里写的,所以依赖如下:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.15</version>
</dependency>

其次,就是编写导出数据表的类了。

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 将数据库表导出到excel(不包含表中的数据,只导出表名及字段名)
 * @author HongYang
 * @since 2018/8/2
 */
public class ExportTable {

    private static void exportTables() throws Exception{
        //声明需要导出的数据库名
        String dbName = "oracle";

        //声明book
        HSSFWorkbook book = new HSSFWorkbook();

        String username = "admin";
        String pwd = "123456";
        String driver = "oracle.jdbc.OracleDriver";
        String url = "jdbc:oracle:thin:@192.168.2.101:1521:oracle";
        // 加载oracle数据库驱动
        Class.forName(driver);
        //获取Connection, 获取db的元数据
        Connection con = DriverManager.getConnection(url, username, pwd);


        //声明statement
        Statement st = con.createStatement();
        //st.execute("use "+dbName);

        DatabaseMetaData dmd = con.getMetaData();
        //获取数据库有多少表
        ResultSet rs = dmd.getTables(dbName, null, null, new String[]{"TABLE"});

        //获取所有表名
        List<String> tableList = new ArrayList<String>();
        while(rs.next()){
            String tableSchem = rs.getString("TABLE_SCHEM");
            if ((username).equalsIgnoreCase(tableSchem)) {
                String tableName = rs.getString("TABLE_NAME");
                tableList.add(tableName);
            }
        }
        HSSFSheet sheet = book.createSheet("yx-table");
        sheet.setColumnWidth(0, 6000);  // 设置列的宽度

        /*
        * 因为导出的表名及字段名都是独占一行的
        * 所以在遍历查询到的表时,得记录一下该表及字段已经占据到第几行了
        * 变量 k 仅仅起到记录的作用
        * */
        int k = 0;
        for(String tableName : tableList){
            // 查询sql语句
            String sql = "select * from " + tableName;

            // 执行查询语句
            rs = st.executeQuery(sql);

            // 根据返回的结果,分析结果集的元数据
            ResultSetMetaData rsmd = rs.getMetaData();
            // 获取该表有多少列(或多少个字段)
            int cols = rsmd.getColumnCount();

            HSSFRow row = sheet.createRow(k);
            HSSFCell cell = row.createCell(0);
            cell.setCellValue("==表名【 " + tableName + " 】==");

            int i = 1;
            for(; i <= cols; i++){
                String colName = rsmd.getColumnName(i);
                // 创建一个新的行
                row = sheet.createRow(k+i);
                // 每个表的字段名独占一行的第一列,依次下去,只会占用excel表的第一列
                cell = row.createCell(0);
                // 写入列名
                cell.setCellValue(colName);
            }
            k = k + i + 1;  // 遍历完每个表需空一行,方便阅读
        }
        con.close();
        book.write(new FileOutputStream("e:/yx-table.xlsx"));   // 导出绝对路径
    }

    public static void main(String[] args) throws Exception {
        exportTables();
        System.out.println("数据表已经导出到指定路径。");
    }
}

然后呢,上面我们写好了导出数据表的类,我们测试一下,看看效果:

上面的效果图是这次的成果,也是我想要的效果,如果你们刚好也有这样的需求,不防试一下,嘿嘿.....

本文章出自菜鸟之手,多多见谅。谢谢!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值