一、引入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對象
});
});
}