今天一个哥们问,用jdbc能不能把excel作为数据源访问?
考虑之前写的一个java访问access的例子,稍加修改,测试可以用。
测试例子,新建一个excel,命名为Mobile.xls,在Sheet1里写入如下两行:
手机号
13900000001.0
java代码如下:
import java.sql.*;
public class javaExcel{
public static void main(String args[]) throws Exception{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dburl ="jdbc:odbc:driver={Microsoft Excel Driver (*.xls)};DBQ=Mobile.xls";//此为NO-DSN方式
//String dburl ="jdbc:odbc:odbcName";//此为ODBC连接方式
Connection conn=DriverManager.getConnection(dburl);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select Top 20 * from [Sheet1$]");
while(rs.next()){
System.out.println(rs.getString(1));
}
rs.close();
stmt.close();
conn.close();
}
}
运行以上代码,显示:
13900000001.0
没有读到第一行,考虑到程序是否默认第一行为列名了呢?试一下用metadata是否可以拿到。如下修改代码:
import java.sql.*;
public class javaExcel{
public static void main(String args[]) throws Exception{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dburl ="jdbc:odbc:driver={Microsoft Excel Driver (*.xls)};DBQ=Mobile.xls";//此为NO-DSN方式
//String dburl ="jdbc:odbc:odbcName";//此为ODBC连接方式
Connection conn=DriverManager.getConnection(dburl);
PreparedStatement stmt=conn.prepareStatement("select Top 20 * from [Sheet1$]");
ResultSet rs=stmt.executeQuery();
ResultSetMetaData rsmd=stmt.getMetaData();
System.out.println(rsmd.getColumnName(1));
while(rs.next()){
System.out.println(rs.getString(1));
}
rs.close();
stmt.close();
conn.close();
}
}
运行以上代码,显示:
手机号
13900000001.0
看来猜测没错。
此方法使用excel,只在windows并安装excel的机器上测试过,没有测试其他环境。
此方法的限制,对数据类型受制于excel,细心点可以看到手机号后面多了一个.0,变成了数字型;所以访问excel还是建议使用jxls或jexcelapi等api来操作,这样可以访问类型更丰富的、布局更复杂的excel。
jxls:
http://jxls.sourceforge.net
jexcelapi:
http://jexcelapi.sourceforge.net/