TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
背景介绍
在我们日常进行的与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");
下面就列出了所有的代码。
- 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 {
-
- private Connection c;
- private Statement stmnt;
- private String driver;
- private String url;
- private String username;
-
- private String password;
-
-
- 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;
- }
-
- 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;
- }
-
-
- public HashMap getEmpInfo(int empid) {
- HashMap result = new HashMap();
- if (stmnt == null) {
- return result;
- }
- String query = "SELECT * FROM [employee$] WHERE ID = " + empid;
- ResultSet rs;
-
- try {
- rs = stmnt.executeQuery(query);
- ResultSetMetaData rsmd = rs.getMetaData();
- int numberOfColumns = rsmd.getColumnCount();
-
- String strTemp;
- while (rs.next()) {
- for (int i = 0; i < numberOfColumns; i++) {
- strTemp = rsmd.getColumnName(i + 1);
- result.put(strTemp, rs.getString(strTemp));
- }
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return result;
- }
-
-
- 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;
- 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();
- Iterator i = c.iterator();
- while (i.hasNext()) {
- Object key = i.next();
- Object value = res.get(key);
- System.out.println(key + " " + value);
- }// while ends
- }
-
- // insert a new record into the table
- int ret = ea.insertEmpInfo(1005, "Yanjiang", "M","PM", "yanan@hotmail.com");
- if (ret == 1) {
- System.out.println("emp# 1005 inserting success.");
- }
- // close the connection
- ea.closeConnection();
- }
- }
复制代码 运行结果: 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 |
|