将EXCEL电子表格文档,导入VFP DBF数据库的Java程序

程序名称:ExcelToDbf
作        者:半点闲
功能说明:将指定格式的EXCEL导入到指定格式的DBF数据库文件中。
编写原因:人事科的同事接到上级任务,需将原EXCEL职工信息表中的数据,录入到VFP DBF数据库中(唉~~~年年怪事有,今年特别多啊!)。同仁着难我岂能等闲视之,正好自学JAVA也有多日,就拿它来练练手吧。

开发环境:
操作系统:中文Windows Xp
编辑器:NetBeans 5.5.1
语言    :Java
外部类:jxl.jar
数据库访问方式:JDBC-ODBC桥接


Excel格式如下图:


DBF数据库字段如下图:


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();
    }

    
}
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;      //工作表总行数.
}
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;//数据对像.
}


因为这个程序的寿命也许就用这么一次,所以程序代码没有进行精心的设计,性能方面没有进行任何优化。希望大虾们多提保贵意见,在此我感激涕零......

初编JAVA程序的感觉:
编写JAVA程序感觉就像自已是个BOSS,以前用C/C++编写程序时总是从头到脚的编写申请、释放资源的代码,深怕一不留神造成内在泄漏。JAVA只需要提出资源需求,而无需为回收资源而担心(全都交给了垃圾回收器)。这不和当BOSS是一样的感觉吗?

上述源程序代码下载

使用VFP读取EXCEL中的数据示例 *!* *****数据导入程序,由“学生基本基本情况表模板.xls”导入数据 *!* ***使用VFP控制EXCEL表,计取中指定列的内容*********** *!* "学生基本基本情况表模板.xls"的数据布局 *!* cells(1,1):“标题” *!* cells(2,1):校区 *!* cells(2,3):学历 *!* cells(2,5):专业 *!* cells(2,6):班级 *!* *!* set safe off set talk on LOCAL inf(4) as String *dele file C:\MyDocu~1\Resume.xlw objExcel = CreateObject("Excel.Application") &&创建一个EXCEL应用程序实例 wjm=getfile("xls") objExcel.Workbooks.Open(wjm) &&调用workbooks(Microsoft Excel 应用程序; 中当前打开的所有 Workbook 对象的集合。); 对象的open方法程序来打开指定的文件,并为; 打开的文件创建一个新的工作簿 *objexcel.visible=.f. ***下面的代码判断出生日期字段的格式是否满足要求*** *IF !varTYPE(objexcel.cells(10,6))="d" * MESSAGEBOX("出生日期字段不满足格式要求,不能导入,请将出生日期字段修改为:"+CHR(13); +"mm.dd.yy的格式,如:05.19.83 表示1983年5月19 然后再运行此导入程序") * RETURN *ENDIF inf(1)=substr(objexcel.cells(2,1).value,7)&&校区 Inf(2)=objexcel.cells(2,4).value&&学历 inf(3)=objexcel.cells(2,6).value&&专业 inf(4)=objexcel.cells(2,7).value&&班 LOCAL nrow as Number ,i as Number i=0 *MESSAGEBOX("计算行数") *MESSAGEBOX(objexcel.cells(5,1).value) *MESSAGEBOX(VARTYPE(objexcel.cells(22,1).value)) DO WHILE .t. i=i+1 ?objexcel.cells(i,1).value IF !VARTYPE(objexcel.cells(i,1).value)="C" nrow=i-1 EXIT ENDIF ENDDO *nrow=20 LOCAL arecord(16) *MESSAGEBOX("循环添加记录") USE zlb disinf("zlb.dbf中现有记录"+ALLTRIM(STR(RECCOUNT()))+"条") disinf("正在添加记录") FOR i=4 TO nrow arecord(1)=objexcel.cells(i,1).value&&学号  arecord(2)=objexcel.cells(i,2).value&&姓名 arecord(3)=objexcel.cells(i,3).value&&性别 arecord(4)=objexcel.cells(i,4).value&&籍贯 arecord(5)=objexcel.cells(i,5).value&&民族 *MESSAGEBOX(VARTYPE(objexcel.cells(i,6).value)) IF VARTYPE(objexcel.cells(i,6).value)="C" arecord(6)=RIGHT(objexcel.cells(i,6).value,2)+"/"+"01"+'/'; +LEFT(objexcel.cells(i,6).value,2) ELSE arecord(6)= RIGHT(STR(objexcel.cells(i,6).value,5,2),2); +"/"+"01"+"/"; +LEFT(STR(objexcel.cells(i,6).value,5,2),2) ENDIF &&arecord(6)=IIF(VARTYPE(objexcel.cells(i,6).value)="c",RIGHT(objexcel.cells(i,6).value,2)+"/"+"01"+'/'+LEFT(objexcel.cells(i,6).value,2),; RIGHT(STR(objexcel.cells(i,6).value,5,2),2)+"/"+"01"+'/'+LEFT(STR(objexcel.cells(i,6).value,5,2),2))&&出生年月 arecord(7)=LEFT(ALLTRIM(STR(objexcel.cells(i,8).value,6,0)),6)&&邮政编码 arecord(8)=objexcel.cells(i,7).value&&通讯地址 arecord(9)=objexcel.cells(i,9).value &&收信人 arecord(10)=iif(!ALLTRIM(objexcel.cells(i,10).value)=="",objexcel.cells(i,10).value; ,"无")&&家庭电话 arecord(11)=inf(3)&&专业 arecord(12)=inf(4)&&班级 arecord(13)=objexcel.cells(i,11).value&&寝室号码 arecord(14)=STR(objexcel.cells(i,12).value,7,0)&&寝室电话 arecord(15)=inf(1)&&校区 arecord(16)=inf(2)&&学历 SELECT zlb APPEND FROM ARRAY arecord ENDFOR disinf("zlb.dbf中现有记录"+ALLTRIM(STR(RECCOUNT()))+"条") disinf("记录添加完毕,共添加了"+ALLTRIM(STR(nrow-3))+"条记录,请查检") INKEY(3) WAIT CLEAR ****定义日期换函数,此函数能将各种格式的日期换成mm/dd/yy的格式**** ****如果要换的日期只有年和月,则自动添加日为'01'*** *!* FUNCTION datetran *!* PARAMETERS soudate *!* IF VARTYPE(soudate)="N" *!* DO case *!* CASE LEN(souDATE) ***关闭工作簿,退出EXCEL objexcel.quit RELEASE objexcel *!* objexcel.save *!* *objExcel.ActiveWorkbook.saved=.f. *!* objexcel.Quit &&退出 *!* RELEASE objexcel *!* retu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值