您的位置:首页 > Web前端 > JavaScript

maven项目中利用poi导出Excel

2017-05-21 10:25 435 查看
项目中需要实现点击jsp页面中的按钮来导出Excel,在网上搜了不少方法,最终解决了,在这里记录下来,方便以后使用。

我们的项目为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,分别用于传入汇总信息、详细信息需要的数据。代码很详细。只是把需要自己填充数据的部分代码没有展示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven poi excel jsp