首页 > 编程语言 >JAVA编辑word替换指定内容,解决插入图片显示不全问题

JAVA编辑word替换指定内容,解决插入图片显示不全问题

时间:2024-07-15 17:20:37浏览次数:8  
标签:word text 不全 value key JAVA 行距 图片

在开发过程中,我们可能会遇到需要生成word,或者通过模板word替换相应内容的需求。但在文档中插入图片时,如果段落格式设置不对,就会导致图片只显示一点点或者不显示。接下来就介绍一下java编辑word和插入图片需怎么处理。

1.引入依赖

首先我们在项目中引入Apache POI,用于读取和操作word,这里我使用的版本是4.1.2,版本可以根据项目需求自己选择。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>    

2.编辑word

这里是通过模板加入占位符,然后替换占位符的内容

首先我们打开word模板文件

String path = "***.docx";
File file = new File(path);
try {
    XWPFDocument template = new XWPFDocument(new FileInputStream(file));
    // 替换内容
    XWPFDocument outWord = PoiWordUtil.replaceWithPlaceholder(template, list);
    return outWord;
} catch (IOException e) {
    log.error("读取模板文件失败", e);
}

替换相应内容

// 这里我定义了Placeholder来封装替换数据public static XWPFDocument replaceTextAndImage(XWPFDocument document, List<Placeholder> list) {    for (XWPFParagraph xwpfParagraph : document.getParagraphs()) {        String paragraphText = xwpfParagraph.getText(        if (StringUtils.isEmpty(paragraphText)) contin        for (Placeholder placeholder : list) {            String key = placeholder.getKey();
            if (paragraphText.contains(key)) {
for (XWPFRun cellRun : xwpfParagraph.getRuns()) {
String text = cellRun.getText(0);
if (text != null && text.contains(key)) {
//获取占位符类型
String type = placeholder.getType();
//获取对应key的value
String value = placeholder.getValue();
if("0".equals(type)){
//把文本的内容,key替换为value
text = text.replace(key, value);
//把替换好的文本内容,保存到当前这个文本对象
cellRun.setText(text, 0);
}else {
text = text.replace(key, "");
cellRun.setText(text, 0);
if (StringUtils.isEmpty(value))
continue;
                            try {
                   // 获取段落行距模式
int rule = xwpfParagraph.getSpacingLineRule().getValue();
// 如果段落行距为固定值,会导致图片显示不全,所以需要改成其他模式
if (LineSpacingRule.EXACT.getValue() == rule) {
// 设置段落行距为单倍行距
xwpfParagraph.setSpacingBetween(1);
}
                   // 获取文件流
                   InputStream imageStream = ImageUtils.getFile(value);
                                if (imageStream == null) continue;
// 通过BufferedImage获取图片信息
BufferedImage bufferedImage = ImageIO.read(imageStream);
int height = bufferedImage.getHeight();
int width = bufferedImage.getWidth();
// 这里需要重新获取流,之前的流已经被BufferedImage使用掉了
cellRun.addPicture(ImageUtils.getFile(value), XWPFDocument.PICTURE_TYPE_JPEG, "", Units.toEMU(width), Units.toEMU(height));
                            } catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
}
return document;
}

在插入图片时,如果段落的行距设置成了固定值,那么在显示图片时只能显示行距大小的部分,所以当插入图片的段落行距为固定值时,我们需要修改为其他模式,这样图片就能正常大小显示。

然后我们使用cellRun.addPicture()来插入图片,这里我们可以通过BufferedImage来获取图片的尺寸大小。

这样就解决了插入图片显示异常的问题了。

 

标签:word,text,不全,value,key,JAVA,行距,图片
From: https://www.cnblogs.com/qq545505061/p/18302543

相关文章

  • java List集合转Map并遍历输出
    1.使用流转map并且遍历packagecom.demo.toMap;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassMianDemo{publicstaticvoidmain(String[]args){List<NodeList>list=......
  • 如何将JPG图片转换成可编辑的word文档?
    在日常办公和学习中,我们时常需要将图片中的文字信息转换为Word文档,以便于编辑、整理和分享。虽然这一过程看似复杂,但实际上有多种方法可以实现。那么图片怎么转换成word文档呢?本文将为您介绍三种常用的方法,帮助您轻松将图片转换为Word文档。方法一:手动输入对于文字量较小或者对......
  • javaweb高校宿舍管理系统|寝室管理[包运行成功+永久免费答疑辅导
    项目功能简介:本项目含代码详细讲解视频,手把手带同学们敲代码从0到1完成项目详细教程学习地址:https://www.bilibili.com/video/BV1V7411M7Et《基于javaweb实现的高校宿舍管理系统》该项目含有源码、文档、答辩ppt、开题报告、代码详细讲解教程等资料、配套开发软件、软件安......
  • Java中55种锁,高级面试题,最新面试题
    Java中乐观锁在实际应用中如何解决并发问题?乐观锁通过假设并发冲突发生概率较低来解决并发问题,主要通过数据版本控制实现。在更新数据前,会检查数据版本是否发生变化,只有在数据版本未变时才允许更新,这样可以避免覆盖其他线程所做的更改。1、数据版本控制:通常给数据增......
  • Java 网络协议面试题答案整理,最新面试题
    TCP和UDP的主要区别是什么?TCP(传输控制协议)和UDP(用户数据报协议)的主要区别在于TCP是面向连接的协议,而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。1、连接方式:TCP是面向连接的协议,数据传输前需要三次握手建立连接。UDP是无连接......
  • 如何免费用java c#实现手机在网状态查询
        今天分享手机在网状态查询接口,该接口适用的场景非常广泛!首先我们先讲下什么是手机在网状态?简单来说,就是你得手机号是否还在正常使用中,是否能够及时接收和回复信息,是否能够随时接听和拨打电话。如果你得手机号处于停机、欠费或者注销的状态,那么你的手机号就处于非在......
  • Java中的泛型是什么?有什么好处?
    在Java中,泛型(Generics)是Java5引入的一项语言特性,允许在定义类、接口和方法时使用类型参数。这些类型参数在实际使用时可以被具体的类型替换,从而提高代码的可重用性和类型安全性。泛型的定义泛型通过类型参数实现,这些类型参数通常用尖括号包围,例如<T>。以下是泛型在类、......
  • Java:什么是异常?一篇让你明白异常
    目录1.什么是异常?2.为什么需要异常处理3.异常处理的类型  3.1try-catch方式  3.2处理多种异常  3.3异常捕获的原理 3.4 异常处理的方式throws4.Exception下常用的api方法5.finally关键字6.throw关键字7.自定义异常1.什么是异常?异常就是程序在运行......
  • JavaSE项目--图书管理系统代码
    结构代码展示Book类代码packagecom.xszx.beans;//实体类publicclassBook{privateintid;privateStringname;privateintbsum;publicBook(){}publicBook(intid,Stringname,intbsum){this.id=id;......
  • Java面试八股之Redis哨兵机制
    Redis哨兵机制RedisSentinel(哨兵)模式是一种高可用解决方案,用于监控和自动故障转移Redis主从集群。以下是对哨兵模式详细过程的描述:1.初始化与配置部署哨兵节点:在不同的服务器上部署一个或多个RedisSentinel节点,它们作为独立进程运行,负责监控Redis主从集群的状态。配置......