业务需求除excel文件下载还要需要实现dbf文件格式的下载,之前的excel是根据easyexcel无对象实现解析数据库视图,实现动态的读取视图字段和内容,现在这个dbf下载则就是在上次的基础上修改实现的,上次的案例在这边🏝️
xml        <!-- 读写dbf文件-->
        <dependency>
            <groupId>com.github.albfernandez</groupId>
            <artifactId>javadbf</artifactId>
            <version>1.11.2</version>
        </dependency>
java@Override
    public void downLoadExcel(HttpServletResponse response, ExcelRequest request) {
        ExportEntity entity=baseMapper.selectById(request.getExportId());
        if (ObjectUtil.isNull(entity)){
            throw new BusinessException(ResultCodeEnum.ERR_0x1000.getCode(),"没查询该excel");
        }
        //json转成list集合
        //列名的集合
        List<List<String>> headList = JSON.parseObject(entity.getExcelHeadList(),List.class);
        //每行数据的集合
        List<List<Object>> dataList =JSON.parseObject(entity.getExcelDataList(),List.class);
        if (request.getFileType()!=1){
            try{
                String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
                response.setCharacterEncoding("utf-8");
                if (request.getFileType()==2){
                    response.setContentType("text/csv");
                    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".csv");
                }else {
                    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
                }
                EasyExcel.write(response.getOutputStream()).head(headList).autoCloseStream(Boolean.FALSE).sheet("sheet").doWrite(dataList);
            } catch (IOException e) {
                throw new BusinessException(ResultCodeEnum.ERR_0x1000.getCode(),e.getMessage());
            }
        }else {
            try {
                response.setContentType("application/x-dbf");
                String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".dbf");
                //先需要设置一下表结构--列名
                DBFField[] dbfFields =new DBFField[headList.size()];
                for (int i=0; i<headList.size();i++) {
                    dbfFields[i]=new DBFField();
                    dbfFields[i].setName(headList.get(i).get(0));
                    // dbf表 字符类型 的字段长度最大不能超过254
                    dbfFields[i].setType(DBFDataType.CHARACTER);
                    dbfFields[i].setLength(headList.get(i).get(0).length());
                }
                Charset defaultCharset = forName("GBK");
                OutputStream fos=response.getOutputStream();
                DBFWriter writer = new DBFWriter(fos,defaultCharset);
                writer.setFields(dbfFields);
                //然后一条一条的往里面插数据
                for (int i = 0; i < dataList.size(); i++) {
                    Object[] rowData = new Object[dataList.get(0).size()];
                    for (int j = 0; j < dataList.get(0).size(); j++) {
                        rowData[j]=String.valueOf(dataList.get(i).get(j)).equals("null")?"":String.valueOf(dataList.get(i).get(j));
                    }
                    writer.addRecord(rowData);
                }
                // 写入数据
                writer.write(fos);
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
dbf需要为每个列设置格式,但是由于我这是视图,而且列名高达两百多就不进行分列设置格式了,全部默认为字符串格式
easyexcel可以直接改结尾格式,实现导出dbf但是那种的编码并不是dbf的,用dbf的框架读取并不能识别,所以导出成功后我们还需要进行测试
已下是测试方法,会在控制台输出dbf文件中的全部信息
java@Slf4j
public class dbf {
    public static void main(String[] args) {
        List<Map<String, String>>  readDbf=new LinkedList<>();
        try {
            readDbf=readDbf("D:\\dbf\\测试.dbf","GBK");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(Arrays.toString(readDbf.toArray()));
    }
    /**
     * 读dbf记录
     * @param path
     * @return
     * @throws IOException
     */
    public static List<Map<String, String>> readDbf(String path, String charsetName) throws IOException {
        List<Map<String, String>> rowList = new ArrayList<>();
        DBFReader dbfReader = new DBFReader(new FileInputStream(path), Charset.forName(charsetName));
        Object[] rowValues;
        while ((rowValues = dbfReader.nextRecord()) != null) {
            Map<String, String> rowMap = new HashMap<String, String>();
            for (int i = 0; i < rowValues.length; i++) {
                rowMap.put(dbfReader.getField(i).getName(), String.valueOf(rowValues[i]).trim());
            }
            rowList.add(rowMap);
        }
        dbfReader.close();
       return rowList;
    }
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!