java导出DBF的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }    

猜你喜欢

转载自blog.csdn.net/sy3345036/article/details/78012323