Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 267|回复: 0

[JDBC学习]JDBC-ODBC读写Excel文件(java)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 02:04:45 | 显示全部楼层 |阅读模式
    背景介绍
       在我们日常进行的与java相关的开发中,可能会碰到要把一批特定格式的数据倒入到 系统中的情况。举个例子来说,假设我正在作一个公司的员工培训信息管理系统,该系统中要涉及到员工的信息,课程的信息等。考虑到公司人员流动比较频繁,时常会有一个批新的员工加入到这个系统中来,我们在作需求会考虑这样一个功能,就是批量地添加公司员工的信息。而在工作中,几乎全部的类似员工信息的数据都是MS的Excel 文件。那么,现在的问题就是能不能把一个Excel文件倒入到系统中,系统从Excel文件中得到需要的数据呢?参考[1]中就是这样的例子,在这里,通 过学习[1],我也列出了一个类似的例子。

    思路
    其实,用Java读取Excel文件并非难事。对Excel,Access等文件,微软都提供了ODBC驱动,而了解Java的人一定熟悉JDBC,我们的思路就是用JDBC-ODBC Driver来读取Excel文件。  
      
       
       
         
       

         
       
      
    步骤一,创建Excel文件
       我们就来创建一个员工信息的Excel文件吧。该文件名称就叫Employee,包 括5列:ID、Name、Gender、Title和Email。见Figuree 1。 为了能被微软的ODBC Driver识别,Excel文件要满足一定的格式。一般来说,ODBC Driver会把Excel WorkSheet的第一行的列名当成数据库表的对应得列名,而数据库表的名字就是WorkSheet的名字(注意数据库表的名字不是Excel文件的名 字)。
      



      
       
       
       
         
          ID
          
       
         
          Name
          
       
         
          Gender
          
       
         
          Title
          
       
         
          Email
          
       
       
       
         
          1000
          
       
         
          Jesse, G.
          
       
         
          M
          
       
         
          PM
          
       
         
          jesse@someorg.org
          
       
       
       
         
          1001
          
       
         
          Kamal
          
       
         
          M
          
       
         
          SE
          
       
         
          kamal@someorg.org
          
       
       
       
         
          1002
          
       
         
          Jenny
          
       
         
          F
          
       
         
          PA
          
       
         
          jenny@somgorg.org
          
       
       
       
         
          1003
          
       
         
          …
          
       
         
          …
          
       
         
          …
          
       
         
          …
          
       
       
      


    Figure 1 Employee




    步骤二,创建ODBC数据源


    首先打开“控制面板”,然后是“管理工具”,接着在该目录下选择“数据源”。这时会有一个对话框弹出。
    转到系统DSN标签,选添加:

    在选择驱动列表中如下图选择。点击“完成”,出现


    在“数据源名”编辑框输入“emp”,在“选择工作簿…”选中刚才创建的Excel文件Employee.xls,注意去掉只读选项,否则我们只能从该数据源读取数据,而不能插入和修改。点击确定。





    最后emp会出现在“系统数据源”列表中。如下图。 到此,一个ODBC数据源就建好了。


      
       下面就让我们来写一段java代码来读取该Excel文件。我们知道该文件中存储着员工的信息,假设我们现在要完成两个工作,一个是根据员工ID,列出该员工的相关信息;一个是向数据库中添加新的记录。
    如果我们现在是对Oracle或是MSSQL等常见数据库操作,实现这两个功能的SQL语句马上就可以写出。假设表名为employee,下面的两条SQL语句分别是查询ID为1000的员工记录和插入一条ID为1005的新记录。

    1) SELECT ID, Name, Gender, Title, Email FROM employee WHERE ID=1000;
    2) INSERT INTO employee(ID, Name, Gender, Title, Email) VALUES (1005, "Yanjiang", "M","PM","yanan@hotmail.com");
    那么对Excel文件,这样写可以吗? 其实查询和读取Excel的SQL,95%以上和上面的是一样的。只需要注意一点,就是我们不能直接使用数据库表名,而是要在其后加上$字符,并把新的名字放到[]中。对于这个例子来说,因为我们的数据表名为employee,所以在SQL语句中我们要写成 [employee$]

    3) SELECT ID, Name, Gender, Title, Email FROM [employee$] WHEREID=1000;
    4) INSERT INTO [employee$] (ID, Name, Gender, Title, Email) VALUES (1005, "Yanjiang", "PM","yanan@hotmail.com");
    下面就列出了所有的代码。
    1. import java.sql.Connection;
    2. import java.sql.ResultSetMetaData;
    3. import java.sql.SQLException;
    4. import java.sql.Statement;
    5. import java.sql.ResultSet;
    6. import java.sql.DriverManager;
    7. import java.util.Collection;
    8. import java.util.HashMap;
    9. import java.util.Iterator;

    10. public class ExcelAccess {
    11.    
    12.     private Connection c;
    13.     private Statement stmnt;   
    14.     private String driver;
    15.     private String url;
    16.     private String username;
    17.    
    18.     private String password;


    19.     public ExcelAccess() {
    20.         driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    21.         url = "jdbc:odbc:emp";
    22.         username = "";
    23.         password = "";
    24.     }

    25.     /**
    26.      * constructor with specified parameters
    27.      */
    28.     public ExcelAccess(String driver, String url,String username, String password) {
    29.         this.driver = driver;
    30.         this.url = url;
    31.         this.username = username;
    32.         this.password = password;
    33.     }

    34.     public boolean openConnection() {
    35.         try {
    36.             Class.forName(driver);
    37.             c = DriverManager.getConnection(url, username, password);
    38.             stmnt = c.createStatement();
    39.         } catch (Exception e) {
    40.             e.printStackTrace();
    41.             return false;
    42.         }
    43.         return true;
    44.     }

    45.    
    46.     public HashMap getEmpInfo(int empid) {
    47.         HashMap result = new HashMap();
    48.         if (stmnt == null) {
    49.             return result;
    50.         }
    51.         String query = "SELECT * FROM [employee$] WHERE ID = " + empid;
    52.         ResultSet rs;

    53.         try {
    54.              rs = stmnt.executeQuery(query);
    55.              ResultSetMetaData rsmd = rs.getMetaData();
    56.              int numberOfColumns = rsmd.getColumnCount();

    57.             String strTemp;
    58.             while (rs.next()) {
    59.                 for (int i = 0; i < numberOfColumns; i++) {
    60.                     strTemp = rsmd.getColumnName(i + 1);
    61.                     result.put(strTemp, rs.getString(strTemp));
    62.                 }
    63.             }
    64.         } catch (SQLException e) {
    65.             e.printStackTrace();
    66.         }
    67.         return result;
    68.     }

    69.    
    70.     public int insertEmpInfo(int id, String name, char gender, String title, String email) {
    71.         int result = -1;
    72.         if (stmnt == null)
    73.             return result;
    74.         // generate the query string
    75.         String query = "INSERT INTO [employee$] VALUES(";
    76.         query += id + ", ";
    77.         query += """ + name + "", ";
    78.         query += """ + gender + "", ";
    79.         query += """ + title + "", ";
    80.         query += """ + email + """;
    81.         query += " )";

    82.         try {
    83.             // execute the query
    84.             result = stmnt.executeUpdate(query);
    85.         } catch (SQLException e) {
    86.             e.printStackTrace();
    87.         }
    88.         return result;
    89.     }

    90.     /**
    91.      * close the connection
    92.      */
    93.    public boolean closeConnection() {
    94.         try {
    95.             if (stmnt != null)
    96.                 stmnt.close();
    97.             if (c != null)
    98.                 c.close();
    99.         } catch (Exception e) {
    100.             System.err.println(e);
    101.             return false;
    102.         }
    103.         return true;
    104.     }

    105.     public static void main(String[] args) {
    106.         ExcelAccess ea = new ExcelAccess();
    107.         HashMap res = null;
    108.         if (!ea.openConnection()) {
    109.             System.err.println("open connection err.");
    110.             System.exit(1);
    111.         }
    112.         // get emp# 1000"s information
    113.         System.out.println("Get Emp# 1000:");
    114.         res = ea.getEmpInfo(1000);

    115.         if (res != null) {
    116.             Collection c = res.keySet();
    117.             Iterator i = c.iterator();
    118.             while (i.hasNext()) {
    119.                  Object key = i.next();
    120.                  Object value = res.get(key);
    121.                  System.out.println(key + "        " + value);
    122.             }// while ends
    123.         }

    124.         // insert a new record into the table
    125.         int ret = ea.insertEmpInfo(1005, "Yanjiang", "M","PM", "yanan@hotmail.com");
    126.         if (ret == 1) {
    127.             System.out.println("emp# 1005 inserting success.");
    128.         }
    129.         // close the connection
    130.         ea.closeConnection();
    131.     }
    132. }
    复制代码
    运行结果: Get Emp# 1000:
    Email jesse@someorg.org
    Gender M
    Title PM
    Name Jesse, G.
    ID 1000.0
    emp# 1005 inserting success. 总结
       到此这篇文章就结束了,这个例子实现了Java读写Excel文件,类似,我们可以去读写dBase、Access文件等。还有就是这个简单的例子充分说明了当初设计JDBC,ODBC等驱动的英明之处。值得一提的是,现在已有了比较成 熟的专门操作 EXCEL文件的Java API。Jakarta POI 和 Java Excel API就是其中的两个Open Source项目。感兴趣的可以从网上搜索一下,应该会有很多关于的资料。

    参考
    [1] http://www.javaworld.com/javaworld/javaqa/2001-06/04-qa-0629-excel.HTML
      

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/11/020444859.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-2 09:05 , Processed in 0.436804 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表