maven项目中利用poi导出Excel
2017-05-21 10:25
435 查看
项目中需要实现点击jsp页面中的按钮来导出Excel,在网上搜了不少方法,最终解决了,在这里记录下来,方便以后使用。
我们的项目为maven项目,所以只需要在pom.xml中加如下配置,就可以实现自动导包了。如果是普通项目的话首先需要下载poi包下来。
pom.xml:
jsp页面的相应代码如下:
后台响应处理方法如下:
到这里所有的工作就做完了,根据需要自己改变传入excelUtil方法中的参数,我需要做的是创建两个sheet,分别用于展示汇总信息以及详细信息。所以我传入了两个list,分别用于传入汇总信息、详细信息需要的数据。代码很详细。只是把需要自己填充数据的部分代码没有展示。
我们的项目为maven项目,所以只需要在pom.xml中加如下配置,就可以实现自动导包了。如果是普通项目的话首先需要下载poi包下来。
pom.xml:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10.1</version> </dependency>
jsp页面的相应代码如下:
<button style="right: 1000px" class="btn btn-info btn-sm " onclick="export_excel()"> 导出为excel </button> <script> function export_excel() { var url = "<%=ctxpath%>/excel/export_excel.do?taskid="+${task.taskid}; window.open(url); } </script>
后台响应处理方法如下:
import org.springframework.web.bind.annotation.RequestMapping; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created by LENOVO on 2017/5/17. */ @Controller @RequestMapping("/excel") public class ExportExcelController { @RequestMapping("/export_excel") public String download(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取任务ID String taskid = request.getParameter("taskid"); TaskBean task = null; String fileName="test"; List<String[]> colsList = new ArrayList<>(); List<String[]> keysList = new ArrayList<>(); String[] summaryCol = {"漏洞名","个数","等级"}; String[] summaryKeys = {"loophole_name","total","rank"}; colsList.add(summaryCol); keysList.add(summaryKeys); String[] columnNames = new String[10]; String[] keys = new String[10]; //填充projects数据 List<Map<String,Object>> list=null; List<Map<String,Object>> summaylist=null; //主机 if(task!=null&& Contains.HOST_SCAN.equals(task.getTasktype())){ columnNames = new String[]{"序号","地址","描述"};//列名 keys = new String[]{"no","ip","loophole_description"};//map中的key colsList.add(columnNames); keysList.add(keys); List<HostVulnerablityBean> projects = vulnerabilityService.getHostVulDetail(Integer.valueOf(taskid)); list = createExcelRecordHost(projects); List<HostVulnerablityBean> summary = vulnerabilityService.getHostVulList(Integer.valueOf(taskid)); summaylist = createSummaryExcelRecordHost(summary); } ByteArrayOutputStream os = new ByteArrayOutputStream(); try { //创建excel //ExcelUtil.createWorkBook(list,keys,columnNames).write(os); ExcelUtil.createWorkBook(summaylist,list,keysList,colsList).write(os); } catch (IOException e) { e.printStackTrace(); } byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); // 设置response参数,可以打开下载页面 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1")); ServletOutputStream out = response.getOutputStream(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(is); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (final IOException e) { throw e; } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } return null; } /* 这个方法是获取excel表格的第二个sheet的信息 */ private List<Map<String, Object>> createExcelRecordHost(List<HostVulnerablityBean> projects) { List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("sheetName", "主机漏洞扫描报告"); listmap.add(map); //根据需要自己填充数据即可,此处mapvalue中的key为上边设置的String[] keys mapValue.put("ip",""); mapValue.put("loophole_description",""); mapValue.put("risk_description",""); mapValue.put("loophole_rank",""); listmap.add(mapValue); } } return listmap; } /* 以下方法为获取Excel的第一个sheet, */ private List<Map<String, Object>> createSummaryExcelRecordHost(List<HostVulnerablityBean> projects) { List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("summarySheet", "汇总"); listmap.add(map); 根据需要自己填充数据即可,此处mapvalue中的key为上边设置的String[] summaryKeys mapValue.put("loophole_name",vul.getVulnerability_name()); mapValue.put("total",vul.getTotal()); mapValue.put("rank",vul.getVulenrability_severity()); listmap.add(mapValue); } } return listmap; } } ExcelUtil如下所示: package com.cncert.satp.util; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import java.util.List; import java.util.Map; /** * Created by LENOVO on 2017/5/17. * 用于生成excel */ public class ExcelUtil { public static HSSFWorkbook createWorkBook(List<Map<String, Object>> summarylist,List<Map<String, Object>> list, List<String[]> keysList, List<String[]> colsList) { //TODO:keysList colsList的第0个为汇总信息 第1个为漏洞详细信息 // 创建excel工作簿 HSSFWorkbook wb = new HSSFWorkbook(); // 创建sheet(页),用于展示汇总情况 HSSFSheet summarySheet = wb.createSheet(summarylist.get(0).get("summarySheet").toString()); // 创建sheet(页),用于展示漏洞信息 HSSFSheet sheet = wb.createSheet(list.get(0).get("sheetName").toString()); //分别为汇总表信息和漏洞详细信息 String[] keys = keysList.get(1); String[] columnNames = colsList.get(1); // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。 for (int i = 0; i < keys.length; i++) { sheet.setColumnWidth((short) i, (short) (50 * 200)); } String[] summaryKey = keysList.get(0); String[] summaryCol = colsList.get(0); for (int i = 0; i < summaryKey.length; i++) { summarySheet.setColumnWidth((short) i, (short) (50 * 200)); } // 创建两种单元格格式 HSSFCellStyle cs = wb.createCellStyle(); HSSFCellStyle cs2 = wb.createCellStyle(); // 创建两种字体 HSSFFont f = wb.createFont(); HSSFFont f2 = wb.createFont(); // 创建第一种字体样式(用于列名) f.setFontHeightInPoints((short) 10); f.setColor(HSSFColor.BLUE_GREY.index); f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 创建第二种字体样式(用于值) f2.setFontHeightInPoints((short) 10); f2.setColor(HSSFColor.BLACK.index); // 设置第一种单元格的样式(用于列名) cs.setFont(f); cs.setBorderLeft(HSSFCellStyle.BORDER_THIN); cs.setBorderRight(HSSFCellStyle.BORDER_THIN); cs.setBorderTop(HSSFCellStyle.BORDER_THIN); cs.setBorderBottom(HSSFCellStyle.BORDER_THIN); cs.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置第二种单元格的样式(用于值) cs2.setFont(f2); cs2.setBorderLeft(HSSFCellStyle.BORDER_THIN); cs2.setBorderRight(HSSFCellStyle.BORDER_THIN); cs2.setBorderTop(HSSFCellStyle.BORDER_THIN); cs2.setBorderBottom(HSSFCellStyle.BORDER_THIN); cs2.setAlignment(HSSFCellStyle.ALIGN_CENTER); //TODO:summarySheet用于显示汇总信息,漏洞名 个数 等级 if (list != null) { //创建标题行 HSSFRow titleRow = summarySheet.createRow(0); for (int i = 0; i < summaryCol.length; i++) { HSSFCell cell = titleRow.createCell((short) i);//创建数据列 cell.setCellValue(columnNames[i]);//给单元格赋值 cell.setCellStyle(cs); } //设置每行每列的值 for (short i = 1; i < summarylist.size(); i++) { // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的 // 创建一行,在页sheet上 HSSFRow dataRow = summarySheet.createRow(i);//创建数据行 // 在row行上创建一个方格 for (short j = 0; j < summaryKey.length; j++) { HSSFCell cell = dataRow.createCell(j); cell.setCellValue(summarylist.get(i).get(keys[j]) == null ? " " : summarylist.get(i).get(summaryKey[j]).toString()); cell.setCellStyle(cs2); } } } //以下代码为创建第二个sheet的信息 if (list != null) { //创建标题行 HSSFRow titleRow = sheet.createRow(0); for (int i = 0; i < columnNames.length; i++) { HSSFCell cell = titleRow.createCell((short) i);//创建数据列 cell.setCellValue(columnNames[i]);//给单元格赋值 cell.setCellStyle(cs); } //设置每行每列的值 for (short i = 1; i < list.size(); i++) { // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的 // 创建一行,在页sheet上 HSSFRow dataRow = sheet.createRow(i);//创建数据行 // 在row行上创建一个方格 for (short j = 0; j < keys.length; j++) { HSSFCell cell = dataRow.createCell(j); cell.setCellValue(list.get(i).get(keys[j]) == null ? " " : list.get(i).get(keys[j]).toString()); cell.setCellStyle(cs2); } } } return wb; } }
到这里所有的工作就做完了,根据需要自己改变传入excelUtil方法中的参数,我需要做的是创建两个sheet,分别用于展示汇总信息以及详细信息。所以我传入了两个list,分别用于传入汇总信息、详细信息需要的数据。代码很详细。只是把需要自己填充数据的部分代码没有展示。
相关文章推荐
- Spring+struts2+hibernate框架的Java Web项目利用POI导出Excel简单例子
- Java web项目利用POI导出excel
- java 项目利用POI导出excel总结
- Java web项目利用POI导出excel
- POI导出excel项目(webwork)实例
- java利用poi技术解析、导出excel
- Excel导出学习之道:Java Web利用POI导出Excel简单例子
- 利用poi实现页面上excel的导入和导出(不刷新页面)之导出
- 利用poi实现页面上excel的导入和导出(不刷新页面)之导入
- 项目所用技术回顾之excel导出(基于poi)
- (利用poi插件) 报表导出Excel
- 利用POI导出excel
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- 利用poi导出excel的工具类
- 利用POI组件 导入导出excel
- 在springmvc项目中使用poi导入导出excel
- java web利用poi组件导出excel让用户自定义导出地址
- Java Web利用POI导出Excel简单例子
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- 利用poi导出excel的工具类