导出情况有两种,一种只导出文件,一种在项目根目录下存储导出的临时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表格的话,需要用这个方法 }
