使用java poi 替換word模闆裡面的内容
- 需求背景
- 功能實作
-
- 對模闆進一步加工,友善我們程式處理
- java代碼
- 驗證
需求背景
業務提供了一個word的簽名模闆,要求根據訂單内容替換模闆中的關鍵資訊,需要替換的内容已明确。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zZihGbXpVbk1mYwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5kDNwUzM1MTM5ITMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
功能實作
對模闆進一步加工,友善我們程式處理
第一步,我們需要做的就是對模闆進行進一步加工處理,将替換的内容使用固定的标簽标志。如下圖所示
(使用${}來聲明關鍵詞的原因是為了友善檢視和防止原文中有相同的單詞,類似freemark的标簽,非必須的,可根據自己需要加工即可)。
java代碼
@Override
public File generateAttorneySignatureFile(Map<String, String> dataMap) throws IOException {
File exportFile = new File("D:\\tmp\\written+form-模闆标記1.doc");
InputStream ins = new FileInputStream(new File("D:\\tmp\\written+form-模闆标記.doc"));
HWPFDocument document = new HWPFDocument(ins);
// 讀取word的文本内容
Range bodyRange = document.getRange();
// 根據第二部加工的key進行替換
for (Map.Entry<String, String> entry : dataMap.entrySet()) {
bodyRange.replaceText("${" + entry.getKey() + "}", entry.getValue());
}
//寫入新檔案
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.write(byteArrayOutputStream);
OutputStream outputStream = new FileOutputStream(exportFile);
outputStream.write(byteArrayOutputStream.toByteArray());
outputStream.close();
} catch (IOException e) {
Logs.error(e.getMessage(), e);
}
return exportFile;
}
驗證
執行以下代碼,進行驗證,得到的新的簽名文檔内容如圖所示:
Map<String, String> map = new HashMap<>();
map.put("markName", "HE OR SHE");
map.put("markType", "markType");
map.put("applyName", "FeianlING");
wordExportService.generateAttorneySignatureFile(map);
done