当前位置: 首页 > news >正文

Java导出图片到excel

1、例如你有这样一个集合,具体结合你的业务场景
 

@Data
public class Student {/*** 姓名*/private String xh;/*** 学号*/private String xm;/*** 照片*/private byte[] zp;
}

2、相关代码

    @RequestMapping(value = "/quereImgByPkid/{pkid}",method = RequestMethod.GET)public  void  test(@PathVariable("pkid") String pkid, HttpServletResponse response){try {// 业务代码List<Student> students = xscnsService.queryImgByPkidAndType(pkid);// 设置响应头response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=students.xlsx");try (OutputStream outputStream = response.getOutputStream();Workbook workbook = new XSSFWorkbook()) {Sheet sheet = workbook.createSheet("Student Data");// 创建表头Row header = sheet.createRow(0);header.createCell(0).setCellValue("学号");header.createCell(1).setCellValue("姓名");header.createCell(2).setCellValue("照片");int rowIndex = 1;for (Student student : students) {Row row = sheet.createRow(rowIndex++);// 设置行高(行高设置为100点)row.setHeightInPoints(100);row.createCell(0).setCellValue(student.getXh());row.createCell(1).setCellValue(student.getXm());// 插入照片int pictureIdx = workbook.addPicture(student.getZp(), Workbook.PICTURE_TYPE_JPEG);CreationHelper helper = workbook.getCreationHelper();Drawing<?> drawing = sheet.createDrawingPatriarch();ClientAnchor anchor = helper.createClientAnchor();anchor.setCol1(2); // 照片列anchor.setRow1(rowIndex - 1); // 当前行// 将图片大小调整为单元格大小anchor.setCol2(3); // 结束列anchor.setRow2(rowIndex); // 结束行Picture pict = drawing.createPicture(anchor, pictureIdx);// 不调用resize,让图片完全适应单元格}// 将数据写入到响应输出流中workbook.write(outputStream);outputStream.flush();}} catch (Exception e) {e.printStackTrace();}}

3、访问接口得以下载,如下

4、拓展(实战代码)

    @GetMapping("/exportFjPf")public void exportFjPf(@RequestParam String uuid, HttpServletResponse response) {wsjcService.exportFjPf(uuid,response);}
    @Overridepublic void exportFjPf(String uuid, HttpServletResponse response) {//1、获取缓存的数据Object obj = NHRedisUtils.getRedisResult(uuid);if (obj == null) {throw new NHWarmingException("导出Excel失败,请稍后再试");}Map<String, Object> map = (Map<String, Object>) obj;List<Map<String, Object>> list = (List<Map<String, Object>>) map.get("list");// 文件名字,防止乱码String fileName = "房间评分信息.xlsx";// 针对不同的浏览器进行文件名编码String encodedFileName = null;try {encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}response.setContentType("application/octet-stream");// 对于不同的浏览器设置不同的 Content-Disposition 头String headerValue = String.format("attachment; filename=\"%s\"; filename*=UTF-8''%s", encodedFileName, encodedFileName);response.setHeader("Content-Disposition", headerValue);try (OutputStream outputStream = response.getOutputStream(); Workbook workbook = new XSSFWorkbook()) {Sheet sheet = workbook.createSheet("房间评分信息");// 设置统一的列宽(比如统一设置为20个字符宽度)int columnWidth = 20 * 256;// 创建一个单元格样式,设置居中对齐CellStyle cellStyle = workbook.createCellStyle();// 水平居中cellStyle.setAlignment(HorizontalAlignment.CENTER); // 垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 创建一个标题单元格样式,设置居中对齐和加粗字体CellStyle headerStyle = workbook.createCellStyle();headerStyle.setAlignment(HorizontalAlignment.CENTER);headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置字体加粗Font headerFont = workbook.createFont();headerFont.setBold(true);headerStyle.setFont(headerFont);// 创建表头字段String[] headers = {"序号", "校区", "楼栋","楼层","房间","学院","专业","班级","所属年级","所属辅导员","评分","评分等级","评分人","评分时间","评语","上传图片"};// 对应的字段String[] column = {"ROW_ID", "XQMC", "LDMC","LCMC","FJ","BMMC","ZYMC","BJMC","SSNJ","FDY","PF","PFDJMC","PFR","PFSJ","PY"};// 创建表头Row headerRow = sheet.createRow(0);for (int i = 0; i < headers.length; i++) {headerRow.setHeightInPoints(30);Cell cell = headerRow.createCell(i);cell.setCellValue(headers[i]);cell.setCellStyle(headerStyle);// 设置每一列的宽度sheet.setColumnWidth(i, columnWidth);}int rowIndex = 1;for (Map<String,Object> item : list) {Row row = sheet.createRow(rowIndex++);for (int i = 0; i < column.length; i++) {// 设置行高 100点row.setHeightInPoints(100);Cell cell = row.createCell(i);cell.setCellValue(getStrByObject(item.get(column[i])));cell.setCellStyle(cellStyle);}List<byte []> pictureList =  getPicture(item.get("SCTP"));for (int i = 0; i < pictureList.size(); i++) {sheet.setColumnWidth(column.length + i,columnWidth);// 插入照片int pictureIdx = workbook.addPicture(pictureList.get(i), Workbook.PICTURE_TYPE_JPEG);CreationHelper helper = workbook.getCreationHelper();Drawing<?> drawing = sheet.createDrawingPatriarch();ClientAnchor anchor = helper.createClientAnchor();anchor.setCol1(column.length + i); // 照片列anchor.setRow1(rowIndex - 1); // 当前行// 将图片大小调整为单元格大小anchor.setCol2(column.length + i + 1); // 结束列anchor.setRow2(rowIndex); // 结束行Picture pict = drawing.createPicture(anchor, pictureIdx);//不调用resize,让图片完全适应单元格}}// 将数据写入到响应输出流中workbook.write(outputStream);outputStream.flush();} catch (Exception e) {logger.error(e.getMessage(), e);throw new RuntimeException(e);}}private List<byte[]> getPicture(Object sctp) {List<byte[]> bytes = new ArrayList<>();String strByObject = getStrByObject(sctp);if(strByObject == null){return bytes;}// 开始远程调用Object fjDetail = dynamicServiceFeignClient.getDetailed(strByObject);// 调用日志logger.warn("附件主表req:{},rep:{}", strByObject, fjDetail);List<Map<String, Object>> maps = new ArrayList<>();if (fjDetail != null) {Map map = (Map) fjDetail;Object data = map.get("data");maps = (List<Map<String, Object>>) data;}List<String> uuids = maps.stream().map(a -> (String) a.get("uuid")).collect(Collectors.toList());for (int i = 0; i < uuids.size(); i++) {// 开始调用详细附件明细Response fileMessage = docrepoServiceFeignClient.getFileInfo(uuids.get(i), "admin", "admin");// 打印日志logger.warn("根据uuid拿到资源req:{},resp:{}", uuids.get(i), fileMessage);if (fileMessage == null || fileMessage.status() != 200) {continue;}// 拿到文件流try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){InputStream imageStream = fileMessage.body().asInputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = imageStream.read(buffer)) != -1) {byteArrayOutputStream.write(buffer, 0, bytesRead);}byte[] imageBytes = byteArrayOutputStream.toByteArray();bytes.add(imageBytes);} catch (IOException e) {throw new RuntimeException(e);}}return bytes;}private String getStrByObject(Object str){if(str != null){return str.toString();}return null;}

结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • sql-labs51-55通关攻略
  • 在react 中还有另外一种three.js 渲染方式
  • 51单片机-DS1302,操作简述
  • MySQL面试题--最全面-索引
  • Sqoop部署和基本操作
  • VBA学习(71):Excel VBA 访问带密码保护的Access数据库/用户窗体设置/EXCEL用户+密码登录界面(Access版)
  • vite项目配置本地开发使用https访问
  • vue3页面空白-普通函数和箭头函数提升的不同
  • 探索Python世界的趣味之旅:自制贪吃蛇游戏
  • 【Python123题库】#大学排行榜分析 #数据统计 #罗马数字转换
  • 【leetcode详解】一个小组的最大实力值【中等】
  • 如何用RoBERTa高效提取事件文本结构特征:多层次上下文建模与特征融合
  • Spring全局异常处理HandlerExceptionResolver使用
  • lambda c++/java/kotlin
  • 鸿蒙(API 12 Beta6版)图形【使用Text模块实现文本显示】方舟2D图形服务
  • [数据结构]链表的实现在PHP中
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Java深入 - 深入理解Java集合
  • java中具有继承关系的类及其对象初始化顺序
  • jquery ajax学习笔记
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Mybatis初体验
  • MYSQL 的 IF 函数
  • MySQL用户中的%到底包不包括localhost?
  • php的插入排序,通过双层for循环
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Python实现BT种子转化为磁力链接【实战】
  • Solarized Scheme
  • TypeScript实现数据结构(一)栈,队列,链表
  • 百度地图API标注+时间轴组件
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分布式任务队列Celery
  • 记录一下第一次使用npm
  • 码农张的Bug人生 - 见面之礼
  • 前端面试题总结
  • 前嗅ForeSpider教程:创建模板
  • 如何在GitHub上创建个人博客
  • 深度学习在携程攻略社区的应用
  • 正则学习笔记
  • Hibernate主键生成策略及选择
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​secrets --- 生成管理密码的安全随机数​
  • ​马来语翻译中文去哪比较好?
  • ​数据结构之初始二叉树(3)
  • # 职场生活之道:善于团结
  • #define、const、typedef的差别
  • #每天一道面试题# 什么是MySQL的回表查询
  • #微信小程序(布局、渲染层基础知识)
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)ssm航空客运订票系统 毕业设计 141612