Excel打开DBF文件并处理数据

1、Excel打开DBF文件

  1. 点击右上角文件。

    点击右上角文件

  2. 点击打开。

    点击打开

  3. 点击浏览。

    点击浏览

  4. 弹出对话框中选择所有文件

    弹出对话框中选择所有文件

  5. 找到想要打开的DBF文件(可以将所有文件类型更改为dBase文件,也可以不更改),点击打开进入导入向导。

    点击打开进入导入向导

  6. 选择原始数据类型为:分隔符,再选择文件原始格式为不出现乱码的格式:中文一般选择为中文简体,点击下一步进入向导第2步。

    文本导入向导第1步

  7. 选择合适的分隔符号:以预览数据为准,我这里选择空格分割,勾选连续空格以单个处理,点击下一步进入向导第3步。

    文本导入向导第2步

  8. 选择列数据格式:以实际情况选择,我这里选择列数据格式为常规,点击完成。

    文本导入向导第3步

  9. 可以看到数据导入进来了,但是是很长的一行,不好看,接下来处理数据就是Excel的相关操作了。

    点击完成,查看数据

2、Excel处理数据,将一列n行转换为n行8列(根据自己实际情况进行Excel操作,这里不再科普Excel知识)

  1. 复制所有数据。

    复制所有数据

  2. 选择一个空白单元格,粘贴选择为转置。

    粘贴选择为转置

  3. 将一列n行转换为n行8列,选择空白单元格输入:=INDEX($A1:$A569,(ROW()-1)*7+COLUMN()-5),回车。(ROW()、COLUMN() 和 INDEX()等函数作用自行百度)

    将一列n行转换为n行8列

  4. 右下角出现十字光标后,往右拉8列。

    右拉8列

  5. 再往下拉直到出现0为止。

    往下拉

3、将DBF文件转为Excel的最新方法(通过代码解决,java实现)

  1. 导入依赖

    <!-- 引入lombok依赖 -->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>
    <!-- 引入hutool依赖-->
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.5</version>
    </dependency>
    <!-- 引入Hutool-poi依赖,Hutool-poi是针对Apache POI的封装,Java针对MS Office的操作的库 -->
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
    </dependency>
    <!-- 引入javadbf依赖 -->
    <dependency>
    <groupId>com.github.albfernandez</groupId>
    <artifactId>javadbf</artifactId>
    <version>1.9.2</version>
    </dependency>
  2. 新建DBFInfo.java

    import lombok.Data;

    import java.util.List;
    import java.util.Map;

    @Data
    public class DBFInfo {
    // 字段数量
    private Integer fieldCount;
    // 字段名
    private String[] fieldName;
    // 记录
    List<Map<String, String>> rowList;
    //记录数量
    Integer recordCount;
    }
  3. 新建JavaDBFUtils.java

    import cn.hutool.poi.excel.ExcelUtil;
    import cn.hutool.poi.excel.ExcelWriter;
    import com.linuxense.javadbf.DBFReader;
    import org.apache.commons.collections.CollectionUtils;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    /**
    * 将dbf格式文件转换为Excel文件
    */
    public class JavaDBFUtils {

    public static void main(String[] args) {
    String filePath = "C:\\Users\\Administrator\\Desktop\\";
    DBFInfo dbfInfo = null;
    try {
    dbfInfo = readDBFFile(filePath+"T_JFMD_040104_20220906100214.DBF", "GBK");
    System.out.println(dbfInfo);
    } catch (IOException e) {
    e.printStackTrace();
    }

    //创建实例,输出路劲
    ExcelWriter writer = ExcelUtil.getWriter(filePath + "/用户信息.xlsx");
    writer.write(dbfInfo.getRowList(),true);
    // 关闭writer,释放内存
    writer.close();
    }

    public static DBFInfo readDBFFile(String filePath, String charsetName) throws IOException {
    DBFInfo dbfInfo = new DBFInfo();
    FileInputStream inputStream = null;
    DBFReader dbfReader = null;
    Object[] rowVales = null;
    List<Map<String, String>> rowList = new ArrayList<>();
    File file = new File(filePath);
    if (!file.exists()) {
    System.out.println("文件路径:"+filePath+",该文件不存在!");
    return dbfInfo;
    }
    try {
    System.out.println("开始读取DBF文件,文件路径为: "+ filePath);
    inputStream = new FileInputStream(filePath);
    dbfReader = new DBFReader(inputStream, Charset.forName(charsetName), false);

    // 字段数量
    int fieldCount = dbfReader.getFieldCount();
    System.out.println("读取DBF文件,字段数量为:"+ fieldCount+"个!");

    // 记录数量
    int recordCount = dbfReader.getRecordCount();
    System.out.println("读取DBF文件,数据量为:"+ recordCount+"个!");


    String[] fieldName = new String[fieldCount];
    for (int i = 0; i < fieldCount; i++) {
    fieldName[i] = dbfReader.getField(i).getName();
    }
    dbfInfo.setFieldCount(fieldCount);
    dbfInfo.setFieldName(fieldName);
    dbfInfo.setRecordCount(recordCount);

    while ((rowVales = dbfReader.nextRecord()) != null) {
    Map<String, String> rowMap = new HashMap<String, String>();
    for (int i = 0; i < rowVales.length; i++) {
    rowMap.put(dbfReader.getField(i).getName(), String.valueOf(rowVales[i]).trim());
    }
    rowList.add(rowMap);
    }
    if (CollectionUtils.isNotEmpty(rowList)) {
    dbfInfo.setRowList(rowList);
    }
    return dbfInfo;
    } catch (IOException e) {
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (null != inputStream) {
    inputStream.close();
    }
    if (null != dbfReader) {
    dbfReader.close();
    }
    }
    return dbfInfo;
    }
    }
  4. 运行main函数,可以看到桌面生成了:用户信息.xlsx文件。


如有错误,欢迎评论区留言!