热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用JavaandJDBC-ODBC读写Excel文件

用Java读写Excel文件背景介绍在我们日常进行的与java相关的开发中,可能会碰到要把一批特定格式的数据倒入到系统中的情况。举
用Java 读写Excel 文件
 
背景介绍
在我们日常进行的与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 数据源
首先打开“控制面板”,然后是“管理工具”,接着在该目录下选择“数据源”。这时会有一个对话框弹出。见Figure 2。

Data Source Admin

Figure 2 Data Source Admin

选择“添加”按钮,在选择驱动列表中选择Driver do Microsoft Excel。点击“完成”,出现Figure 3。

Excel Setup

Figure 3 Excel Setup

在“Data Source Name”编辑框输入“emp”,“Select Workbook…”选中刚才创建的Excel文件Employee.xls,见Figure 4。注意去掉Read only选项,否则我们只能从该数据源读取数据,而不能插入和修改。点击确定。
Select Workbook
Figure 4 Select Workbook
最后emp会出现在“User Data Sources”列表中。见Figure 5。 到此,一个ODBC数据源就建好了。
  Data Source 2
Figure 5 Data Source 2
 
步骤三, 编写 Excel 读写类
下面就让我们来写一段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','yanjiangqian@hotmail.com');
那么对Excel文件,这样写可以吗? 其实查询和读取Excel的SQL,95%以上和上面的是一样的。只需要注意一点,就是我们不能直接使用数据库表名,而是要在其后加上$字符,并把新的名字放到[]中。对于这个例子来说,因为我们的数据表名为employee,所以在SQL语句中我们要写成 [employee$]
 
3) SELECT ID, Name, Gender, Title, Email FROM [employee$] WHERE ID=1000;
4) INSERT INTO [employee$] (ID, Name, Gender, Title, Email)
         VALUES (1005,  'Yanjiang', 'M', 'PM','yanjiangqian@hotmail.com');
下面就列出了所有的代码。
 
// ExcelAccess.java
import java.sql.Connection;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
 
public class ExcelAccess {
    /** db connection */
    private Connection c;
    /** db statement */
    private Statement stmnt;   
    /** JDBC driver name */
    private String driver;
    /** url of the db */
    private String url;
    /** username to access the db */
    private String username;
    /** password for the username */
    private String password;
 
    /** default constructor */
    public ExcelAccess() {
        driver = "sun.jdbc.odbc.JdbcOdbcDriver";
        url = "jdbc:odbc:emp";
        username = "";
        password = "";
    }
 
    /**
     * constructor with specified parameters
     */
    public ExcelAccess(String driver, String url,
            String username, String password) {
        this.driver = driver;
        this.url = url;
        this.username = username;
        this.password = password;
    }
 
    /**
     * open the connection
     * @return true if opened, false otherwise
     */
    public boolean openConnection() {
        try {
            Class.forName(driver);
            c = DriverManager.getConnection(url, username,
                    password);
            stmnt = c.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * Function 1: get the emplpyee's information by the emp id
     * @param empid
     * @return the query result
     */
    public HashMap getEmpInfo(int empid) {
        HashMap result = new HashMap();
        if (stmnt == null) {
            return result;
        }
        // how the query looks like
        String query = "SELECT * FROM [employee$] WHERE ID = "
                + empid;
        ResultSet rs;
 
        try {
            // execute the query
           rs = stmnt.executeQuery(query);
            // get the columns' information
            ResultSetMetaData rsmd = rs.getMetaData();
            int numberOfColumns = rsmd.getColumnCount();
 
            String strTemp;
            // store the result to the HashMap
            while (rs.next()) {
                for (int i = 0; i
                    strTemp = rsmd.getColumnName(i + 1);
                    result.put(strTemp, rs
                            .getString(strTemp));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }
 
    /**
     * Function 2: insert a new record into the database   
     * @return 1 if the record be inserted, 0 otherwise
     */
    public int insertEmpInfo(int id, String name,
            char gender, String title, String email) {
        int result = -1;
        if (stmnt == null)
            return result;
        // generate the query string
        String query = "INSERT INTO [employee$] VALUES(";
        query += id + ", ";
        query += "'" + name + "', ";
        query += "'" + gender + "', ";
        query += "'" + title + "', ";
        query += "'" + email + "'";
        query += " )";
 
        try {
            // execute the query
            result = stmnt.executeUpdate(query);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }
 
    /**
     * close the connection
     */
   public boolean closeConnection() {
        try {
            if (stmnt != null)
                stmnt.close();
            if (c != null)
                c.close();
        } catch (Exception e) {
            System.err.println(e);
            return false;
        }
        return true;
    }
 
    public static void main(String[] args) {
        ExcelAccess ea = new ExcelAccess();
        HashMap res = null;
        // open connection
        if (!ea.openConnection()) {
            System.err.println("open connection err.");
            System.exit(1);
        }
        // get emp# 1000's information
        System.out.println("Get Emp# 1000:");
        res = ea.getEmpInfo(1000);
 
        if (res != null) {
            Collection c = res.keySet();
            // obtain an Iterator
            Iterator i = c.iterator();
            while (i.hasNext()) {
                // obtain a key
                Object key = i.next();
                // obtain the value of the key
                Object value = res.get(key);
                System.out.println(key + "/t" + value);
            }// while ends
        }
 
        // insert a new record into the table
        int ret = ea.insertEmpInfo(1005, "Yanjiang", 'M',
                "PM", "yanjiangqian@hotmail.com");
        if (ret == 1) {
            System.out.println("emp# 1005 inserting success.");
        }
        // close the connection
        ea.closeConnection();
    }
}
Following is the running result:

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

推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
author-avatar
青春脸001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有