zoukankan      html  css  js  c++  java
  • 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件

    本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar

    工作中曾有个为42张表建立测试文件的任务,文件里是表的必填字段及两三条记录,sheetname是表名,事虽简单,但架不住量多,干的我是肩酸手疼。

    后来一想,用ResultSetMetaData不就可以一次性完成任务了吗,于是有了下面的类:

    package com.hy;
    
    import java.io.FileOutputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.log4j.Logger;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    class Field{
        String name;    // 列名
        int size;        // 列容量
        String type;    // 列数据类型
        boolean allowNull;// 列是否允許为空
    }
    
    /**
     * 从数据库表中抽取字段信息存成Excel文件
     * @author horn1
     *
     */
    public class XlsMaker {
        private static Logger log = Logger.getLogger(XlsMaker.class);
        
        // 连接到数据库的四大属性
        private static final String DRIVER = "com.mysql.jdbc.Driver";
        private static final String DBURL = "jdbc:mysql://192.168.161.130:3306/test?useUnicode=true&characterEncoding=utf-8";
        private static final String USER = "root";
        private static final String PSWD = "12345678";
        
        /**
         * 从表数组里取出表,从表里取出字段信息,每个表做成一个xls文件
         * 
         * @param tables
         */
        public void makeXlsFrom(String[] tables) {
            final String exportPath="d:\";
            Connection conn = null;
            Statement stmt = null;
    
            try {
                Class.forName(DRIVER).newInstance();
                conn = DriverManager.getConnection(DBURL, USER, PSWD);
                stmt = conn.createStatement();
                
                for(String table:tables) {
                    List<Field> fields=fetchTableFields(conn,stmt,table,true);
                    String xlsFilename=exportPath+table+getTimestamp()+".xls";
                    
                    writeFile(table,fields,xlsFilename);
                }
            } catch (Exception e) {
                System.out.print(e.getMessage());
            } finally {
                try {
                    stmt.close();
                    conn.close();
                } catch (SQLException e) {
                    System.out.print("Can't close stmt/conn because of " + e.getMessage());
                }
            }
        }
        
        /**
         * 将表,字段信息写入文件xlsFilename
         * @param table
         * @param fields
         * @param xlsFilename
         * @throws Exception
         */
        private void writeFile(String table,List<Field> fields,String xlsFilename) throws Exception{
            // 得到四行
            List<String> allownulls=new ArrayList<String>();
            List<String> types=new ArrayList<String>();
            List<String> sizes=new ArrayList<String>();
            List<String> names=new ArrayList<String>();
            
            for(Field f:fields) {
                allownulls.add(String.valueOf(f.allowNull));
                types.add(f.type);
                sizes.add(String.valueOf(f.size));
                names.add(f.name);
            }
            
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook();// 创建工作簿
            HSSFSheet sheet = hssfWorkbook.createSheet();// 新建Sheet
            hssfWorkbook.setSheetName(0, table);// 设置sheet名
            
            HSSFRow row = sheet.createRow(0);// 新建一行
            row.createCell(0).setCellValue("Allow null:");// 首个单元格写类型
            for(int i=0;i<allownulls.size();i++) {
                row.createCell(i+1).setCellValue(allownulls.get(i));// 其它写字段信息
            }
            
            row = sheet.createRow(1);
            row.createCell(0).setCellValue("Type:");
            for(int i=0;i<types.size();i++) {
                row.createCell(i+1).setCellValue(types.get(i));
            }
            
            row = sheet.createRow(2);
            row.createCell(0).setCellValue("Size:");
            for(int i=0;i<sizes.size();i++) {
                row.createCell(i+1).setCellValue(sizes.get(i));
            }
            
            row = sheet.createRow(3);
            row.createCell(0).setCellValue("Name:");
            for(int i=0;i<names.size();i++) {
                row.createCell(i+1).setCellValue(names.get(i));
            }
    
            // 将工作簿写入文件
            FileOutputStream fileOut = new FileOutputStream(xlsFilename); 
            hssfWorkbook.write(fileOut);
            hssfWorkbook.close();
            
            log.info("文件 '"+xlsFilename+"' 写入完了.");
        }
        
        /**
         * 从表中取字段信息
         * @param conn
         * @param stmt
         * @param table
         * @param isFetchall:此参数为真时取所有字段,为假时取非空字段
         * @return
         * @throws Exception
         */
        private List<Field> fetchTableFields(Connection conn,Statement stmt,String table,boolean isFetchall)  throws Exception{
            List<Field> fields=new ArrayList<Field>();
            
            String sql = "select * from "+table+"";
            
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData rsMetadata = rs.getMetaData();
    
            int count = rsMetadata.getColumnCount();
            for (int i=0; i<count; i++) {
                int index=i+1;
                
                String columnName = rsMetadata.getColumnLabel(index);// 列名
                int size =rsMetadata.getColumnDisplaySize(index);// 列容量
                String columnType = rsMetadata.getColumnTypeName(index);// 列数据类型
                boolean allowNull=(rsMetadata.isNullable(index)!=0);// 列是否允許为空
                
                Field f=new Field();
                f.name=columnName;
                f.size=size;
                f.type=columnType;
                f.allowNull=allowNull;
                
                if(isFetchall==true) {
                    fields.add(f);
                }else {
                    if(f.allowNull==false) {
                        fields.add(f);
                    }
                }
            }
            
            rs.close();
    
            return fields;
        }
        
        /**
         * 取得当前时间戳
         * @return
         */
        private static String getTimestamp() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            return sdf.format(new Date().getTime());
        }
        
        /**
         * 执行点
         * @param args
         */
        public static void main(String[] args) {
            String[] tables= {"emp","person","testdb"};
            XlsMaker xm=new XlsMaker();
            xm.makeXlsFrom(tables);
        }
    }

    输出Xls效果如下:

    真正要用的时候,按类型填完数据,删除头三行和第一列就可以用了。

    pom.xml有三个依赖项:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.hy</groupId>
          <artifactId>FindNotnullColumns</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      
          <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
        
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
        </dependencies>
    </project>

    虽然任务过去,工具才做出来,但有了工具总比没有好,说不定下次就能省事,要是这个工具也能帮到你那就再好不过了。

    --END-- 2019年11月2日20:01:28

  • 相关阅读:
    Redis与Redis 伪集群环境的搭建
    github的基本使用
    使用七牛云存储图片或文件并回显
    阿里云搭建wordpress博客教程
    判断是否同一天 同一月
    Python学习笔记之 并发编程
    Python学习笔记之 日志模块logging使用详解
    Python学习笔记之 网络编程(socket套接字编程)
    Python实现TCP文件传输
    实例:Python实现聊天室
  • 原文地址:https://www.cnblogs.com/heyang78/p/11783796.html
Copyright © 2011-2022 走看看