Java Web导出等比例图片到Excel的实现过程

 更新时间:2023年11月23日 10:42:07   作者:小王和八蛋  
我们使用Java导出图片到Excel,打开成功导出的Excel一看,商品对应的图片都很规矩的按照我的设置铺满了整个单元格,但是,商品图片却都变形了,这样肯定是不行的,于是第一反应就是将图片等比例导出,所以本文本给大家介绍了如何使用Java Web导出等比例图片到Excel

做个Excel导入导出的Java开发户都知道,可以利用Apache的POI来实现,为Excel创建每一行,每一单元及对应的内容。当然,图片的话需要用到POI中的HSSFClientAnchor这个类型来实现, HSSFClientAnchor的构造函数中有八个参数,分类为:int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2,其中dx1、dy1定义了该图片在开始cell的起始位置,dx2、dy2定义了在终cell的结束位置,col1、row1定义了开始cell、col2、row2定义了结束cell。

那么,我们就可以用这个方法来讲图片定位到每一个单元格中。我的做法是:

铺满整个单元格,这里的j和i是代码中要到处多张图做了循环定义的变量HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i + 1, (short) j, i + 1);

很顺利,成功导出!

问题来了,打开成功到处的Excel一看,商品对应的图片都很规矩的按照我的设置铺满了整个单元格。但是,商品图片却都变形了,也就是图片的 宽高被强行设置了成对应单元格的宽高。

这样肯定是不行的,于是第一反应就是将图片等比例导出,但是怎么让图片等比例的导出在Excel中呢,苦恼了许久,终于想到了一个可行的方案。就是利用POI设置每一行对应要放图片的那个单元格的宽度固定,也就是所有导出的图片的宽度固定,然后根据这个固定宽度与原图宽高对比,算出该固定宽度的等比例高度,然后动态设置该单元格的高度,然后再利用HSSFClientAnchor来铺满整个单元格,这样看起来就不会变形,而且等比例缩放到指定单元格中。

关键两个实现步骤:

第一步 设置单元格固定宽度: 循环创建每一行的时候,如何设置要放图片的那个单元的宽度呢?大家都知道,在Excel中,同一列的单元格的宽度都是一样的,故可以在创建工作簿的时候,就设定好要放图片的那个单元格的宽度,我是这样做的:

生成一个表格 HSSFSheet sheet = workbook.createSheet(title);

设置B列的宽度为 30*256; sheet.setColumnWidth(1, 30 * 256);

这里我们看到,SetColumnWidth的第二个参数要乘以256,是因为这个参数的单位是1/256个字符宽度,也就是说这里我设置的是30个字符的宽度,至于一个字符宽度是多少,可以用FontDesignMetrics来获得,一般一个12号字体的宽度大约是13像素。

第二步,设置单元等比率高度:在循环每一行中,当创建对应放图片的单元的时候,设置对应的高度。我的做法是,先获取要导出的图片,在获取图片的原始宽度和高度(主要,这里获取的是像素宽高),然后根据前面设置的固定宽度算出等比例的高度:

ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File(savePath + System.getProperty("file.separator") + map.get("productImg")));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
int width = bufferImg.getWidth();//原始宽度
int height = bufferImg.getHeight();//原始高度
// 一个12号字体的宽度为13,前面已设置了列的宽度为30*256,故这里的等比例高度计算如下
height = (int) Math.round((height * (30 * 13) * 1.0 / width));
// excel单元格高度是以点单位,1点=2像素; POI中Height的单位是1/20个点,故设置单元的等比例高度如下
row.setHeight((short) (height / 2 * 20));
// 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// anchor主要用于设置图片的属性
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i + 1, (short) j, i + 1);
anchor.setAnchorType(3);
// 插入图片
patriarch.createPicture(anchor,workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));

至此,等比率图片及相关信息以完美导出到Excel中。

到此这篇关于Java Web导出等比例图片到Excel的实现过程的文章就介绍到这了,更多相关Java Web导出等比例图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot整合https的实例代码

    Springboot整合https的实例代码

    本文简单介绍了一些密码学的基础和如何通过Springboot整合HTTPS,本文将通过实例代码给大家详细介绍整合过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Java对象简单实用案例之计算器实现代码

    Java对象简单实用案例之计算器实现代码

    这篇文章主要为大家详细介绍了Java对象简单实用案例之计算器实现代码
    2016-11-11
  • Spring中Eureka的自我保护详解

    Spring中Eureka的自我保护详解

    这篇文章主要介绍了Spring中Eureka的自我保护详解,当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式,一旦进入该模式,Eureka Server就会保护服务注册表中的信息,需要的朋友可以参考下
    2023-11-11
  • Java中Spring WebSocket详解

    Java中Spring WebSocket详解

    本篇文章主要通过代码给大家详细分析了Java中Spring WebSocket的用法,需要的读者们参考学习下吧。
    2017-12-12
  • springboot jackson配置教程

    springboot jackson配置教程

    这篇文章主要介绍了springboot jackson配置教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 为什么Java单例模式一定要加 volatile

    为什么Java单例模式一定要加 volatile

    这篇文章主要介绍了为什么Java单例一定要加volatile,指的是为什么懒汉模式中的私有变量要加volatile?带着疑问一起学习下面文章内容吧
    2022-05-05
  • Mybatis Log Plugin的使用方式

    Mybatis Log Plugin的使用方式

    这篇文章主要介绍了Mybatis Log Plugin的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot中的Future接口详解

    SpringBoot中的Future接口详解

    这篇文章主要介绍了SpringBoot中的Future接口详解,在异步编程中,我们通常需要处理一些耗时的操作,一种常见的做法是使用 Future 接口来代表一个异步操作的结果,需要的朋友可以参考下
    2023-07-07
  • JAVA使用quartz添加定时任务,并依赖注入对象操作

    JAVA使用quartz添加定时任务,并依赖注入对象操作

    这篇文章主要介绍了JAVA使用quartz添加定时任务,并依赖注入对象操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot 项目使用hutool 工具进行 http 接口调用的处理方法

    SpringBoot 项目使用hutool 工具进行 http 接口调用的处理方

    在实际的开发过程中一个互联网的项目来说 ,有可能会涉及到调用外部接口的实际业务场景,下面通过本文给大家介绍SpringBoot 项目 使用hutool 工具进行 http 接口调用的处理方法,需要的朋友可以参考下
    2022-06-06

最新评论