日期:2014-05-16  浏览次数:20595 次

Java解析之纠结的DBF文件
   
    明天,持续更新Lucene系列博文,欢迎收看!
  Lucene群交流:324714439

下面进入正题


最近客户提了个新的需求,需要我们的程序支持如下几种文件的解析
编号文件格式
1XML
2Excel
3Access
4DBF
5MDB

可能有些朋友,不知道DBF这种格式的文件是什么东西,在这之前,散仙,先小小科普下这种古董级的数据库格式,来看下百度百科是怎么介绍的。

一种特殊的文件格式!表示数据库文件,Foxbase,Dbase,Visual FoxPro,等数据库处理系统所产生的数据库文件!
DBF 数据库可以分为 dBase III 、foxpro 格式两类。
DBF 数据库是常用的桌面型数据库,它曾经被各企业、事业单位广泛使用。现在,虽然已经有了很多的各种各样的小、中、大型数据库,DBF 数据库依然被很多单位用于数据交换。

下面我们来看下Foxbase DBF的截图.





DBF,以及Access都是微软支持的数据库产品,解析时使用jdbc-odbc桥接的方式,可以很方便解析。
关于MDB,其实是SQL Server分离后的数据库,这个直接可以直接导入数据库使用,然后使用Java的JDBC读取即可,这个需求很简单,散仙在这里就不用多演示了,下面,我们来重点看下其他4种文件的Java解析方法




1.解析XML,散仙使用的是jdom2,解析起来也比较方便快捷,XML格式如下


核心代码如下

File f = new File("E:\\data\\test.xml");              
				 Document doc=sax.build(f);//解析file的xml文件
				 Element root=doc.getRootElement();//获取根节点
				 List<Element> eles= root.getChildren();//获取根节点下面子节点的集合
				// System.out.println(eles.size());
				 List<XmlEntity> xmls=new ArrayList<XmlEntity>();
				 for(Element e:eles){
					 String ui=e.getChildText("ui");
					 String ti=e.getChildText("ti");
					 String ta=e.getChildText("ta");
					 String dp=e.getChildText("dp");
					 String vi=e.getChildText("vi");
					 String ip=e.getChildText("ip");
					 String pg=e.getChildText("pg");
					 String mh=e.getChildText("mh");
					 xmls.add(new XmlEntity(ui, ti, ta, dp, vi, ip, pg, mh));
//					 System.out.println(e.getChildText("ui"));
//					 System.out.println(e.getChildText("ti"));
//					 System.out.println(e.getChildText("ta"));
//					 System.out.println(e.getChildText("dp"));
//					 System.out.println(e.getChildText("vi"));
//					 System.out.println(e.getChildText("ip"));
//					 System.out.println(e.getChildText("pg"));
//					 System.out.println(e.getChildText("mh"));
					 
					// System.out.println("=================================");
					 
				 }
				 DAO.add(xmls);//持久化到数据库中
				 System.out.println("添加成功!");
				 // System.out.println("获取根节点的名字 :"+root.getName());
			 



2,使用POI解析Excel,格式如下



核心代码如下

/**
	 * 判断单元格格式
	 * **/
	 private static String getCellValue(HSSFCell cell) {  
	        String cellValue = "";  
	        DecimalFormat df = new DecimalFormat("#");  
	       
	        switch (cell.getCellType()) {  
	        case HSSFCell.CELL_TYPE_STRING:  
	            cellValue = cell.getRichStringCellValue().getString().trim();  
	            break;  
	        case HSSFCell.CELL_TYPE_NUMERIC:  
	            cellValue = df.format(cell.getNumericCellValue()).toString();  
	            break;  
	        case HSSFCell.CELL_TYPE_BOOLEAN:  
	            cellValue = String.valueOf(cell.getBooleanCellValue()).trim();  
	            break;  
	        case HSSFCell.CELL_TYPE_FORMULA:  
	            cellValue = cell.g