List<SmsjModel> smsjModelList = smsjMapper.querySmsjPage(params);
SmsjModel[] smsjModels = new SmsjModel[smsjModelList.size()];
smsjModels = smsjModelList.toArray(smsjModels);
OutputStream fos = null;
FilePathModel filePathModel = filePathService.getDefaultPath();
String path = filePathModel.getFullPath() + "smsj" + "\\" + "资金户余额"+ DateUtils.getDate("yyyyMMddHHmmss")+".dbf";
File file = new File(path);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
try {
DBFField[] fields = new DBFField[8];
fields[0] = new DBFField();
fields[0].setName("资金账号");
fields[0].setDataType(DBFField.FIELD_TYPE_C);
fields[0].setFieldLength(20);
fields[1] = new DBFField();
fields[1].setName("账户类型");
fields[1].setDataType(DBFField.FIELD_TYPE_C);
fields[1].setFieldLength(20);
fields[2] = new DBFField();
fields[2].setName("余额");
fields[2].setDataType(DBFField.FIELD_TYPE_N);
fields[2].setFieldLength(20);
fields[3] = new DBFField();
fields[3].setName("结息");
fields[3].setDataType(DBFField.FIELD_TYPE_N);
fields[3].setFieldLength(20);
fields[4] = new DBFField();
fields[4].setName("期权备付金");
fields[4].setDataType(DBFField.FIELD_TYPE_N);
fields[4].setFieldLength(20);
fields[5] = new DBFField();
fields[5].setName("期权保证金");
fields[5].setDataType(DBFField.FIELD_TYPE_N);
fields[5].setFieldLength(20);
fields[6] = new DBFField();
fields[6].setName("市场");
fields[6].setDataType(DBFField.FIELD_TYPE_C);
fields[6].setFieldLength(20);
fields[7] = new DBFField();
fields[7].setName("日期");
fields[7].setDataType(DBFField.FIELD_TYPE_D);
fields[7].setFieldLength(8);
Charset charset = Charset.forName("GBK");
DBFWriter writer = new DBFWriter(charset);
writer.setFields(fields);
for (SmsjModel t : smsjModels) {
Object[] rowData = new Object[8];
Class cls = t.getClass();
Field[] fieldss = cls.getDeclaredFields();
for(int i = 0;i < fieldss.length; i ++){
Field f = fieldss[i];
f.setAccessible(true);
try {
rowData[i] = f.get(t);
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
writer.addRecord(rowData);
}
fos = new FileOutputStream(path);
writer.write(fos);
String filename = path.substring(path.lastIndexOf("\\")+1);
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(filename,"UTF-8"));
InputStream in = null;
OutputStream out = null;
in = new FileInputStream(path);
int len = 0;
byte buffer[] = new byte[1024];
out = response.getOutputStream();
while((len = in.read(buffer)) != -1){
out.write(buffer,0,len);
}
if(in != null){
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
先奉上源代码
查询获取一个对象list 先写到服务器再通过response下载
需要引入的依赖
<dependency>
<groupId>com.github.albfernandez</groupId>
<artifactId>javadbf</artifactId>
<version>1.11.2</version>
</dependency>
-----
Charset charset = Charset.forName("GBK");
DBFWriter writer = new DBFWriter(charset);
通过看底层源码 这个必须要有 否则导出的时候dbf文件表头行会乱码
fields[0].setDataType(DBFField.FIELD_TYPE_C);这块也很关键,要与对应字段的类型相匹配