1.pom文件:

     <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>

2.controller 根据需要组装数据:

private List<Map<String, Object>> createList(List<User> users){
if(null == users) {
return null;
}
String[] keys = {"name", "gender", "phoneNo", "email"};
String[] excelHeader = {"姓名","性别", "手机号", "邮箱"};
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> model = new HashMap<String, Object>();
model.put("fileName", "用户表" + new Date().getTime());
model.put("sheetName", "表一");
model.put("title", "用户表");
model.put("keys", keys);
model.put("excelHeader", excelHeader);
list.add(model); for(User user : users) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", user.getName());
map.put("gender", user.getGender());
map.put("phoneNo", user.getPhoneNo());
map.put("email", user.getEmail());
list.add(map);
}
return list;
}

3.ExcelUtil:

  

private static final Logger        LOG    = LoggerFactory.getLogger(ExcelUtil.class);

    /**创建一个excel文件*/
private static Workbook createWorkBoot(String title,
String[] excelHeader, List<Map<String, Object>> list, String[] keys) {
Workbook workbook = new HSSFWorkbook();
//设置sheet的名字
Sheet sheet = workbook.createSheet(list.get(0).get("sheetName").toString());
/*设置表格宽度*/
for(int i = 0; i < keys.length; i++){
sheet.setColumnWidth(i, 35*150);
} /*font样式设置字体大小,是否加粗*/
Font titleFont = createFont(workbook, (short)20, true);
Font headerFont = createFont(workbook, (short)12, true);
Font bodyFont = createFont(workbook, (short)12, false);
/*cell通用样式*/
CellStyle titleStyle = createStyle(workbook, titleFont);
CellStyle headerStyle = createStyle(workbook, headerFont);
CellStyle bodyStyle = createStyle(workbook, bodyFont); // excel中当前行索引
int index = 0;
/*合并标题的单元格设置标题信息及样式 */
sheet.addMergedRegion(new CellRangeAddress(index, index, index,
excelHeader.length - 1));
Row titleRow = sheet.createRow(index++);
Cell titleCell = titleRow.createCell(0);
titleCell.setCellValue(title);
titleCell.setCellStyle(titleStyle); /*设置表格头信息及样式*/
Row headerRow = sheet.createRow(index++);
for(int i = 0; i < excelHeader.length; i++) {
Cell headerCell = headerRow.createCell(i);
headerCell.setCellValue(excelHeader[i]);
headerCell.setCellStyle(headerStyle);
} /*设置每行每 列的值及样式
*Row为行,cell为方格
*创建i*j个方格并设置对应的属性值*/
for(int i = 1; i < list.size(); i++) {
Row bodyRow = sheet.createRow(index++);
for (int j = 0; j < keys.length; j++) {
Cell bodyCell = bodyRow.createCell(j);
bodyCell.setCellValue(list.get(i).get(keys[j]) == null ?
" " : list.get(i).get(keys[j]).toString());
bodyCell.setCellStyle(bodyStyle);
}
}
return workbook;
} /**设置字体大小,颜色,样式,是否加粗*/
private static Font createFont(Workbook workbook,
short fontHeightInPoints, boolean isBlod) {
Font font = workbook.createFont();
//字体大小
font.setFontHeightInPoints(fontHeightInPoints);
//字体颜色
font.setColor(IndexedColors.BLACK.getIndex());
//字体样式
font.setFontName("宋体");
//是否加粗
font.setBold(isBlod);
return font;
} /**设置字体居中显示,背景色,边框*/
private static CellStyle createStyle(Workbook workbook, Font font) {
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
//居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
//背景颜色
cellStyle.setFillForegroundColor(IndexedColors.WHITE.index);
cellStyle.setFillBackgroundColor(IndexedColors.WHITE.index);
cellStyle.setFillPattern(FillPatternType.FINE_DOTS);
//边框
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
return cellStyle;
} public static boolean exportExcel(HttpServletResponse response,List<Map<String, Object>> list) throws IOException {
String fileName = list.get(0).get("fileName").toString();
String[] excelHeader = (String [])list.get(0).get("excelHeader");
String[] keys = (String [])list.get(0).get("keys");
String title = list.get(0).get("title").toString(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
createWorkBoot(title, excelHeader, list, keys).write(baos);
} catch (IOException e) {
LOG.error("将workbook中信息写入输出流时失败");
return false;
}
byte[] content = baos.toByteArray();
InputStream is = new ByteArrayInputStream(content); response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
response.setHeader("Content-Disposition", "attachment;filename="
+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
ServletOutputStream sos = response.getOutputStream();
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(sos);
byte[] buff = new byte[2048];
int byteRead = 0;
while (-1 != (byteRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, byteRead);
}
} catch (IOException e) {
LOG.error("创建excel文件时失败");
return false;
} finally {
if (bos != null)
bos.close();
if (bis != null)
bis.close();
if(is != null)
is.close();
if(baos != null)
baos.close();
}
return true;
}

导出效果

  

springmvc poi实现报表导出的更多相关文章

  1. Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,htm

    Ireport 报表导出 Poi + ireport 导出pdf, doc ,excel ,html 格式 下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本 ...

  2. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  3. Spring Boot 入门(十二):报表导出,对比poi、jxl和esayExcel的效率

    本片博客是紧接着Spring Boot 入门(十一):集成 WebSocket, 实时显示系统日志写的 关于poi.jxl和esayExcel的介绍自行百度. jxl最多支持03版excel,所以单个 ...

  4. poi报表导出4.1.0版本工具类 导出并下载

    这一段时间,由于项目上线基于稳定,所以我这边在基于我们一期迭代的分支上优化一部分我们之前没有做的功能,报表导出.本身之前用的是3.5的版本,但是由于同事要写导入,写的代码只有4.1.0的版本支持,所以 ...

  5. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  6. Java中使用poi导入、导出Excel

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  7. kettle工具实现报表导出的初步搭建

    1.下载kettle 国外网站:http://kettle.pentaho.org/需要FQ,下载慢 2.下载完成启动(windows)-->spoon.bat 3.进入界面,两个主要的tab页 ...

  8. JasperReport报表导出踩坑实录

    写在最前面 翻了翻博客,因为太忙,已经好久没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六月份的时候写过一篇利用poi文件导入导出的小De ...

  9. 报表导出之easypoi的应用

    报表导出有很多种方法,像之前我有写过的jxl,poi,jasperreport又或者各种商业软件,这次来简单介绍下用了许久的开源轮子easypoi. easypoi的底层原理就不介绍了.因为官方文档的 ...

随机推荐

  1. 如何入门 Python 爬虫?

    作者:谢科   来源:知乎链接:https://www.zhihu.com/question/20899988/answer/24923424 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  2. io多路复用-select()

    参照<Unix网络编程>相关章节内容,实现了一个简单的单线程IO多路复用服务器与客户端. 普通迭代服务器,由于执行recvfrom则会发生阻塞,直到客户端发送数据并正确接收后才能够返回,一 ...

  3. 25个Linux相关的网站【转】

    转自:http://www.cnblogs.com/Lindaman/p/4552805.html 下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件, ...

  4. 一个真正的客户端非阻塞的 connect

    前言  - 一个简短开场白 winds 的 select 和 linux 的 select 是两个完全不同的东西. 然而凡人喜欢把它们揉在一起. 非阻塞的connect业务是个自带超时机制的 conn ...

  5. python logging system

    官方教程:https://docs.python.org/2/library/logging.html 1.  用法1 import logging import logging.handlers L ...

  6. 让我们来一起学习OC吧

    在本分类中的接下来的将翻译http://rypress.com/tutorials/objective-c/index 通过每一章节的翻译,使得自己的OC基础扎实并分享给大家.

  7. 创建.dat文件(转载)

    比较有用的东比较有用的东西 首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的 ...

  8. leetcode 121 122 123 . Best Time to Buy and Sell Stock

    121题目描述: 解题:记录浏览过的天中最低的价格,并不断更新可能的最大收益,只允许买卖一次的动态规划思想. class Solution { public: int maxProfit(vector ...

  9. leetcode 之Reorder List(25)

    找到中间结点,将后半部分反转接入即可. ListNode *reoderList(ListNode* head) { if (head == nullptr || head->next == n ...

  10. 切面保存web访问记录

    package com.hn.xf.device.api.rest.aspect; import com.hn.xf.device.api.rest.authorization.manager.Tok ...