首先添加有关的poi依赖jar包,如果是一个maven项目只需要在pom.xml中添加依赖。

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

然后示例的pom导出示例如下:

package com.cn.uk.robot.api.service;
import java.awt.Color;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.ClientAnchor.AnchorType;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;import com.cn.uk.robot.api.model.EquRobot;@Service
public class ExportExcelService<T> {public void exportExcel(Collection<T> dataset, OutputStream out) {exportExcel("异常识别点位", null, dataset, out, "yyyy-MM-dd");}public void exportExcel(String[] headers, Collection<T> dataset,OutputStream out) {exportExcel("异常识别点位", headers, dataset, out, "yyyy-MM-dd");}public void exportExcel(String[] headers, Collection<T> dataset,OutputStream out, String pattern) {exportExcel("异常识别点位", headers, dataset, out, pattern);}/*** 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上* * @param title*            表格标题名* @param headers*            表格属性列名数组* @param dataset*            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的*            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)* @param out*            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中* @param pattern*            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"*/public void exportExcel(String title, String[] headers,Collection<T> dataset, OutputStream out, String pattern) {// 声明一个工作薄@SuppressWarnings("resource")XSSFWorkbook workbook = new XSSFWorkbook();// 生成一个表格XSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth((short) 15);// 生成一个样式XSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setFillForegroundColor(new XSSFColor(Color.white));style.setFillPattern(FillPatternType.SOLID_FOREGROUND);style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);style.setBorderTop(BorderStyle.THIN);style.setAlignment(HorizontalAlignment.CENTER);// 生成一个字体XSSFFont font = workbook.createFont();font.setColor(new XSSFColor(Color.black));font.setFontHeightInPoints((short) 12);font.setBold(true);// 把字体应用到当前的样式style.setFont(font);// 生成并设置另一个样式XSSFCellStyle style2 = workbook.createCellStyle();style2.setFillForegroundColor(new XSSFColor(Color.white));style2.setFillPattern(FillPatternType.SOLID_FOREGROUND);style2.setBorderBottom(BorderStyle.THIN);style2.setBorderLeft(BorderStyle.THIN);style2.setBorderRight(BorderStyle.THIN);style2.setBorderTop(BorderStyle.THIN);style2.setAlignment(HorizontalAlignment.CENTER);style2.setVerticalAlignment(VerticalAlignment.CENTER);// 生成另一个字体XSSFFont font2 = workbook.createFont();font2.setBold(true);font2.setColor(new XSSFColor(Color.black));// 把字体应用到当前的样式style2.setFont(font2);// 声明一个画图的顶级管理器XSSFDrawing patriarch = sheet.createDrawingPatriarch();/*    // 定义注释的大小和位置,详见文档XSSFComment comment = patriarch.createCellComment(new XSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new XSSFRichTextString(""));// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("");*/// 产生表格标题行XSSFRow row = sheet.createRow(0);for (short i = 0; i < headers.length; i++) {XSSFCell cell = row.createCell(i);cell.setCellStyle(style);XSSFRichTextString text = new XSSFRichTextString(headers[i]);cell.setCellValue(text);}// 遍历集合数据,产生数据行Iterator<T> it = dataset.iterator();int index = 0;while (it.hasNext()) {index++;row = sheet.createRow(index);T t = (T) it.next();// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值Field[] fields = t.getClass().getDeclaredFields();for (short i = 0; i < fields.length; i++) {XSSFCell cell = row.createCell(i);cell.setCellStyle(style2);Field field = fields[i];String fieldName = field.getName();String getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);try {Class<? extends Object> tCls = t.getClass();Method getMethod = tCls.getMethod(getMethodName,new Class[] {});Object value = getMethod.invoke(t, new Object[] {});// 判断值的类型后进行强制类型转换String textValue = null;if(value!=null) {System.out.println("输出值"+value.toString());}else {System.out.println("输出值null");  }// if (value instanceof Integer) {// int intValue = (Integer) value;// cell.setCellValue(intValue);// } else if (value instanceof Float) {// float fValue = (Float) value;// textValue = new HSSFRichTextString(// String.valueOf(fValue));// cell.setCellValue(textValue);// } else if (value instanceof Double) {// double dValue = (Double) value;// textValue = new HSSFRichTextString(// String.valueOf(dValue));// cell.setCellValue(textValue);// } else if (value instanceof Long) {// long longValue = (Long) value;// cell.setCellValue(longValue);// }if (value instanceof Date) {Date date = (Date) value;SimpleDateFormat sdf = new SimpleDateFormat(pattern);textValue = sdf.format(date);} else if (value instanceof byte[]) {// 有图片时,设置行高为60px;row.setHeightInPoints(60);// 设置图片所在列宽度为80px,注意这里单位的一个换算sheet.setColumnWidth(i, (short) (35.7 * 80));// sheet.autoSizeColumn(i);byte[] bsValue = (byte[]) value;XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0,102300000, 2550000, (short) i, index, (short) i, index);anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE);patriarch.createPicture(anchor, workbook.addPicture(bsValue, XSSFWorkbook.PICTURE_TYPE_JPEG));} else {if(value!=null) {textValue = value.toString();}}// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成if (textValue != null) {Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher = p.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));} else {XSSFRichTextString richString = new XSSFRichTextString(textValue);XSSFFont font3 = workbook.createFont();font3.setColor(new XSSFColor(Color.black));richString.applyFont(font3);cell.setCellValue(richString);}}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} finally {// 清理资源}}}try {workbook.write(out);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {// 测试学生ExportExcelService<EquRobot> ex = new ExportExcelService<EquRobot>();String[] headers = { "编号", "机器人名称", "类型", "性别", "出生日期" };List<EquRobot> dataset = new ArrayList<EquRobot>();EquRobot equRobot = new EquRobot();equRobot.setName("机器人一号");equRobot.setId(12);equRobot.setStationName("吉兰一号");dataset.add(equRobot);dataset.add(equRobot);dataset.add(equRobot);// 测试图书ExportExcelService<EquRobot> ex2 = new ExportExcelService<EquRobot>();String[] headers2 = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN","图书出版社", "封面图片" };List<EquRobot> dataset2 = new ArrayList<EquRobot>();try {// BufferedInputStream bis = new BufferedInputStream(// new FileInputStream("V://book.bmp"));/*   BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/home/book.bmp"));byte[] buf = new byte[bis.available()];while ((bis.read(buf)) != -1) {//}*/dataset2.add(equRobot);dataset2.add(equRobot);dataset2.add(equRobot);dataset2.add(equRobot);dataset2.add(equRobot);// OutputStream out = new FileOutputStream("E://export2003_a.xls");// OutputStream out2 = new FileOutputStream("E://export2003_b.xls");OutputStream out = new FileOutputStream("D:\\home\\123.xlsx");OutputStream out2 = new FileOutputStream("D:\\home\\456.xlsx");ex.exportExcel(headers, dataset, out);ex2.exportExcel(headers2, dataset2, out2);out.close();JOptionPane.showMessageDialog(null, "导出成功!");System.out.println("excel导出成功!");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

导出成功后,在html页面弹出下载框,其中dataset为需要导出的数据的类集合。

 try {File file=File.createTempFile("异常点位识别表",".xlsx");OutputStream out = new FileOutputStream(file);String[] headers = { "点位序号", "点位名称", "识别类型", "原始结果", "审核结果","可见光1","红外光1","音频","视频"};exportExcelService.exportExcel(headers,dataset, out);out.close();exportDownLoadService.download(file.getAbsolutePath(), response);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}

弹出下载框

package com.cn.uk.robot.api.service;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Service;@Service
public class ExportDownLoadService {@SuppressWarnings("unused")public void download(String path, HttpServletResponse response) {try {// path是指欲下载的文件的路径。File file = new File(path);// 取得文件名。String filename = file.getName();// 以流的形式下载文件。InputStream fis = new BufferedInputStream(new FileInputStream(path));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();// 设置response的Headerresponse.addHeader("Content-Disposition", "attachment;filename="+ new String(filename.getBytes()));response.addHeader("Content-Length", "" + file.length());OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/vnd.ms-excel;charset=gb2312");toClient.write(buffer);toClient.flush();toClient.close();} catch (IOException ex) {ex.printStackTrace();}}}

poi导出excel包含图片,弹出页面下载框相关推荐

  1. Java使用POi导出Excel(包含图片)

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...

  2. EasyExcel根据自定义模板导出Excel(包含图片、表格)

    使用EasyExcel根据模板导出excel,包含图片.表格 提示:其实使用EasyExcel根据模板导出一个excel并不难,难点在于指定图片的位置 文章目录 使用EasyExcel根据模板导出ex ...

  3. POI导出Excel,浏览器不下载的问题解决

    在做POI导出Excel的时候,遇到了浏览器不弹出下载框的问题 问题发现 debug跟进发现输出流已经成功写入,而且程序没有报错,可就是没有下载提示 在前台控制器的XHR-response中查看返回数 ...

  4. POI导出Excel表格,去掉数字框的左上角绿色的小三角

    在用POI导出Excel表格,数字框的左上角有个绿色的小三角,看着很不舒服,如下图所示: 目的:当单元格为数字时,不要转为文本输出,就直接按数字格式输出,去掉左上角的绿色小三角形. 解决办法:在网上找 ...

  5. JAVA导出excel 直接弹出下载框

    效果展示: 1.首先准备jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>po ...

  6. springmvc导出excel并弹出下载框

    最近做grid列表相关数据导出到excel功能,根据自己选择的列导出成excel 并且下载到本地.废话不说 直接上关键代码: 需要引入相关的包: compile 'org.apache.poi:poi ...

  7. POI 导出Excel 带图片导出 使用XSSFWorkbook

    参考链接:POI导出图片到Excel不生效 (2007以上版本)_rj_han的博客-CSDN博客 //数据源 查询库 List<FormMt> mtList = formMtMapper ...

  8. java导出excel包含图片

    最近有需要导出用户留言的数据,包含用户留言的上传的照片 在网上找了很多,整合一些,最后实现了业务,导出来有点丑,后续再做优化,代码功能有局限性,看到的小伙伴如果有好的想法可以说说,让我学习学习 最后实 ...

  9. poi导出Excel直接在浏览器下载

    需求:导出成Excel格式,要在浏览器看到类似于下载的效果. 导出的Excel和下载在同一个目录下. xxController.java // 导出 @RequestMapping(value = & ...

最新文章

  1. git 拉去merged 仓库的代码步骤
  2. Asp.net 邮件传输(转)
  3. 学习运维工程师是正确的选择,发展与前景都是和好的
  4. ApartmentState.STA
  5. 第20讲:代理的基本原理和用法
  6. 热搜!华为:这类程序员领10亿,程序员:真香!你怎么看?
  7. java中数组的定义
  8. 计算机组成原理第二版第4章的答案,计算机组成原理第4章习题参考答案
  9. 3D-CNN各层计算
  10. SparkStreaming手动维护Kafka Offset的几种方式
  11. 深度为你解答怎么避免域名被微信拦截,微信域名防封需要注意哪些问题?
  12. jadc连接oracle,用jdbc连接oracle的第一次经历
  13. [topcoder]AvoidRoads
  14. 免费数据集下载网站【dataset】
  15. 《数据结构教程》(第5版)学习笔记(一)
  16. java课设迷宫游戏_Java编写迷宫小游戏
  17. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇
  18. Nolanjdc对接傻妞教程
  19. 我的awk常用命令备忘 xargs备忘
  20. 自动光学变焦USB摄像头模组微光全彩夜视18倍USB摄像机机芯参数

热门文章

  1. docker学习笔记---基础入门
  2. 【Spring】入门
  3. 通过图片识别定位拍摄地点——微信小程序
  4. 什么是深度卷积神经网络,基于深度卷积神经网络
  5. Feign传递请求头信息
  6. 信息传递(带权并查集求最小环
  7. 编译原理实验三【中间代码生成程序设计】
  8. 小白也能写前端?推荐一款超实用的app----JsHD调试器,助你写出炫酷的网页!
  9. OLE程序开发利用(开发EXCEL)
  10. spring boot 项目 事务 不能回滚 代理(not eligible for auto-proxying)