您的位置:首页 > 编程语言 > Java开发

javaweb项目基于poi的excel导出功能实现

2017-08-31 17:09 726 查看

javaweb项目基于poi的excel导出功能实现

1.js页面请求

<script type="text/javascript">
$("a[name='exportBtn']").click(function(){
$.confirm({
title : '提示:',
content : '确定导出信息到EXCEL?',
buttons : {
'确定' : function() {
location.href='admin/exportExcelAction/exportExcel.do;
},
'取消' : function() {
$.alert({title:"提示:",content:"取消操作!"});
}
}
});
});
</script>


注意:

1.ajax获取不到返回的文件,ajax只能接受文本内容

2.如果想使用ajax请求,请尝试返回excel的文件名,然后ajax回调成功后js执行

2.action层

@ResponseBody
@RequestMapping("exportExcel")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
//对每一个页面展示数据进行日志记录
ServletContext application = request.getSession().getServletContext();
Object dicMap = application.getAttribute("dictionaryMap");
JSONObject dictionaryMap = JSONObject.fromObject(dicMap);

String fileName = df.format(dt) + "信息";
String columnNames[];
String keys[];

// 列名
columnNames = new String[] { "AA", "BB", "CC", "DD" };
// map中的key
keys = new String[] { "A", "B", "C", "D" };

List<Contract> datalist = new ArrayList<data>();

Expression expr = Expr.isNotNull("id");

dataList = dataService.getObjListByExpression(expr);

List<Map<String, Object>> list = createExcelRecord(dataList , dictionaryMap);

ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
exportToExcelService.createWorkBookNew(list, keys, columnNames).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 + ".xlsx").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();
}
}


createExcelRecord方法的代码

private List<Map<String, Object>> createExcelRecord(List<Contract> contractList, JSONObject dictionaryMap) {
JSONArray type = dictionaryMap.getJSONArray("use_type");

List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
String sheetName = df.format(dt) + "信息";
map.put("sheetName", sheetName);
listMap.add(map);
Contract contract = null;
for (int j = 0; j < contractList.size(); j++) {
contract = dataList.get(j);
Map<String, Object> mapValue = new HashMap<String, Object>();
try {
mapValue.put("A", dataList.getA());
mapValue.put("B", dataList.getB());
mapValue.put("C", dataList.getC());
mapValue.put("D", dataList.getD());
} catch (Exception e) {
e.printStackTrace();
}
listMap.add(mapValue);
}
return listMap;
}


3.核心代码

基于poi的导出,因为项目需要导出大批量的数据(万级),所以使用了SXSSFWorkbook

/**
* 创建excel文档 --处理大数据
* @param list--数据
* @param keys--list中map的key数组集合
* @param columnNames--excel的列名
*
* */
public SXSSFWorkbook createWorkBookNew(List<Map<String, Object>> list, String[] keys, String columnNames[]) {
// long startTime = System.currentTimeMillis();
// 创建excel工作簿
SXSSFWorkbook sxssfWb = new SXSSFWorkbook(10000);//内存中保留10000 条数据,以免内存溢出,其余写入 硬盘
// 创建第一个sheet(页),并命名
Sheet sheet = sxssfWb.createSheet(list.get(0).get("sheetName").toString());
// 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
for (int i = 0; i < keys.length; i++) {
sheet.setColumnWidth(i, (short) (35.7 * 150));
}

// 创建第一行
Row row = sheet.createRow(0);

// 创建两种单元格格式
CellStyle cs = sxssfWb.createCellStyle();
CellStyle cs2 = sxssfWb.createCellStyle();

// 创建两种字体
Font f = sxssfWb.createFont();
Font f2 = sxssfWb.createFont();

// 创建第一种字体样式(用于列名)
f.setFontHeightInPoints((short) 12);//设置字体大小
f.setColor(IndexedColors.BLACK.getIndex());
f.setBoldweight(Font.BOLDWEIGHT_BOLD);//设置字体 粗体

// 创建第二种字体样式(用于值)
f2.setFontHeightInPoints((short) 10);
f2.setColor(IndexedColors.BLACK.getIndex());

// Font f3=sxssfWb.createFont();
// f3.setFontHeightInPoints((short) 10);
// f3.setColor(IndexedColors.RED.getIndex());

// 设置第一种单元格的样式(用于列名)
cs.setFont(f);
cs.setBorderLeft(CellStyle.BORDER_THIN);
cs.setBorderRight(CellStyle.BORDER_THIN);
cs.setBorderTop(CellStyle.BORDER_THIN);
cs.setBorderBottom(CellStyle.BORDER_THIN);
cs.setAlignment(CellStyle.ALIGN_CENTER);

// 设置第二种单元格的样式(用于值)
cs2.setFont(f2);
cs2.setBorderLeft(CellStyle.BORDER_THIN);
cs2.setBorderRight(CellStyle.BORDER_THIN);
cs2.setBorderTop(CellStyle.BORDER_THIN);
cs2.setBorderBottom(CellStyle.BORDER_THIN);
cs2.setAlignment(CellStyle.ALIGN_CENTER);
// 设置列名
for (int i = 0; i < columnNames.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(columnNames[i]);
cell.setCellStyle(cs);
}
// 设置每行每列的值
for (int i = 1; i < list.size(); i++) {
// Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
// 创建一行,在页sheet上
Row row1 = sheet.createRow(i);
// 在row行上创建一个方格
for (int j = 0; j < keys.length; j++) {
Cell cell = row1.createCell(j);
cell.setCellValue(list.get(i).get(keys[j]) == null ? " " : list.get(i).get(keys[j]).toString());
cell.setCellStyle(cs2);
}
}
//      long endTime = System.currentTimeMillis();    //获取结束时间
//      System.out.println("大数据方法:运行时间:" + (endTime - startTime) + "ms");    //输出程序运行时间
return sxssfWb;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: