最近做一个项目,需将多个图片(比如:jpg、bmp、png等图片格式)按实际大小插入同一个单元格,现把它记录下来,供大家参考。

由于本人程序员猿一枚,而且处在初期堆砌代码阶段,如果程序有错误的地方,真诚希望大家多多指点;如果对大家有所帮助,希望给个赞鼓励一下。具体如下:

前期准备:需要下载jxl.jar包

主要有两个类,imgFile和ExcelPicture

imgFile类,主要包括ByteArrayOutputStream pngByteArray,double width,double heigth三个属性

import java.io.ByteArrayOutputStream;
public class ImgFile {  private ByteArrayOutputStream pngByteArray;//private double width;  private double heigth;  public double getWidth() {  return width;  }  public void setWidth(double width) {  this.width = width;  }  public double getHeigth() {  return heigth;  }  public void setHeigth(double heigth) {  this.heigth = heigth;  }public ByteArrayOutputStream getPngByteArray() {return pngByteArray;}public void setPngByteArray(ByteArrayOutputStream outPut) {this.pngByteArray = outPut;}
}

ExcelPicture类代码如下

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;import javax.imageio.ImageIO;import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;/**
* @ClassName: ExcelPicture
* @Description: TODO(将多种格式的图片插入到excel 一个单元格内)
* @date 2017年9月21日 下午4:21:11
*
*/
public class ExcelPicture {public static void main(String[] args) throws Exception {    System.out.println("开始插入图片");//创建Excel工作簿;    WritableWorkbook workbook = Workbook.createWorkbook(new File("F:/InsertPictureToExcel.xls"));    //创建Excel电子薄;    WritableSheet sheet = workbook.createSheet("插入图片演示", 0);     //图片路径  String[] filePaths = new String[4];  filePaths[0] = "F:\\2.bmp";  filePaths[1] = "F:\\2.jpg";  filePaths[2] = "F:\\2.png";filePaths[3] = "F:\\2.gif";//调用图片插入函数  addPictureToExcel(sheet,filePaths,3,3);  //写入Excel表格中;    workbook.write();    //关闭流;    workbook.close();    System.out.println("恭喜,图片插入成功!");  }    /**  *   * @Title: addPictureToExcel  * @Description: TODO(将多个图片按实际大小,插入同一个单元格,最后一张图如果高度超过了单元格,则压缩高度使之在单元格内)  * @date 2016年12月16日 下午6:13:52  * @param @param picSheet  * @param @param pictureFilePaths  * @param @param cellRow  * @param @param cellCol  * @param @throws Exception 设定文件  * @return void 返回类型  * @throws  */  private static void addPictureToExcel(WritableSheet picSheet, String[] pictureFilePaths, double cellRow, double cellCol)    throws Exception {  final double cellSpace = 0.02;//图片之间的间隔 占比  double picWidthMax = 0;  double picHeightSum =0;//空出图片 离上下边框的距离  ImgFile[] imgFiles = new ImgFile[pictureFilePaths.length];  for (int i=0;i<pictureFilePaths.length;i++) {  ImgFile imgFile = new ImgFile();  File imageFile = new File(pictureFilePaths[i]);   // 读入图片   BufferedImage picImage = ImageIO.read(imageFile);ByteArrayOutputStream pngByteArray = new ByteArrayOutputStream();//将其他图片格式写成png的形式ImageIO.write(picImage, "PNG", pngByteArray);imgFile.setPngByteArray(pngByteArray);// 取得图片的像素高度,宽度    double picWidth = picImage.getWidth() * 0.15;  //具体的实验值,原理不清楚。    double picHeight = picImage.getHeight() * 15; //具体的实验值,原理不清楚。    imgFile.setHeigth(picHeight);  imgFile.setWidth(picWidth);  //汇总  if (picWidth > picWidthMax) {  picWidthMax = picWidth;  }  picHeightSum += picHeight;  imgFiles[i] = imgFile;    }  WritableFont font = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED);    WritableCellFormat cellFormat = new WritableCellFormat(font);    //设置背景颜色;    cellFormat.setBackground(Colour.WHITE);    //设置边框;    cellFormat.setBorder(Border.ALL, BorderLineStyle.THIN);    //设置自动换行;    cellFormat.setWrap(true);    //设置文字居中对齐方式;    cellFormat.setAlignment(Alignment.CENTRE);    //设置垂直居中;    cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);    Label imageLabel = new Label((int)cellCol, (int)cellRow, "",cellFormat);   picSheet.addCell(imageLabel);  //设置单元格宽高  picSheet.setColumnView((int)cellCol, (int)picWidthMax);//列宽  picSheet.setRowView((int)cellRow, (int)picHeightSum);//行高  double widthStart = cellSpace;//开始宽度  double heightStart = cellSpace;//开始高度  //插入图片  for (ImgFile imgFile0: imgFiles) {  double heigthFact = imgFile0.getHeigth()/picHeightSum;//实际高度  double widthFact = imgFile0.getWidth()/picWidthMax;  //图片高度压缩了cellSpace+moreHeight,目的是为了该图片高度不超出单元格  if (heightStart + heigthFact >= 1) {  double moreHeight = heightStart + heigthFact - 1.00;  heigthFact -= moreHeight;  heigthFact -= cellSpace;  }  //图片宽度压缩了cellSpace,目的是为了该图片宽度不超出单元格  if (widthFact >= 1) {  widthFact -= cellSpace;  }  //生成图片对象  WritableImage image = new WritableImage(cellCol+widthStart, cellRow + heightStart,    widthFact, heigthFact, imgFile0.getPngByteArray().toByteArray());    //将图片对象插入到sheet    picSheet.addImage(image);    //开始高度累加,获取下一张图片的起始高度(相对该单元格)  heightStart += heigthFact;  heightStart +=cellSpace;//图片直接间隔为cellSpace  }  }
}

Java将png、jpg、bmp等格式图片批量插入到Excel单个单元格内相关推荐

  1. 将文件夹中的所有图片插入到Excel的单元格批注中,自动修正图片方向

    需求概述 文件夹中有若干图片,要求将所有图片插入到Excel的单元格批注中. 插入图片到批注中时,要求允许自定义图片的高度,按需调节尺寸. 解决办法一 使用"Excel插件E灵"可 ...

  2. NET CORE读取Excel.xlsx单元格内的图片,并关联当前业务ID推送图片到指定服务器...

    NET CORE读取Excel.xlsx单元格图片的场景,一般是批量导入业务数据,例如:药品的图片,医师资格证,商品上架.商家营业资质.水果信息.用户头像等等 这里我截个图,图文并茂更好理解 特别声明 ...

  3. java导出excel文件,设置单个单元格内字段不同样式

    最近在做文件模板下载,有需求提出,部分字段需要使用*来标明必填,而且必须是红色,因此,在网上百度之后,终于找到参考文档,参考地址贴在最后. public static void main( Strin ...

  4. 使用EasyExcel在同一单元格内添加图片和文字,并作格式排版

    格式要求如下: 需求:在一个单元格内,左侧是图片,右侧是文字,文字和图片之间有间隙. 思路:在一个单元格内添加图片并设置图片位置,然后添加文字,设置文字位置. 经查看EasyExcel文档发现: 添加 ...

  5. JPG格式图片怎么插入CAD图纸

    在CAD制图工作中你有遇到这一问题吗?把一张图片插 入到CAD图纸中?我就常常会遇到这一问题.现在想和大家分享一下2中非常好的操作方法给大家.小伙伴们若是喜欢可以择优选择试一下.方法一:(1)运行迅 ...

  6. java poi设置单元格格式为数值_java中导出excel设置单元格的样式为数字格式怎么设置_Java代码实现设置单元格格式...

    java中导出excel设置单元格的样式为数字格式怎么设置 如果是使用poi,它会自动根据参数值设置单元格为恰当格式,只需传入数字类型参数值即可,比如 double value=....; cell. ...

  7. JAVA通过poi实现excel表格制作并且将图片放入到指定的单元格中(可以循环插入)

    废话不多说,直接上代码,上效果图 @RestController @Api(tags = "报表") @RequestMapping("/export") @C ...

  8. poi word操作之向单元格内添加图片

    poi word操作之向单元格内添加图片 1,主要难点: poi word操作之向单元格内添加图片考虑的点: 1)考虑图片在单元格内的占比(动态的调整图片在文档中的宽高) 2,解决步骤 1)首先需要获 ...

  9. 负数显示红字html语言,需要将单元格内的负数显示为红色且不带负号显示两位小数的格式代码是下面哪一种A、 0.00;[红色...

    需要将单元格内的负数显示为红色且不带负号显示两位小数的格式代码是下面哪一种A. 0.00;[红色 更多相关问题 SPEC性能测试能比时钟频率更全面地反映计算机处理器.存储结构和编译器的性能.它有两种表 ...

最新文章

  1. shell编程-正则表达式
  2. python列表、元组、字典和集合的算法时间_27.Python列表(list)、元组(tuple)、字典(dict)和集合(set)详解...
  3. Android之单复选框及Spinner实现二级联动
  4. poj 1006 java_POJ 1006 Biorhythms 数论-(孙子定理)
  5. 如何合理的规划一次 JVM 性能调优
  6. ubuntu没有指纹登录_ubuntu安装指纹识别驱动
  7. 高响应比优先调度算法 (HRRN)例题
  8. 吴恩达机器学习(六)神经网络(前向传播)
  9. 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
  10. Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入
  11. 任正非《以客户为中心》
  12. mysql 1114错误_mysql出现错误编码1114的解决方法
  13. 微信开发工具调试公众号
  14. html雪花飘落效果,使用js实现雪花飘落效果
  15. Unity制作九宫格手机手势解锁密码
  16. 2018十大网络用语新鲜出炉,skr入围榜三!
  17. 【软件测试】数据库大厂面试真题解析(二叉树算法纯干货!)
  18. HTML画布与SVG(Canvas vs. SVG)
  19. DNA存储技术创造新纪录 存储容量已达200MB
  20. call()和appy()的区别及常用场景

热门文章

  1. 【Python】中文编解码操作
  2. Xbox One 游戏:Forza 5 (分屏)多人本地对战
  3. 灵遁者科普三部曲句子摘录
  4. 基于数据仓库的证券CRM系统建设
  5. laravel配置路由会报404 Not Found
  6. python 映射和反映射_Python 数据可视化:几何对象和美学映射
  7. 数据库实训第二天笔记,jQuery的补充和ajax的学习和案例
  8. 分享一下韩寒的经典语录
  9. 程序员拿到结婚证以后说的第一句话
  10. 直接读取ftp服务器文件,java读取ftp服务器文件