前后端分离,vue+springboot导出dbf

一、引入pom

<dependency>
   <groupId>com.github.albfernandez</groupId>
   <artifactId>javadbf</artifactId>
   <version>1.9.4</version>
</dependency>

二、导出DBF的工具类

import com.linuxense.javadbf.DBFDataType;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 导出dbf文件工具类
 *
 * @author yangfeng
 */
public class ExportDbfUtil {

    /**
     * @param fileName 文件名
     * @return
     * @throws IOException
     */
    private static ServletOutputStream generateResponseDBF(String fileName, HttpServletResponse response) throws IOException {
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".dbf");
        return response.getOutputStream();
    }

    /**
     * 写入数据到dbf文件
     * 反射获取类型的字段名称、类型,生成dbf fields
     *
     * @param beans    数据集
     * @param clazz    数据集所属类型
     * @param dbfName  dbf文件名
     * @param response
     */
    public static void writeDbf(List beans, Class clazz, String dbfName, HttpServletResponse response) {
        DBFWriter writer = null;
        try {
            writer = new DBFWriter(generateResponseDBF(dbfName, response));
            writer.setCharactersetName("GBK");//防止导出中文乱码
            DBFField[] dbfFields = writeFields(clazz);
            writer.setFields(dbfFields);
            for (int i = 0; i < beans.size(); i++) {
                writer.addRecord(writeLine(beans.get(i), dbfFields));
            }
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
            } catch (Exception e) {
                writer.close();
            }
        }
    }

    /**
     * 设置写入dbf文件字段名称、类型、长度
     *
     * @param clazz
     * @return
     */
    private static DBFField[] writeFields(Class clazz) {
        Field[] clazzDeclaredFields = clazz.getDeclaredFields();
        DBFField[] fields = new DBFField[clazzDeclaredFields.length];
        for (int i = 0; i < clazzDeclaredFields.length; i++) {
            clazzDeclaredFields[i].setAccessible(true);
            fields[i] = new DBFField();
            fields[i].setName(clazzDeclaredFields[i].getName());
            if (clazzDeclaredFields[i].getType() == Integer.class) {
                fields[i].setType(DBFDataType.NUMERIC);
            } else if (clazzDeclaredFields[i].getType() == Double.class) {
                fields[i].setType(DBFDataType.DOUBLE);
            } else if (clazzDeclaredFields[i].getType() == Date.class) {
                fields[i].setType(DBFDataType.DATE);
            } else {
                fields[i].setType(DBFDataType.CHARACTER);
            }
            fields[i].setLength(20);//长度要设置,不然生成的dbf文件打不开,格式错误
        }
        return fields;
    }

    /**
     * 返回每行匹配的数据
     *
     * @param bean      一条数据
     * @param dbfFields dbf字段信息数组,这里主要是获取封装的字段名称
     *                  根据名称取值
     * @return
     */
    private static Object[] writeLine(Object bean, DBFField[] dbfFields) {
        Map<String, Object> map = MapBeanUtil.beanToMap(bean);
        Object[] row = new Object[bean.getClass().getDeclaredFields().length];
        for (int i = 0; i < dbfFields.length; i++) {
            row[i] = map.get(dbfFields[i].getName());
        }
        return row;
    }

}

三、service API

    /**
     * 导出数据dbf
     *
     * @param request
     * @return
     */
    @Override
    public void exportDataToDBF(DataRequest request, HttpServletResponse response) {
        List<Data> testList= testCustomizedMapper.getData(request);
        if (!CollectionUtils.isEmpty(testList)) {
            ExportDbfUtil.writeDbf(testList, Data.class, "测试", response);
        }
    }

四、vue 请求接口

services:

//导出dbf
function exportDbf(data) {
  return xAxios({
    url: '/datastatistics/flightLdp/exportFlightLdpToDBF',
    method: 'POST',
    data: data,
    responseType: 'blob'
  });
}

store  actions:

//导出
    exportDbf({ commit }, payload) {
      return new Promise((resolve, reject) => {
        exportDbf(payload)
          .then(res => {
            var disposition = res.headers['content-disposition'];
            var fileName = decodeURI(disposition.substring(disposition.indexOf('filename=') + 9, disposition.length));
            const link = document.createElement('a');
            let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
            link.style.display = 'none';
            var href =URL.createObjectURL(blob);
            link.href =href;
            link.setAttribute('download',  fileName);
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
            window.URL.revokeObjectURL(href); //释放掉blob对象
          });
      });
    }
发布了70 篇原创文章 · 获赞 63 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/xiaoxiangzi520/article/details/97139276