最近接到一个任务,就是把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("数据表已经导出到指定路径。");
}
}
然后呢,上面我们写好了导出数据表的类,我们测试一下,看看效果:
上面的效果图是这次的成果,也是我想要的效果,如果你们刚好也有这样的需求,不防试一下,嘿嘿.....
本文章出自菜鸟之手,多多见谅。谢谢!!!