javaweb项目基于poi的excel导出功能实现
程序员文章站
2022-03-15 15:03:44
...
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;
}
上一篇: 返回月份最大天数
下一篇: Python笔记之random模块!
推荐阅读
-
Asp.Net Core实现Excel导出功能的实现方法
-
用js实现导出功能将html中的table导出为excel
-
java使用POI实现excel文件的导入和导出(通用方法)
-
AngularJS基于http请求实现下载php生成的excel文件功能示例
-
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
-
使用POI实现Excel的导出功能
-
通过自定义注解+反射的形式,使用POI实现excel的导入导出
-
poi的入门使用,实现excel样式自定义导出,复制即可导出
-
使用POI导出Excel自适应列宽的实现 javapoiexcel
-
JAVA使用poi 实现Excel导出功能