导出情况有两种,一种只导出文件,一种在项目根目录下存储导出的临时excel文件,详细代码看下面,区别在于被注释的代码中
1.引入pom.xml文件
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
2.工具类
package cn.shangze.boot.common.utils;
import org.apache.poi.hssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class MyCommenUtil {
//**********************************************导出start
static final short borderpx = 1;
/**
* 导出excel表格
* @param head excel表个的表头
* @param body excel表的数据体
*/
public static HSSFWorkbook expExcel(List<String> head, List<List<String>> body) {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Sheet1");
HSSFRow row = sheet.createRow(0);
HSSFCell cell= null;
HSSFCellStyle cellStyle = workbook.createCellStyle();
setBorderStyle(cellStyle, borderpx);
cellStyle.setFont(setFontStyle(workbook, "黑体", (short) 14));
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
sheet.createFreezePane(0,1,0,1);
for (int i = 0; i<head.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(head.get(i));
cell.setCellStyle(cellStyle);
}
HSSFCellStyle cellStyle2 = workbook.createCellStyle();
setBorderStyle(cellStyle2, borderpx);
cellStyle2.setFont(setFontStyle(workbook, "宋体", (short) 12));
cellStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
for (int i = 0; i < body.size(); i++) {
row = sheet.createRow(i + 1);
List<String> paramList = body.get(i);
for (int p = 0; p < paramList.size(); p++) {
cell = row.createCell(p);
cell.setCellValue(paramList.get(p));
cell.setCellStyle(cellStyle2);
}
}
for (int i = 0, isize = head.size(); i < isize; i++) {
sheet.autoSizeColumn(i);
}
return workbook;
}
/**
* 文件输出
* @param workbook 填充好的workbook
* @param path 如果需要缓存生成的临时文件在项目中就是存放的位置,不需要的话就是导出文件的名称
*/
public static void outFile(HSSFWorkbook workbook,String path,HttpServletResponse response) {
SimpleDateFormat fdate=new SimpleDateFormat("yyyyMMddHHmmss");
//拼接最终需要导出的文件名称或存放的路径、名称
path = path.substring(0, path.lastIndexOf(".")) + fdate.format(new Date()) + path.substring(path.lastIndexOf("."));
System.out.println(path);
OutputStream os=null;
//File file = null; 如果需要在项目里面存储导出的excle表格的话,需要用这个方法
try {
//file = new File(path); 如果需要在项目里面存储导出的excle表格的话,需要用这个方法
//String filename = file.getName(); 如果需要在项目里面存储导出的excle表格的话,需要用这个方法
String filename = path; //不存储生成的临时excle文件,用该方法
//os = new FileOutputStream(file); 生成临时文件放到项目路径上,本项目不需要
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes(),"iso-8859-1"));
System.out.println(response.getHeader("Content-Disposition"));
os= new BufferedOutputStream(response.getOutputStream());
workbook.write(os);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
os.flush();//冲刷出流,将所有缓冲的数据强制发送到目的地。
os.close(); //冲刷并关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 设置字体样式
* @author LiuYang
* @param workbook 工作簿
* @param name 字体类型
* @param height 字体大小
* @return HSSFFont
*/
private static HSSFFont setFontStyle(HSSFWorkbook workbook, String name, short height) {
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints(height);
font.setFontName(name);
return font;
}
/**
* 设置单元格样式
* @author LiuYang
* @param cellStyle 工作簿
* @param border border样式
*/
private static void setBorderStyle(HSSFCellStyle cellStyle, short border) {
cellStyle.setBorderBottom(border); // 下边框
cellStyle.setBorderLeft(border);// 左边框
cellStyle.setBorderTop(border);// 上边框
cellStyle.setBorderRight(border);// 右边框
}
//**********************************************导出end
}
3.controller层的调用
@RequestMapping(value = "/excel2",method = RequestMethod.GET)
public void testExcel2(HttpServletResponse response, String accessToken){
//查询出需要导出的数据,根据自己项目的要求
List<aaa> list=aaaService.selectAaaList();
//创建报表数据头
List<String> head = new ArrayList<>();
head.add("条数");
head.add("总金额");
head.add("公司名");
head.add("排名");
head.add("总公司排名");
//创建报表体
List<List<String>> body = new ArrayList<>();
for (aaa a: list) {
List<String> bodyValue = new ArrayList<>();
bodyValue.add(String.valueOf(a.getCounts()));
bodyValue.add(String.valueOf(a.getPayPrice()));
bodyValue.add(a.getStaffId());
bodyValue.add(String.valueOf(a.getRank()));
bodyValue.add(String.valueOf(a.getZongRank()));
//将数据添加到报表体中
body.add(bodyValue);
}
String fileName = "排名.xls";
HSSFWorkbook excel = MyCommenUtil.expExcel(head,body);
MyCommenUtil.outFile(excel,fileName,response);//如果不需要在项目里面存储导出的excle表格的话,需要用这个方法
//MyCommenUtil.outFile(excel,"./"+fileName,response); 如果需要在项目里面存储导出的excle表格的话,需要用这个方法
}