版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sy3345036/article/details/78012323
PS: 由于官网发布的包中对于导出dbf文件中的中文会出现乱码现象.所以本次使用的jar包是网友修复过的jar包,如需原版请到官网下载.需要的可以留言.
相关属性:
DBFField.FIELD_TYPE_D 表示Date型 DBFField.FIELD_TYPE_L 表示布尔型
DBFField.FIELD_TYPE_N 表示数字 DBFField.FIELD_TYPE_C 表示字符串
DBFField.FIELD_TYPE_F 表示浮点型 DBFField.FIELD_TYPE_M 不晓得,欢迎补充
具体操作:
- 定义DBF文件字段
DBFField[] fields = new DBFField[列的个数];
- 表头—数组
String[] strutName = new String[列的个数]
- 数据类型 – 数组
byte[] strutType = new byte[列的个数];
fields[i].setName(strutName[i]);
fields[i].setDataType(strutType[i]);
- 根据数据类型和数据本身指定数据长度(日期类型一般不指定长度)
fields[i].setFieldLength(15);
- 如果数据类型是浮点型 需要制定小数点位数 2 –> 0.00
fields[i].setDecimalCount(2);
ps: 如果数据类型是数值型不需要指定小数点位数, 会直接四舍五入
- 准备写入数据
Object[] rowData = new Object[列的个数];
如果要插入的数据是数字 但是为null 需要指定0 不可以使用空字符串和null
rowData[z] = Double.parseDouble("0");
- 输出文件
定义输出流,并关联的一个文件
这里需要注意的是,输出dbf是在已经存在的dbf文件中覆盖写入数据.所以在定义输出流的时候必须要指定一个存在dbf文件的路径并且指定名称.
File rootFile = new File(Play.applicationPath, "/public/download");
OutputStream fos = new FileOutputStream(rootFile.getPath()+文件名称.dbf);
- 定义 DBF输出对象
DBFWriter writer = new DBFWriter();
writer.setFields(fields);
writer.addRecord(rowData);
writer.write(fos);
以下是系统中的代码, 仅供参考
public boolean outputDBF(List<PropertyFilter> propertyFilterList) {
OutputStream fos = null;
try {
List<Object> query = departinvoicesManagerDao.queryDBFinfo(propertyFilterList);
String dbfName = new String("结算单管理.dbf");
/*
* DBFField.FIELD_TYPE_D 表示Date型 DBFField.FIELD_TYPE_L 表示布尔型
* DBFField.FIELD_TYPE_N 表示数字 DBFField.FIELD_TYPE_C 表示字符串
*/
/*
* JSRS(结算人数)、JSRQ(结算日期)、JSDH(结算代码,b+结算单7位)、GSDM(公司代码)
* DWDM(单位代码,车属单位中增加单位代码字段,选填)、DWMC(单位名称)、CH(车号)、JPSR(检票金额)
* JSSR(结算数额)、XLF(行李费)、TPF(退票费,暂定为固定值0)、CC(车次)、FJF(附加费,暂定为固定值0)
* GLQF(过路桥费,取票价公式组成项中的附加费)、RYFJF(燃油附加费,取票价公式组成项中的燃油附加费,没有值即为空)。
*/
StringBuffer sb = new StringBuffer();
String[] strutName = sb.append("JSRS,JSRQ,JSDH,GSDM,DWDM,DWMC,CH,JPSR,JSSR,XLF,TPF,CC,FJF,GLQF,RYFJF")
.toString().split(",");
byte[] strutType = new byte[15];
strutType[0] = DBFField.FIELD_TYPE_N;// JSRS(结算人数)
strutType[1] = DBFField.FIELD_TYPE_D;// JSRQ(结算日期)
strutType[2] = DBFField.FIELD_TYPE_C;// JSDH(结算代码,b+结算单7位)
strutType[3] = DBFField.FIELD_TYPE_C;// GSDM(公司代码)
strutType[4] = DBFField.FIELD_TYPE_C;// DWDM(单位代码,车属单位中增加单位代码字段,选填)
strutType[5] = DBFField.FIELD_TYPE_C;// DWMC(单位名称)
strutType[6] = DBFField.FIELD_TYPE_C;// CH(车号)
strutType[7] = DBFField.FIELD_TYPE_F;// JPSR(检票金额)
strutType[8] = DBFField.FIELD_TYPE_F;// JSSR(结算数额)
strutType[9] = DBFField.FIELD_TYPE_F;// XLF(行李费
strutType[10] = DBFField.FIELD_TYPE_F;// TPF(退票费,暂定为固定值0)
strutType[11] = DBFField.FIELD_TYPE_C;// CC(车次)
strutType[12] = DBFField.FIELD_TYPE_F;// FJF(附加费,暂定为固定值0)
strutType[13] = DBFField.FIELD_TYPE_F;// GLQF(过路桥费,取票价公式组成项中的附加费)
strutType[14] = DBFField.FIELD_TYPE_F;// RYFJF(燃油附加费,取票价公式组成项中的燃油附加费,没有值即为空)
// 定义DBF文件字段
DBFField[] fields = new DBFField[15];
for (int i = 0; i <= 14; i++) {
fields[i] = new DBFField();
fields[i].setName(strutName[i]);
fields[i].setDataType(strutType[i]);
// Date类型不能设置字段长度,这里没有处理其它没有字段长度的类型
if (strutType[i] == DBFField.FIELD_TYPE_C) {
fields[i].setFieldLength(20);
} else if (strutType[i] == DBFField.FIELD_TYPE_N) {
fields[i].setFieldLength(15);
} else if (strutType[i] == DBFField.FIELD_TYPE_F) {
fields[i].setFieldLength(15);
fields[i].setDecimalCount(2);
}
}
DBFWriter writer = new DBFWriter();
writer.setFields(fields);
// 一条条的写入记录
for (int j = 0; j < query.size(); j++) {
Object[] object = (Object[]) query.get(j);
Object[] rowData = new Object[15];
for (int z = 0; z < 15; z++) {
if (fields[z].getDataType() == DBFField.FIELD_TYPE_N || fields[z].getDataType() == DBFField.FIELD_TYPE_F) {
if (object[z] != null) {
rowData[z] = Double.parseDouble(object[z].toString());
} else {
rowData[z] = Double.parseDouble("0");
}
} else {
rowData[z] = object[z];
}
}
writer.addRecord(rowData);
}
// 定义输出流,并关联的一个文件
File rootFile = new File(Play.applicationPath, "/public/download");
fos = new FileOutputStream(rootFile.getPath() + "\\" + dbfName);
// 写入数据
writer.write(fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (Exception e) {
}
}
return true;
}