java poi导出图片到excel示例代码
作者:954L 发布时间:2023-10-30 00:13:17
标签:java,poi,excel
本文实例为大家分享了java使用poi导出图片到Excel的具体代码,供大家参考,具体内容如下
代码实现
Controller
/**
* 导出志愿者/人才数据
* @param talent_type
* @return
*/
@RequestMapping("/exportData")
public void exportData(Integer talent_type, HttpServletResponse response) {
String fileId = UUID.randomUUID().toString().replace("-", "");
Map<String, Object> param = new HashMap<>() ;
param.put("talent_type", talent_type) ;
try {
List<Map<String, Object>> volunteerMapList = volunteerService.getExportData(param) ;
String rootPath = SysConfigManager.getInstance().getText("/config/sys/rootPath");
String filePath = rootPath + "/" + fileId + ".xlsx" ;
volunteerService.exportData(volunteerMapList, filePath) ;
// 下载
FileInputStream inputStream = null;
try{
//设置发送到客户端的响应内容类型
response.reset();
response.setContentLength((int) new File(filePath).length());
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode("文件名.xlsx", "UTF-8")+ "\"");
//读取本地图片输入流
inputStream = new FileInputStream(filePath);
// 循环取出流中的数据
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
} finally{
if(inputStream != null){
inputStream.close();
}
}
logger.debug("导出志愿者/人才数据成功!");
} catch (Exception e) {
e.printStackTrace();
logger.error("导出志愿者/人才数据异常!");
}
}
Service
public void exportData(List<Map<String, Object>> volunteerMapList, String filePath) throws Exception {
String[] alias = {"头像", "名称", "个人/团体", "志愿者/人才", "性别", "生日", "手机号",
"身份证", "省份", "市", "区/县", "详细地址", "邮箱", "政治面貌", "学历", "民族",
"职业", "团队人数", "艺术特长", "介绍"};
String[] keys = {"photo", "name", "type", "talent_type", "sex", "birth_day", "mobile",
"idcard", "province", "city", "county", "address", "email", "political",
"education", "nation", "profession", "member_count", "art_spetiality", "content"};
File file = new File(filePath);
if (!file.exists()) file.createNewFile();
FileOutputStream fileOutput = new FileOutputStream(file);
XSSFWorkbook workbook = new XSSFWorkbook();
int sheetSize = volunteerMapList.size() + 50;
double sheetNo = Math.ceil(volunteerMapList.size() / sheetSize);
String photoImgPath = SysConfigManager.getInstance().getText("/config/sys/rootPath") ;
for (int index = 0; index <= sheetNo; index++) {
XSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(index, "人才、志愿者" + index);
XSSFRow row = sheet.createRow(0);
sheet.setColumnWidth(0, 2048);
XSSFCell cell;
XSSFCellStyle cellStyle = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
// 居中
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 加粗
cellStyle.setFont(font);
//创建标题
for (int i = 0; i < alias.length; i++) {
cell = row.createCell(i);
cell.setCellValue(alias[i]);
cell.setCellStyle(cellStyle);
}
int startNo = index * sheetSize;
int endNo = Math.min(startNo + sheetSize, volunteerMapList.size());
cellStyle = workbook.createCellStyle();
// 居中
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 写入各条记录,每条记录对应excel表中的一行
for (int i = startNo; i < endNo; i++) {
int rowNum = i + 1 - startNo ;
row = sheet.createRow(rowNum);
Map<String, Object> map = (Map<String, Object>) volunteerMapList.get(i);
for (int j = 0; j < keys.length; j++) {
cell = row.createCell(j);
String key = keys[j] ;
if (key.equals("photo")){
sheet.addMergedRegion(new CellRangeAddress(i + 1,i + 1,i + 1,i + 1)) ;
// 头像
File photoFile = new File(photoImgPath + map.get(key)) ;
if (photoFile.exists()){
BufferedImage bufferedImage = ImageIO.read(photoFile) ;
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", byteArrayOut);
byte[] data = byteArrayOut.toByteArray();
XSSFDrawing drawingPatriarch = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = new XSSFClientAnchor(480, 30, 700, 250, (short)0, i + 1, (short) 1, i + 2);
drawingPatriarch.createPicture(anchor, workbook.addPicture(data, XSSFWorkbook.PICTURE_TYPE_JPEG));
sheet.setColumnWidth((short)500, (short)500);
row.setHeight((short)500);
} else {
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
cell.setCellValue("");
}
} else {
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
Object value = map.get(key);
cell.setCellValue(value == null ? "" : value.toString());
cell.setCellStyle(cellStyle);
}
}
}
// 设置列宽
for (int i = 1; i < alias.length; i++)
sheet.autoSizeColumn(i);
// 处理中文不能自动调整列宽的问题
this.setSizeColumn(sheet, alias.length);
}
fileOutput.flush();
workbook.write(fileOutput);
fileOutput.close();
}
// 自适应宽度(中文支持)
private void setSizeColumn(XSSFSheet sheet, int size) {
for (int columnNum = 0; columnNum < size; columnNum++) {
int columnWidth = sheet.getColumnWidth(columnNum) / 256;
for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
XSSFRow currentRow;
//当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(columnNum) != null) {
XSSFCell currentCell = currentRow.getCell(columnNum);
if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth < length) columnWidth = length;
}
}
}
columnWidth = columnWidth * 256 ;
sheet.setColumnWidth(columnNum, columnWidth >= 65280 ? 6000 : columnWidth);
}
}
以上所述是小编给大家介绍java poi导出图片到excel示例代码解整合,希望对大家有所帮助。
来源:https://blog.csdn.net/wkh___/article/details/87431066
0
投稿
猜你喜欢
- 一、系统介绍1.开发环境开发工具:Eclipse2021JDK版本:jdk1.8Mysql版本:8.0.132.技术选型Java+Swing
- java * 的方法总结AOP的拦截功能是由java中的 * 来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该
- 一、项目要求实现一个通讯录通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定
- 把spring-boot项目按照平常的web项目一样发布到tomcat容器下一、修改打包形式在pom.xml里设置 <packagin
- 开发项目的时候,表很多,是不可能一点点的自己去写xml ,dao文件的,这里就需要用到代码的自动生成工具了。第一步:导入jar包,当然,这之
- malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的
- 请求SpringBoot接受前台参数的六种方式,首先因为从前台发送的请求没有界面的话只能是从地址栏发送并且只能是Get请求,为了测试其他的请
- 在正式的进入主题之前,我们先来了解下深拷贝和前拷贝的概念:浅拷贝:会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝,如果属性是基本
- 介绍超级管理员:系统管理、用户管理、网点管理、运输点管理、快递员管理、网点申请管理(审核)、报价管理(时效报价)等。普通用户:注册登录、个人
- 关于UIToolbarToolBar工具栏是视图View的属性,可以在工具栏上添加工具栏按钮Bar Button Item(可以是自定义的C
- 简介AccessibilityService的设计初衷是为了辅助有身体缺陷的群体使用Android应用,它的设计贯穿着Android的控件树
- 问题描述 在某一天打开电脑后,idea里的代码无缘无故地就爆红了,不但spring框架爆红,就
- 前言服务消费者调用服务提供者的时候使用RestTemplate技术存在不便之处:拼接urlrestTmplate.getForObJect这
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- 最近碰到个需求,是希望在Unity有一个按钮,打开后直接跳转淘宝app,打开商品页面。百度了下没有相关的文章,于是我在此分享下。之前开发游戏
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上
- 几个月前写过一篇博客《xUtils3.0框架学习笔记》 ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下:private vo
- 做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用
- 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或0
- timer和timertask是jdk自带的定时任务实现,无需导入第三方jar包来完成1、指定多久之后执行此任务,注意:只会执行一次publ