导入DBF文件方法

报表制作完成后,不仅能够实现展现及打印的功能,还能够根据用户的不同需求,以不同的形式导出。润乾为用户提供的导出方式有ExcelWordPDFTextXml,方便了用户的使用。可是在实际需求中用到的文件不仅仅限于这五种格式,如果需要到处其他格式的怎么办呢?润乾也提供了丰富的api来实现一些特殊的需求,比如导出dbf文件。

考虑到dbf文件是一种数据库文件,每一行都有相同的字段数,所以只要求能将行列矩阵式的报表(不存在合并行合并列)导出。在有些情况下DBF文件会更合适的。

JavaDBFJava的阅读和写入dbf文件的开源的接口。下面将介绍下如何将JavaDBF与润乾的API结合来实现此问题。

 

首先准备一张行列矩阵式的报表如下图。

浏览数据:

 

接下来需要调用润乾的API将包括表头在内的单元格的数据读取出来,再通过javaDBF的写入接口写入到.dbf文件中:

       Context cxt = new Context(); // 构建报表引擎计算环境

       // …………………….. //其它辅助代码,例如往报表引擎传递参数和宏,传递数据库连接参数等,见后面的介绍

       ReportDefine rd = null;

       try {

           rd = (ReportDefine) ReportUtils.read(“e:/dbf.raq”);

       catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       Engine engine = new Engine(rd, cxt); // 构造报表引擎

       IReport iReport = engine.calc(); // 运算报表

 

此时通过润乾api计算出来的iReport对象已经是一个包含了计算后的所有单元格数据的对象.下面调用com.linuxense.javadbf中的DBFFieldDBFWriter类来进行dbf文件的设定以及写入:

DBFField fields[] = new DBFField[3];//首先定义一个3列的域

       //逐列设定其属性

       fields[0] = new DBFField();

       fields[0].setFieldName(iReport.getCell(1, (short) 1).getValue()

              .toString());//调用润乾的api读取表头位置的数据将其设置成列名

       fields[0].setDataType(DBFField.FIELD_TYPE_C);//设置其类型

       fields[0].setFieldLength(10);//设置其长度

 

       fields[1] = new DBFField();

       fields[1].setFieldName(iReport.getCell(1, (short) 2).getValue()

              .toString());

       fields[1].setDataType(DBFField.FIELD_TYPE_C);

       fields[1].setFieldLength(20);

 

       fields[2] = new DBFField();

       fields[2].setFieldName(iReport.getCell(1, (short) 3).getValue()

              .toString());

       fields[2].setDataType(DBFField.FIELD_TYPE_N);

       fields[2].setFieldLength(12);

fields[2].setDecimalCount(2);

设定完dbf文件的表头类型后,开始将iReport对象中的数据根据定义好的规则写入:

        DBFWriter writer = new DBFWriter();

       writer.setFields(fields);

       //便利已算好的iReport对象(由于第一行表头之前已经插入过,故从第二行开始)

       for (int i = 2; i <= iReport.getRowCount(); i++) {

           Object rowData[] = new Object[3];

           for (int j = 1; j <= iReport.getColCount(); j++) {

              //获取每个单元格的值

INormalCell iCell = iReport.getCell(i, (short) j);

              //根据不同列的判断将stringdouble类型分别写入不同dbf列中

              rowData[j - 1] = j != 3 ? iCell.getValue() : Double

                     .parseDouble(iCell.getValue().toString());

           }

           writer.addRecord(rowData);

 

       }

最后将其写入dbf文件中:

       FileOutputStream fos = new FileOutputStream(“e://dbfTest.dbf”);

       writer.write(fos);

       fos.close();

 

使用数据库导入该dbf文件测试,成功导入到数据库中:

 

附件中提供了简单例子以及javaDBF的jar

你可能感兴趣的:(导入DBF文件方法)