系列文章:

Java 操作 Office:POI 之 word 生成

一 背景问题

本系列旨在分享一些word操作框架POI的一些使用技巧,系统学习可直接参考官方文档,或上一篇中提到的Apache POI Word(docx) 入门示例教程。更多交流可添加公众号【程序员架构进阶】一起探讨。

本篇是根据一个真实场景,探索的实现方法。我们有一些希望插入word的图片,在插入时也要对图片本身添加一些标注,例如红框标记等等,也可能是添加文字标注。如果是手工操作,这显然比较简单,使用美图秀秀、Photoshop等工具,或只是截图工具中直接划线、添加文字就可以快速实现。但当需要处理的是批量数据,手工方式就不适合了。

二 一个简单的想法

因为最终是要写入word,所以暂时考虑还是使用XWPFRun.addPicture方法在单元格插入图片。但下一步,我们要在执行插入前,对图片做完所需的处理动作。这里可以考虑ImageIO 和 Graphics,这两个Java中的图片图形处理工具类来实现了。

三 Graphics

3.1 简介

java.awt.Graphics是一个抽象类,根据源码中的文档描述,

Graphics类是所有图形上下文的抽象基类,允许应用程序绘制在各种设备上实现的组件以及屏幕外图像上。

Graphics的使用已经被很多人整理过,所以本篇就不再赘述。可以参考文章:Java Graphics类的绘图方法了解完整的使用方法。这里只抽取所需的方法介绍,并给出示例。

3.2 矩形绘制

在图片中绘制一个矩形,来代表框选区域,通过配合颜色选择(红橙黄),可以起到标示作用。矩形区域,我们按照从左到右的方向,可以简单用起点横坐标:x,起点纵坐标:y,以及宽度width+高度height来确定。当然,其实宽度和高度也可以替换终点横坐标 和 终点纵坐标来标示。

在Graphics中绘制矩形的方法:

public void drawRect(int x, int y, int width, int height)

3.3 多边形绘制

矩形只有四个点,显示中可能需要绘制复杂的多边形,那么上述方法就无法满足了。所以Graphics提供了一个更为通用的绘制多边形方法:

public abstract void drawPolygon(int xPoints[], int yPoints[],int nPoints);

参数的xPoints,yPoints,nPoints分别代表横坐标数组,纵坐标数组,线段个数;xPoints和yPoints大小必须相同。

这个方法会绘制由 nPoint 个线段定义的多边形,其中前 nPoint - 1 个线段是 1 ≤ i ≤ 时从 (xPoints[i - 1], yPoints[i - 1]) 到 (xPoints[i], yPoints[i]) 的线段。如果最后一个点和第一个点不同,则图形会通过在这两点间绘制一条线段来自动闭合。

除了直接输入坐标,也可以通过传入定义的Polygon类来进行封装,使用drawPolygon(Polygon p)实现绘制:

public void drawPolygon(Polygon p) {drawPolygon(p.xpoints, p.ypoints, p.npoints);}

3.4 实现示例

/**
* 添加多边形
* @param imgFile
* @return
* @throws Exception
*/
public static BufferedImage addPolygon(String imgFile) throws Exception {BufferedImage image = ImageIO.read(new File(imgFile));Graphics g = image.getGraphics();int px2[]={100,480,470,480,240,100,110,100};int py2[]={155,175,185,395,315,185,175,155};g.setColor(Color.red);g.drawPolygon(px2,py2,8);return image;
}

四 处理结果写入word

4.1 参数转换

接下来回到另一个关键问题:图片处理结果怎样写入word? 先回顾一下上一篇的内容:

run.addPicture 接收的参数依次为:图片的 InputStream 流,图片类型,图片名称(非文件名),图片宽度、图片高度。通过这个方法,我们就可以把图片插入到指定的表格中,并设置图片的宽高属性。

对于图片输入,addPicture要求的参数是InputStream,而我们上面的图片处理结果,是BufferedImage。显然是无法直接插入到word的Cell中的。那么该怎么办? 两种方法,要么另寻出路,看是否有图片处理完成的结果是InputStream;要么就是想办法把BufferedImage转成InputStream。

写到这里,我想起了一句话:『当手里有锤子,看什么都像钉子』。这句话本来是说容易养成思维定势,但在现实中,如果我们看到的东西限制在某些场景,例如金属制品,那么当我们的需求是把其他东西固定住时,考虑用手中的锤子把已有的材料加工成钉子来达到目的也未尝不可,尽管可能不是最佳的方法。当然,这种尝试并不是盲目的,而是在目标明确,且对材料和手中的工具有一定了解的情况下。

话说回来,BufferedImage本身也是一种流的结构,那么就存在着转为ImputStream的可能。

4.2 代码实现与示例

将BufferedImage转换为InputStream,亲测可用 这篇文章就给出了解决方法,所以采用了这段代码加以实现:

/*** 将BufferedImage转换为InputStream* @param image* @return*/
public static InputStream bufferedImageToInputStream(BufferedImage image){ByteArrayOutputStream os = new ByteArrayOutputStream();try {ImageIO.write(image, "png", os);InputStream input = new ByteArrayInputStream(os.toByteArray());return input;} catch (IOException e) {e.printStackTrace();}return null;
}

通过这种方式,结合Graphics对图片的处理,得到的word导出结果如下图所示:

五 总结

在日常开发中,经常会遇到各种问题。排除不合理需求,解决困难的技术问题,保证项目的按时保质完成也是我们作为开发者的几项重要职责。在解决问题的过程中,明确目标、识别关键问题、搜索能力、问题拆解和解决能力都很重要。所谓的『经验』,就是在日常大大小小的考验过后沉淀下来的各项能力,而不只是经历。这点需要特别注意,与大家共勉。

公众号:程序员架构进阶,欢迎您的关注和留言

Java 操作 Office:POI之word图片处理相关推荐

  1. 使用Java操作office的案例

    前言 在Web领域开发人员会经常遇到操作office的项目需求,作为Web领域占比较高的编程语言Java而言,更是如此.比如生成Word.导出Excel.Word转PDF(这个操作主要是为了能够使用户 ...

  2. InfoQ: 用Java操作Office 2007

    原文地址:http://blog.csdn.net/smartcat86/article/details/1854932 用Java操作Office 2007 作者 Ted Neward译者 张立 发 ...

  3. JAVA - 使用Apache POI生成word(二) 设置纸张大小、调整纸张方向

    JAVA - 使用Apache POI生成word(二) 设置纸张大小.调整纸张方向 前言 之前开发时,需要将纸张方向由纵向改为横向,查询资料得出只需要设置一下纸张的长度与宽度便可实现相同的效果. 1 ...

  4. JAVA - 使用Apache POI生成word(三)设置页边距

    JAVA - 使用Apache POI生成word(三)设置页边距 1. pom引入依赖 <dependency><groupId>org.apache.poi</gro ...

  5. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  6. Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...

    在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...

  7. java操作office表格(POI与easyExcelg)

    文章目录 1.POI与easyExcelg概述 2.POI-Excel写入 3.POI-Excel读取 4.EasyExcel操作 1.POI与easyExcelg概述 概述 开发中经常会设计到exc ...

  8. Java操作office文件的选择

    2019独角兽企业重金招聘Python工程师标准>>> 笔者在这里所述的信息均是从网上搜索聚合而来,有些是亲身做过验证的,有些不符合笔者需求,所以也没有浪费太多时间去做无用功,有需要 ...

  9. java将office文档,word,ppt,pdf文档转换成swf文件在线预览

    java将office文档pdf文档转换成swf文件在线预览 第一步,安装openoffice.org openoffice.org是一套sun的开源office办公套件,能在widows,linux ...

  10. Java操作office 2007文档

    我们希望将Office 2007平台作为一个构建富客户端应用程序的基本平台,并通过不同的手段使用Java来进行互操作. 但是,有一个Office/Java互操作的方面没有考虑到,那就是使Office和 ...

最新文章

  1. linux怎么创建用户教程,在Linux中如何手动创建一个用户
  2. Web3.js 0.20.x API 中文版翻译
  3. CentOS 7.3 安装MySQL--Java--Tomcat
  4. linux实战应用案例: 如何在 Linux 安装 MySQL 8 数据库?(图文详细教程)
  5. 函数的递推matlab,关于递推最小二乘法辨识参数的matlab编程(含注释)
  6. 服务器辐射大还是显示器辐射大,显示器一直被吐槽辐射大_液晶显示器_液晶显示器应用技术-中关村在线...
  7. 目标检测常用数据集格式
  8. yearProgress.vue
  9. java缩写_Java学习-Java缩写词的意思
  10. Service Broker实现发布-订阅(Publish-Subscribe)框架
  11. 机器学习常用库速查表 文献收藏
  12. arcgis api for js 下载(各版本最全面的地址)
  13. 长沙北大青鸟:北大青鸟培训学士后课程让大学生重回就业春天
  14. html属于编程语言,HTML编程语言
  15. Java中使用多态的好处和弊端及其举例
  16. windows操作系统服务器 网卡速度关联项
  17. 总结归纳erf与erfc
  18. 快来和网红 ChatGPT 聊天!!
  19. 关于设备像素比dpr的理解
  20. Docplex入门(1)——线性规划

热门文章

  1. 怎么出家ajax假死状态,Ajax如何解决假死?
  2. 母亲节活动策划方案PPT模板
  3. 警惕针对SQL的爆破攻击,入侵者会完全控制服务器,挖矿只是小目标
  4. 英文邮件中常见的英语缩写
  5. 我被老板炒鱿鱼了!因为我在IDE里看漂亮小姐姐跳舞!(IntelliJ IDEA插件开发之打造炫酷动态背景墙)
  6. spring data jpa 动态查询Specification(包括各个In、like、Between等等各种工具类,及完整(分页查询)用法步骤(到返回给前端的结果))
  7. LaTeX技巧014:实现圆圈形状的脚注
  8. 齿轮 matlab,齿轮传动的MATLAB软件建模及轻量化设计.pdf
  9. Mon Aug 29 00:25:18 2016 Suspending MMON slave action kewrmafsa_ for 82800 seconds
  10. Tilera吴晓东:2013年要做成三百多个核