程序名称:ExcelToDbf
作 者:半点闲
功能说明:将指定格式的EXCEL导入到指定格式的DBF数据库文件中。
编写原因:人事科的同事接到上级任务,需将原EXCEL职工信息表中的数据,录入到VFP DBF数据库中(唉~~~年年怪事有,今年特别多啊!)。同仁着难我岂能等闲视之,正好自学JAVA也有多日,就拿它来练练手吧。
开发环境:
操作系统:中文Windows Xp
编辑器:NetBeans 5.5.1
语言 :Java
外部类:jxl.jar
数据库访问方式:JDBC-ODBC桥接
Main类代码如下:
/**/
/*
* Main.java
*
* Created on 2007年7月19日, 上午10:48
* 作者:高玉涵
* 这是一个将EXCEL表导入到DBF数据库的程序.
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package exceltodbfjavabdx;
/** */ /**
*
* @author Administrator
*/
public class Main ... {
/** *//** Creates a new instance of Main */
public Main() ...{
}
/** *//**
* @param args the command line arguments
*/
public static void main(String[] args) ...{
// TODO code application logic here
Excel excel = new Excel ("a.xls");
System.out.printf ("导入出错:%d记录。", excel.ExcelTodbf("D:/Java/excelTodbf.java.bdx","a"));
excel.close();
}
}
* Main.java
*
* Created on 2007年7月19日, 上午10:48
* 作者:高玉涵
* 这是一个将EXCEL表导入到DBF数据库的程序.
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package exceltodbfjavabdx;
/** */ /**
*
* @author Administrator
*/
public class Main ... {
/** *//** Creates a new instance of Main */
public Main() ...{
}
/** *//**
* @param args the command line arguments
*/
public static void main(String[] args) ...{
// TODO code application logic here
Excel excel = new Excel ("a.xls");
System.out.printf ("导入出错:%d记录。", excel.ExcelTodbf("D:/Java/excelTodbf.java.bdx","a"));
excel.close();
}
}
Excel类代码如下:
/**/
/*
* Excel.java
*
* Created on 2007年7月19日, 上午10:53
* 作者:高玉涵
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
* 这是一个操作EXCEL表格的类.
*/
package exceltodbfjavabdx;
import java.lang. * ;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io. * ;
import jxl. * ;
/** */ /**
*
* @author Administrator
*/
public class Excel ... {
/** *//** Creates a new instance of Excel */
public Excel()...{
}
public Excel (String strFileName)
...{
/**//*创建读取Excel表的构造函数。
*@param strFileName 文件名。
*/
try
...{
work = Workbook.getWorkbook (new File (strFileName));//打开Excel工作薄。
sht = work.getSheet(DEFAULT_SHEET);//获取工作表。
iColumns = sht.getColumns();//获取工作表中所包含的总列数.
iRows = sht.getRows();//获取工作表中所包含的总行数.
}
catch (Exception e)
...{
e.printStackTrace();
}
}
public void displayAll ()
...{
/**//*
*屏幕中显示Excel表中所有数据。
*/
String strFormat = "";
for(int i=0; i<iRows; i++)
...{
for(int j=0; j<iColumns; j++)
...{
Cell cell = sht.getCell(j, i);//按行读取单元格内容。
strFormat = getCellValue (cell);
if(j<=iColumns) strFormat += ",";
System.out.print (strFormat);
}
System.out.println();
}
}
public int ExcelTodbf (String dbfPath, String dbfFileName)
...{
/**//*
*将指的Excel表格中的数据(格式已知)导入到指定DBF数据库中(格式已知)。
*@param dbfPath DBF数据库路径。
*@param dbfFileName DBF数据库文件名(不含扩展名)。
*返回导入出错的记录数。
*/
int iCounter = 0;//存放导入成功的计数器。
DBF dbf = new DBF (dbfPath, dbfFileName);
for(int i=0; i<iRows; i++)
...{
String tmp = "";
for(int j=0; j<iColumns; j++)
...{
Cell cell = sht.getCell(j, i);//按行读取单元格内容。
String strFormat = getCellValue (cell);
if(j<iColumns - 1) strFormat +=",";//在字段间加入逗号.
tmp += strFormat;
}
String cmd = "INSERT INTO " + dbfFileName +" VALUES" + "(" + tmp + ")";
iCounter += dbf.executeUpdate(cmd);
}
dbf.close();
return iRows - iCounter;
}
private String getCellValue(Cell cell)
...{
/**//*
*输出单元格内容。
*@param cell 单元格对像。
*/
String str = "";
if(cell.getType() == CellType.LABEL)
...{
LabelCell label = (LabelCell)cell;
str = label.getString();
str = str.trim();
str = str.replaceAll(" ","");
str = str.replaceAll(" ","");
str = "'" + str + "'";
return str;
}
if(cell.getType() == CellType.NUMBER)
...{
NumberCell num = (NumberCell)cell;
int value = (int)num.getValue();
str += "'";
str += Integer.toString(value);
str += "'";//为了省事,我将目地数据库,数值字段都设置成了字符型,等导入之后再将它改为数值型。
return str;
}
if(cell.getType() == CellType.DATE)
...{
//日期类型简单的当字符处理。
str = "{" + cell.getContents() + "}";
return str;
}
if(cell.getType() == CellType.EMPTY)
...{
str = "''";
return str;
}
return str;
}
public void close ()...{
work.close();
}
private Workbook work = null; //工作薄(只读)。
private Sheet sht = null; //工作表(只读)。
private final int DEFAULT_SHEET = 0; //默认处理的工作表。
private int iColumns = 0; //工作表总列数.
private int iRows = 0; //工作表总行数.
}
* Excel.java
*
* Created on 2007年7月19日, 上午10:53
* 作者:高玉涵
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
* 这是一个操作EXCEL表格的类.
*/
package exceltodbfjavabdx;
import java.lang. * ;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io. * ;
import jxl. * ;
/** */ /**
*
* @author Administrator
*/
public class Excel ... {
/** *//** Creates a new instance of Excel */
public Excel()...{
}
public Excel (String strFileName)
...{
/**//*创建读取Excel表的构造函数。
*@param strFileName 文件名。
*/
try
...{
work = Workbook.getWorkbook (new File (strFileName));//打开Excel工作薄。
sht = work.getSheet(DEFAULT_SHEET);//获取工作表。
iColumns = sht.getColumns();//获取工作表中所包含的总列数.
iRows = sht.getRows();//获取工作表中所包含的总行数.
}
catch (Exception e)
...{
e.printStackTrace();
}
}
public void displayAll ()
...{
/**//*
*屏幕中显示Excel表中所有数据。
*/
String strFormat = "";
for(int i=0; i<iRows; i++)
...{
for(int j=0; j<iColumns; j++)
...{
Cell cell = sht.getCell(j, i);//按行读取单元格内容。
strFormat = getCellValue (cell);
if(j<=iColumns) strFormat += ",";
System.out.print (strFormat);
}
System.out.println();
}
}
public int ExcelTodbf (String dbfPath, String dbfFileName)
...{
/**//*
*将指的Excel表格中的数据(格式已知)导入到指定DBF数据库中(格式已知)。
*@param dbfPath DBF数据库路径。
*@param dbfFileName DBF数据库文件名(不含扩展名)。
*返回导入出错的记录数。
*/
int iCounter = 0;//存放导入成功的计数器。
DBF dbf = new DBF (dbfPath, dbfFileName);
for(int i=0; i<iRows; i++)
...{
String tmp = "";
for(int j=0; j<iColumns; j++)
...{
Cell cell = sht.getCell(j, i);//按行读取单元格内容。
String strFormat = getCellValue (cell);
if(j<iColumns - 1) strFormat +=",";//在字段间加入逗号.
tmp += strFormat;
}
String cmd = "INSERT INTO " + dbfFileName +" VALUES" + "(" + tmp + ")";
iCounter += dbf.executeUpdate(cmd);
}
dbf.close();
return iRows - iCounter;
}
private String getCellValue(Cell cell)
...{
/**//*
*输出单元格内容。
*@param cell 单元格对像。
*/
String str = "";
if(cell.getType() == CellType.LABEL)
...{
LabelCell label = (LabelCell)cell;
str = label.getString();
str = str.trim();
str = str.replaceAll(" ","");
str = str.replaceAll(" ","");
str = "'" + str + "'";
return str;
}
if(cell.getType() == CellType.NUMBER)
...{
NumberCell num = (NumberCell)cell;
int value = (int)num.getValue();
str += "'";
str += Integer.toString(value);
str += "'";//为了省事,我将目地数据库,数值字段都设置成了字符型,等导入之后再将它改为数值型。
return str;
}
if(cell.getType() == CellType.DATE)
...{
//日期类型简单的当字符处理。
str = "{" + cell.getContents() + "}";
return str;
}
if(cell.getType() == CellType.EMPTY)
...{
str = "''";
return str;
}
return str;
}
public void close ()...{
work.close();
}
private Workbook work = null; //工作薄(只读)。
private Sheet sht = null; //工作表(只读)。
private final int DEFAULT_SHEET = 0; //默认处理的工作表。
private int iColumns = 0; //工作表总列数.
private int iRows = 0; //工作表总行数.
}
DBF类代码如下:
/**/
/*
* DBF.java
*
* Created on 2007年7月19日, 下午3:02
* 作者:高玉涵
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
* 这是一个操作VFP DBF数据库文件的类.
*/
package exceltodbfjavabdx;
import java.sql. * ;
/** */ /**
*
* @author Administrator
*/
public class DBF ... {
/** *//** Creates a new instance of dbf */
public DBF() ...{
}
public DBF (String strPath, String strFileName)
...{
/**//*
*通过jdbc-odbc桥连dbf数据库的类
*@param strPath dbf数据库文件所在路径.
*@param strFileName dbf数据库文件名称(不需要提供扩展名如:a.dbf,只提供a就行了.
*/
String url = "jdbc:odbc:Driver={Microsoft Visual FoxPro Driver};" +
"SourceType=DBF;SourceDB=" + strPath + ";Exclusive=No;";
try
...{
//加载驱动程序类手动注册驱动(odbc).
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
conn = DriverManager.getConnection(url);//连接数据库.
statement = conn.createStatement();//为操作SQL语言做准备.
}
catch (Exception e)
...{
e.printStackTrace();
}
}
public int executeUpdate (String strCommand)
...{
/**//*
*对一个表中的记录进行修改、插入和删除操作。分别对应SQL的UPDATE、INSERT和
*DELETE操作。
*@param strCommand 执行的SQL语句。
*对于UPDATE、INSERT、DELETE返回操作影响的行数。对于其它不返回值勤的SQL语句
*返回值为零。
*/
int ret = 0;
try
...{
ret = statement.executeUpdate(strCommand);
}
catch (Exception e)
...{
e.printStackTrace();
}
return ret;
}
public void close ()
...{
try
...{
//rs.close();暂时这里不需要.
statement.close();
conn.close();
}
catch (Exception e)
...{
e.printStackTrace();
}
}
private Connection conn = null;//连接器.
private Statement statement = null;//用于执行SQL命令.
private ResultSet rs = null;//返回查询结果的对像.
private ResultSetMetaData metaData = null;//数据对像.
}
* DBF.java
*
* Created on 2007年7月19日, 下午3:02
* 作者:高玉涵
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
* 这是一个操作VFP DBF数据库文件的类.
*/
package exceltodbfjavabdx;
import java.sql. * ;
/** */ /**
*
* @author Administrator
*/
public class DBF ... {
/** *//** Creates a new instance of dbf */
public DBF() ...{
}
public DBF (String strPath, String strFileName)
...{
/**//*
*通过jdbc-odbc桥连dbf数据库的类
*@param strPath dbf数据库文件所在路径.
*@param strFileName dbf数据库文件名称(不需要提供扩展名如:a.dbf,只提供a就行了.
*/
String url = "jdbc:odbc:Driver={Microsoft Visual FoxPro Driver};" +
"SourceType=DBF;SourceDB=" + strPath + ";Exclusive=No;";
try
...{
//加载驱动程序类手动注册驱动(odbc).
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
conn = DriverManager.getConnection(url);//连接数据库.
statement = conn.createStatement();//为操作SQL语言做准备.
}
catch (Exception e)
...{
e.printStackTrace();
}
}
public int executeUpdate (String strCommand)
...{
/**//*
*对一个表中的记录进行修改、插入和删除操作。分别对应SQL的UPDATE、INSERT和
*DELETE操作。
*@param strCommand 执行的SQL语句。
*对于UPDATE、INSERT、DELETE返回操作影响的行数。对于其它不返回值勤的SQL语句
*返回值为零。
*/
int ret = 0;
try
...{
ret = statement.executeUpdate(strCommand);
}
catch (Exception e)
...{
e.printStackTrace();
}
return ret;
}
public void close ()
...{
try
...{
//rs.close();暂时这里不需要.
statement.close();
conn.close();
}
catch (Exception e)
...{
e.printStackTrace();
}
}
private Connection conn = null;//连接器.
private Statement statement = null;//用于执行SQL命令.
private ResultSet rs = null;//返回查询结果的对像.
private ResultSetMetaData metaData = null;//数据对像.
}
因为这个程序的寿命也许就用这么一次,所以程序代码没有进行精心的设计,性能方面没有进行任何优化。希望大虾们多提保贵意见,在此我感激涕零......
初编JAVA程序的感觉:
编写JAVA程序感觉就像自已是个BOSS,以前用C/C++编写程序时总是从头到脚的编写申请、释放资源的代码,深怕一不留神造成内在泄漏。JAVA只需要提出资源需求,而无需为回收资源而担心(全都交给了垃圾回收器)。这不和当BOSS是一样的感觉吗?