报表制作完成后,不仅能够实现展现及打印的功能,还能够根据用户的不同需求,以不同的形式导出。润乾为用户提供的导出方式有Excel,Word,PDF,Text,Xml,方便了用户的使用。可是在实际需求中用到的文件不仅仅限于这五种格式,如果需要到处其他格式的怎么办呢?润乾也提供了丰富的api来实现一些特殊的需求,比如导出dbf文件。
考虑到dbf文件是一种数据库文件,每一行都有相同的字段数,所以只要求能将行列矩阵式的报表(不存在合并行合并列)导出。在有些情况下DBF文件会更合适的。
JavaDBF是Java的阅读和写入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中的DBFField和DBFWriter类来进行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);
//根据不同列的判断将string和double类型分别写入不同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