一、创建文件导出的工具类
package io.renren.modules.generator.WeiXinUtil;
import org.apache.poi.hssf.usermodel.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
public class exportExcelUtils {
public static byte[] export(String sheetTitle, String[] title, List<Object> list) {
HSSFWorkbook wb = new HSSFWorkbook();//创建excel表
HSSFSheet sheet = wb.createSheet(sheetTitle);
sheet.setDefaultColumnWidth(20);//设置默认行宽
//表头样式(加粗,水平居中,垂直居中)
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
//设置边框样式
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
HSSFFont fontStyle = wb.createFont();
fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
cellStyle.setFont(fontStyle);
//标题样式(加粗,垂直居中)
HSSFCellStyle cellStyle2 = wb.createCellStyle();
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
cellStyle2.setFont(fontStyle);
//设置边框样式
cellStyle2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
//字段样式(垂直居中)
HSSFCellStyle cellStyle3 = wb.createCellStyle();
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
//设置边框样式
cellStyle3.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle3.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle3.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle3.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
//创建表头
HSSFRow row = sheet.createRow(0);
row.setHeightInPoints(20);//行高
HSSFCell cell = row.createCell(0);
cell.setCellValue(sheetTitle);
cell.setCellStyle(cellStyle);*/
//创建标题
HSSFRow rowTitle = sheet.createRow(0);
rowTitle.setHeightInPoints(20);
HSSFCell hc;
for (int i = 0; i < title.length; i++) {
hc = rowTitle.createCell(i);
hc.setCellValue(title[i]);
hc.setCellStyle(cellStyle2);
}
byte result[] = null;
ByteArrayOutputStream out = null;
try {
//创建表格数据
Field[] fields;
int i =1;
for (Object obj : list) {
fields = obj.getClass().getDeclaredFields();
HSSFRow rowBody = sheet.createRow(i);
rowBody.setHeightInPoints(20);
int j = 0;
// 显示的列是你所要封装的实体类的每个对象,而且顺序是你创建对象的顺序
for (Field f : fields) {
f.setAccessible(true);
hc = rowBody.createCell(j);
if (f.get(obj) != null ) {
hc.setCellValue(f.get(obj).toString());
}else{
hc.setCellValue("");
}
hc.setCellStyle(cellStyle3);
j++;
}
i++;
}
out = new ByteArrayOutputStream();
wb.write(out);
result = out.toByteArray();
} catch (Exception ex) {
throw new RuntimeException("报表导出异常"+ex.getMessage());
} finally{
try {
if(null != out){
out.close();
}
} catch (IOException ex) {
throw new RuntimeException("报表导出异常"+ex.getMessage());
}
}
return result;
}
}
二、业务逻辑层调用
@Override
public void checkOutDoorLogExcel(Map<String, Object> params, HttpServletResponse response){
String filePath=null;
List<DoorLogEntity> loglist = doorLogDao.selectAll(params);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String data=sdf.format(new Date());
//当前用户桌面
File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory();
// 获取本地桌面路径
String desktopPath = desktopDir.getAbsolutePath();
filePath = desktopPath.replaceAll("\\\\", "\\\\\\\\");
String sheetTitle = "进出店日志报表"+data;;
String[] title = {"店铺", "用户昵称", "电话", "进店时间", "离店时间", "在店总时长", "开门信息", "开门结果"};
filePath = filePath + "\\\\" + sheetTitle + ".xls";
List<Object> list = new ArrayList<Object>();
for (int i = 0; i < loglist.size(); i++) {
DoorLogEntity u = new DoorLogEntity();
u.setShopname(loglist.get(i).getShopname());
u.setNickname(loglist.get(i).getNickname());
u.setPhone(loglist.get(i).getPhone());
u.setOpendata(loglist.get(i).getOpendata());
u.setCheckoutdata(loglist.get(i).getCheckoutdata());
u.setTotaltime(loglist.get(i).getTotaltime());
u.setMsg(loglist.get(i).getMsg());
u.setOpenresult(loglist.get(i).getOpenresult());
list.add(u);
}
byte[] b = exportExcelUtils.export(sheetTitle, title, list);
try {
File f = new File(filePath);
if (f.exists()) {
f.delete();
f.createNewFile();
// 使用commons-io-2.0.1.jar下的方法实现文件上传
FileUtils.writeByteArrayToFile(f, b, true);
} else {
f.createNewFile();
FileUtils.writeByteArrayToFile(f, b, true);
}
/* 此处以上代码是将数据导出到服务器端
*此处以下代码是实现下载到客户端
*/
String name= sheetTitle+".xls";
response.setCharacterEncoding("UTF-8");
//设置输出文件类型为excel文件
response.setContentType("application/vnd.ms-excel");
//通知浏览器下载文件而不是打开
response.setHeader("Content-Disposition", "attachment;fileName="+java.net.URLEncoder.encode(name, "UTF-8"));
response.setHeader("Pragma", java.net.URLEncoder.encode(name, "UTF-8"));
long size = f.length();
byte[] buffer = new byte[(int)size];
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null; //输出流
try {
os = response.getOutputStream();
fis = new FileInputStream(f);
bis=new BufferedInputStream(fis);
int len = 0;
while((len = bis.read(buffer)) >-1){
os.write(buffer, 0, len);//并不是每次都能读到1024个字节,所有用len作为每次读取数据的长度,否则会出现文件损坏的错误
}
os.flush();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("模板文件读取失败"+e.getMessage());
}finally {
bis.close();
fis.close();
os.close();
}
f.delete();
} catch (IOException ex) {
throw new RuntimeException("报表导出异常" + ex.getMessage());
}
}
3、controller类
/**
* 导出进出点日志报表
*/
@RequestMapping("/checkoutlog")
public void checkoutlog(@RequestParam Map<String,Object> params, HttpServletResponse response){
doorLogService.checkOutDoorLogExcel(params,response);
}
4 所需要导入的工具包
https://download.csdn.net/download/qq_33238562/11266306
5、在pom.xml中增加依赖
扫描二维码关注公众号,回复:
9857367 查看本文章
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
6、vue 下载文件到客户端
<el-form-item>
<el-button @click="exportexcel()" type="primary">导出文件</el-button>
</el-form-item>
// 导出
exportexcel() {
this.$http({
url: this.$http.adornUrl("/generator/doorlog/checkoutlog"),
method: "get",
// 如果用blob对象来接收,此处一定要设置responseType:'blob',不然会报文件已损坏
responseType:'blob',
params: this.$http.adornParams({
shopname: this.dataForm.shopname,
nickname: this.dataForm.nickname,
phone: this.dataForm.phone,
userid: this.$store.state.user.id //获取当前登录用户的id ,用户名:this.$store.state.user.name
})
})
.then(function(res) {
// 将后台返回的数据二进制流转化为base64
let blob = new Blob([res.data], {type: "application/vnd.ms-excel"});
let objectUrl = URL.createObjectURL(blob);
//window.location.href = objectUrl;
var alink = document.createElement("a");
alink.href = objectUrl;
alink.download = '进出店日志'; //日志名
alink.click();
})
}
}