JAVA編輯word替換指定內容,解決插入圖片顯示不全問題

hello龙兄發表於2024-07-15

在開發過程中,我們可能會遇到需要生成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來獲取圖片的尺寸大小。

這樣就解決了插入圖片顯示異常的問題了。

相關文章