`
xtadg
  • 浏览: 110901 次
社区版块
存档分类
最新评论

java导出dbf文件大数据量的处理方法

 
阅读更多

 

1,用到的jar包:javadbf.jar。

2,如果是小数据量的导出,用普通的方法就可以。

 

用JavaDBF操作(读、写)DBF文件<o:p></o:p>

最近的一个项目需要动态生成DBF文件,用到JavaDBF,简单介绍一下<o:p></o:p>

官方网站:http://javadbf.sarovar.org/<o:p></o:p>

官方英文指南:http://sarovar.org/docman/view.php/32/23/javadbf-tutorial.html<o:p></o:p>

最新版本:<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">0.4.0</st1:chsdate>,最后发布时间还是在<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="1" month="4" year="2004">2004年4月1日</st1:chsdate>,看来DBF真是老了。老归老,有些时候还是得用。<o:p></o:p>

下面是分别是读取和写DBF文件以及其他操作函数(关键信息的解释我放在了注释里,这样看起来会更方便):<o:p></o:p>

读取DBF文件:<o:p></o:p>

<o:p>

java 代码
  1. public static void readDBF(String path)   
  2.   
  3.     {   
  4.   
  5.        InputStream fis = null;
  6.         try 
  7.         {  
  8.             //读取文件的输入流 
  9.             fis  = new FileInputStream(path);
  10.             //根据输入流初始化一个DBFReader实例,用来读取DBF文件信息
  11.             DBFReader reader = new DBFReader(fis);  
  12.             //调用DBFReader对实例方法得到path文件中字段的个数 
  13.             int fieldsCount = reader.getFieldCount();
  14.             //取出字段信息   
  15.             forint i=0; i<fieldsCount; i++)    
  16.             {   
  17.               DBFField field = reader.getField(i);
  18.               System.out.println(field.getName());
  19.             }   
  20.             Object[] rowValues;   
  21.             //一条条取出path文件中记录   
  22.             while((rowValues = reader.nextRecord()) != null
  23.             {   
  24.               forint i=0; i<rowValues.length; i++) 
  25.               {   
  26.                 System.out.println(rowValues[i]); 
  27.               }   
  28.             }   
  29.           }   
  30.           catch(Exception e)    
  31.           {   
  32.           e.printStackTrace();  
  33.           }  
  34.           finally  
  35.           {   
  36.           try{   
  37.                fis.close(); 
  38.           }catch(Exception e){}  
  39.           } 
  40.     }   

 

写DBF文件:

java 代码

 

  1. public static void writeDBF(String path)   
  2.   
  3.  OutputStream fos = null;
  4.  try  
  5.  {   
  6.      //定义DBF文件字段   
  7.      DBFField[] fields = new DBFField[3]; 
  8.      //分别定义各个字段信息,setFieldName和setName作用相同, 
  9.      //只是setFieldName已经不建议使用   
  10.      fields[0] = new DBFField();   
  11.      //fields[0].setFieldName("emp_code"); 
  12.      fields[0].setName("semp_code");   
  13.      fields[0].setDataType(DBFField.FIELD_TYPE_C);   
  14.      fields[0].setFieldLength(10);   
  15.   
  16.      fields[1] = new DBFField();   
  17.      //fields[1].setFieldName("emp_name"); 
  18.      fields[1].setName("emp_name");   
  19.      fields[1].setDataType(DBFField.FIELD_TYPE_C);   
  20.      fields[1].setFieldLength(20);   
  21.   
  22.      fields[2] = new DBFField();   
  23.      //fields[2].setFieldName("salary"); 
  24.      fields[2].setName("salary");  
  25.      fields[2].setDataType(DBFField.FIELD_TYPE_N);   
  26.      fields[2].setFieldLength(12);   
  27.      fields[2].setDecimalCount(2);   
  28.   
  29.      //DBFWriter writer = new DBFWriter(new File(path));   
  30.   
  31.      //定义DBFWriter实例用来写DBF文件   
  32.      DBFWriter writer = new DBFWriter(); 
  33.      //把字段信息写入DBFWriter实例,即定义表结构  
  34.      writer.setFields(fields);   
  35.      //一条条的写入记录   
  36.      Object[] rowData = new Object[3]; 
  37.      rowData[0] = "1000";   
  38.      rowData[1] = "John";   
  39.      rowData[2] = new Double(5000.00);
  40.      writer.addRecord(rowData);   
  41.   
  42.      rowData = new Object[3];  
  43.      rowData[0] = "1001";  
  44.      rowData[1] = "Lalit"
  45.      rowData[2] = new Double(3400.00);   
  46.      writer.addRecord(rowData);   
  47.   
  48.      rowData = new Object[3];
  49.      rowData[0] = "1002";   
  50.      rowData[1] = "Rohit";  
  51.      rowData[2] = new Double(7350.00);  
  52.      writer.addRecord(rowData);   
  53.   
  54.      //定义输出流,并关联的一个文件   
  55.      fos = new FileOutputStream(path);
  56.      //写入数据   
  57.      writer.write(fos);   
  58.   
  59.      //writer.write();  
  60.  }catch(Exception e)   
  61.  {   
  62.      e.printStackTrace();   
  63.  }   
  64.  finally  
  65.  {   
  66.      try{   
  67.      fos.close();
  68.      }catch(Exception e){}
  69.  }   

注意:writer.addRecord(rowData)时并不真正写入数据,在最后writer.write(fos)时才会把数据写入DBF文件,之前addRecord的数据暂时存放在内存中。如果数据量过大,这种方式显然不适合,内存中存储的数据过多,所以JavaDBF提供了另外一种机制来解决这个问题:Sync Mode(同步模式)。使用方法如下:

用new DBFWriter(new File(path))实例化DBFWriter类,最后写入数据时用writer.write(),这样在每次addRecord时数据就被写入的DBF文件中。

因为初始化DBFWriter时传递了DBF文件,所以不用再定义DBF表结构,如果你定义并加载表结构会报异常。

 

 下面这个函数会根据你传入的数据信息自动生成DBF文件,这样以后我们只要构造好数组,就可以直接得到DBF文件,不用每次都去写重复的代码。

 

 

java 代码
  1. public static void generateDbfFromArray(HttpServletResponse response,
  2. String dbfName, String[] strutName,byte[] strutType,
  3. int[] strutLength, Object[][] data){   
  4.   
  5.    OutputStream fos = null
  6.    try
  7.    {  
  8.        dbfName = new String(dbfName.getBytes("gbk"), "ISO-8859-1");
  9.        response.setContentType("applicationnd.ms-excel");
  10.        response.setHeader("Content-disposition", "attachment; filename=" + dbfName + ".dbf");
  11.        fos = response.getOutputStream();
  12.        int fieldCount = strutName.length;   
  13.        DBFField[] fields = new DBFField[fieldCount]; 
  14.        for(int i=0;i<fieldCount;i++) 
  15.        {   
  16.           fields[i] = new DBFField(); 
  17.           fields[i].setName(strutName[i]); 
  18.           fields[i].setDataType(strutType[i]);  
  19.   //Date类型不能设置字段长度,这里没有处理其它没有字段长度的类型 
  20.   if(strutType[i] != DBFField.FIELD_TYPE_D){ 
  21.            fields[i].setFieldLength(strutLength[i]); 
  22.   }
  23.        }   
  24.   
  25.        DBFWriter writer = new DBFWriter(); 
  26.        writer.setFields(fields);   
  27.        for(int i=0;i<fieldCount;i++) 
  28.        {   
  29.        writer.addRecord(data[i]);
  30.        }
  31.        writer.write(fos);
  32.    }   
  33.    catch(Exception e)  
  34.    {   
  35.        e.printStackTrace();
  36.    }   
  37.    finally  
  38.    {   
  39.        try{  
  40.        fos.close();
  41.        }catch(Exception e){} 
  42.    }   
  43.   
  44. }  

 

可以看到定义JavaDBF表结构或者添加数据时是通过传递数组实现,也就是说只要我们有了这些用来构造表结果和表示结果集的数组就有了DBF文件,那么我们可以通过类似下面这样的函数把ResultSet信息转换成数组信息。

 

ResultSet得相关参数代码片断,下面的代码对类型判断和转换还不全面,如果还有其他字段请自行添加

try {
			ResultSetMetaData meta = rs.getMetaData();
			int columnCount = meta.getColumnCount();
			strutName = new String[columnCount];
			strutType = new byte[columnCount];
			rs.last();
			int itemCount = rs.getRow();
			rs.first();
			data = new Object[itemCount][columnCount];
			for (int i = 1; i <= columnCount; i++){
				int type = (byte) meta.getColumnType(i);
				//2是BigDecimal
				if(type == 2){
					strutType[i-1] = DBFField.FIELD_TYPE_N;
				}
				//12是String
				else if(type == 12){
					strutType[i-1] = DBFField.FIELD_TYPE_C;
				}
				//91是java.util.Date
				else if(type == 91){
					strutType[i-1] = DBFField.FIELD_TYPE_D;
				}
				strutName[i-1] = meta.getColumnName(i);
			}
			for (int i = 0; rs.next(); i++){
				for (int j = 0; j < columnCount; j++){
					Object da = rs.getObject(j+1);
					if(da instanceof BigDecimal){
						Double d = Double.parseDouble(da.toString());
						data[i][j] = d;
					}else{
						data[i][j] = da;
					}
				}
			}
		}catch (Exception e){
			e.printStackTrace();
		}finally{
			rs = null;
		}
 
上面采用的是传统方法进行导出dbf文件,如果大数据量导出时,就要先将文件生成到服务器端,然后从response里拿输入流,将刚生成的文件写到客户端,也就是多一个文件流写入的过程。

 

分享到:
评论
3 楼 fengjie112 2014-04-04  
有导出时间字段的代码吗   我试了好多都没用
2 楼 h781887804 2014-01-16  
zhoucong 写道
写大量数据的方法不对,表头写进去了,数据写不进去

第三段代码27行处有问题,for循环应该用data.length控制吧
1 楼 zhoucong 2013-12-07  
写大量数据的方法不对,表头写进去了,数据写不进去

相关推荐

    java快速导出几十万百万生成DBF文件数据后台内附有javadbf.jar

    5. **性能优化**: 考虑使用多线程处理大文件,将数据分割成多个部分并行写入或读取。同时,合理设置缓冲区大小可以显著提升I/O性能。 6. **错误处理和资源管理**: 在操作完成后,确保正确关闭DBFWriter和DBFReader...

    java快速导出几十万百万生成DBF文件数据后台

    本项目“java快速导出几十万百万生成DBF文件数据后台”主要关注如何使用Java编程语言高效地处理大规模数据,将其导出为DBF文件格式。 首先,我们需要了解Java处理大量数据的基本策略。在Java中,处理大数据的关键...

    DBF文件合并

    - **数据库工具**:如果DBF文件数量较大或结构复杂,可以先将每个文件导入到一个支持DBF格式的数据库(如SQLite、Access),然后使用SQL语句进行JOIN操作合并数据,最后导出为新的DBF文件。 - **专用软件**:市场...

    DBF编辑工具(大于255字段可编辑)

    标签“DBF导入导出”表明该工具支持DBF文件的导入和导出功能,这意味着用户可以从其他格式的文件(如CSV、Excel等)导入数据到DBF文件,也可以将DBF文件中的数据导出到其他格式,实现数据的迁移和交换。这在数据整合...

    Java下读写DBF数据库文件格式研究.pdf

    例如,全国普通高校招生网上录取系统中的院校子系统能够导出DBF格式的文件,显示出其在数据交换方面的持续应用价值。此外,DBF文件在Windows 7及更新的操作系统中的原生支持已逐渐消失,而较老版本的Excel软件曾经...

    javadbf.jar jdbf.jar将数据库数据直接转为dbf格式的文件

    标题和描述中提到的 `javadbf.jar` 和 `jdbf.jar` 是两个与数据库数据处理相关的Java库,主要用于将数据库中的数据转换为DBF(dBase文件)格式。DBF是一种流行于早期个人计算机时代的数据库文件格式,现在仍被一些...

    excel转成dbf,支持xlsx

    在IT行业中,数据处理是一项至关重要的任务,而Excel和DBF是两种常见的数据存储格式,分别代表了微软的电子表格程序和Dbase文件格式。在不同的应用场景中,可能需要将数据在这些格式之间进行转换。标题"excel转成dbf...

    数据导出控件,导出各种数据

    数据导出控件是软件开发中的一个重要工具,它允许用户将各种类型的数据高效地导出到不同的文件格式中。在标题“数据导出控件,导出各种数据”中,核心概念是“数据导出控件”,这通常是指一种软件组件,能够方便地将...

    excel转dbf工具

    Excel转DBF工具是一种实用程序,它允许用户将常见的电子表格格式Excel文件转换为DBF(dBase文件)格式。这种转换过程对于那些需要将数据导入到支持DBF格式的数据库系统,如FoxPro或早期版本的dBase,或者需要与不...

    读取DBF数据.rar

    了解如何处理这些问题,如使用正确的编码读取文件、检查文件头以验证文件格式等,是读取DBF数据过程中的重要环节。 9. **性能优化**:对于大量DBF数据,优化读取策略以减少内存消耗和提高处理速度是很关键的。这...

    CDBF dbf格式文件读取编辑软件

    5. **导入导出**:支持将dbf数据导入到其他格式(如CSV、TXT、XML),或从这些格式导出。 6. **搜索功能**:快速查找特定数据,提高工作效率。 7. **打印与预览**:可以将dbf表格打印出来,或者预览打印效果。 **...

    dcr.rar_DBF_dbf excel_dbf to

    2. **使用编程语言**:如果你熟悉编程,可以使用Python、Java、C#等语言,通过相关库(如Python的`pyodbc`或`pandas`)来读取`.dbf`文件,并将数据写入Excel。例如,在Python中,你可以这样做: ```python import ...

    R 数据导入和导出.pdf

    ### R 数据导入和导出知识点总结 ...总的来说,《R 数据导入和导出》这份文档为用户提供了一个全面的数据处理框架,涵盖了从基本的文本文件处理到复杂的关系数据库交互等多种场景,极大地简化了数据科学家的工作流程。

    dbf转换成sql

    1. **数据导出**:首先,你需要从DBF文件中导出数据。这可以通过使用专门的DBF处理工具,如Visual FoxPro或开源软件DBF Commander来实现。导出时,可以将数据保存为CSV(逗号分隔值)或XML格式,因为这两种格式都更...

    数据导入导出

    使用POI,开发者可以编写Java代码来创建、修改和操作Excel文件,从而实现数据的导入导出。此外,JXL和OpenCSV也是常见的Java Excel处理库,它们提供了类似的API功能。 总结一下,Excel的数据导入导出是一个涵盖广泛...

    使用Gdal将.shp文件转换为.json文件

    4. **检查输出**:转换完成后,你可以查看`example.json`文件,它现在包含了原始`.shp`文件中的所有几何和属性数据,但格式化为GeoJSON,一种轻量级且易于阅读和处理的JSON结构。 5. **集成到Echarts**:在Echarts...

    数据库geometry导出成矢量shape

    同样,属性数据也需要导出到.dbf文件,并保持与几何数据的关联。进度条在此过程中同样重要,尤其当处理大量数据时,用户能了解操作状态。 在实际应用中,这个过程可能涉及以下技术点: - **SQL查询**:熟悉SQL语言...

    Excel导入,导出

    - **数据量限制**:Excel对单个工作表的数据量有限制,超过限制可能导致错误或性能下降。 - **数据清洗**:导入前要清理数据,去除无效字符,处理缺失值,确保数据质量。 - **安全问题**:处理敏感数据时,注意...

    导入和导出.dmp数据库文件具体步骤[归纳].pdf

    Oracle 数据库提供了多种方式来实现数据的导入和导出,其中最常用的方式是使用.dmp 文件。 为了帮助读者更好地理解 Oracle 数据库的导入和导出功能,本文将详细介绍如何使用.dmp 文件来实现 Oracle 数据库的导入和...

    sqlite导出到XML android

    实际应用时,你需要根据项目需求调整代码,比如处理错误、优化性能或使用异步任务进行大数据量的转换。 总结来说,将Android应用中的SQLite数据库导出到XML,主要涉及以下几个步骤: 1. 使用SQLiteOpenHelper获取...

Global site tag (gtag.js) - Google Analytics