写代码之前先说说遇到的问题,之前word模板是使用poi 3.9的包实现的,之后又写了exlce上传下载的功能使用的是poi 4.11的版本,他们之间融合的时候发现包冲突,总有一个功能不能使用,之后发现poi 4 之后把一些poi 3支持的方法直接放弃了,导致之前好用的功能不好用。为了看poi4.11版本如何操作word模板网上找了很多资料没有一个可以直接拿来用的,后来又通过各种调试修改终于搞成了。输入的文本只能是.docx,生成的可以是.docx也可以是.doc。

操作word模板文本和表格还不是一个方法,新版本设置个字体都挺费劲,网上可用的资料太少了。废话不说了直接上代码

注:实际的操作中有的时候会发现 ${name} 这样一个标记为有的时候会被代码认成是 ${、name 、} 这三个字符导致替换失败,解决办法是,把${name}写在txt里然后直接粘贴在word里,不要在word里手敲${name} ,这真是个坑人的点。

一、pom.xnl

依赖的核心包

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

二、代码

public class WordDoUtil {

    public static void main(String[] args) {

        System.out.println("path:"+System.getProperty("user.dir").toString());

        Map map=new HashMap();
map.put("${name}","张三");
map.put("${num}","123456");
map.put("${agree}","■");
map.put("${refuse}","□");
map.put("${ha}","11111");
getBuild("doc/在校证明.docx",map,"D:/在校证明1.doc"); } public static void getBuild(String tmpFile, Map<String, String> map, String exportFile){ XWPFDocument document = null;
try {
document = new XWPFDocument( POIXMLDocument.openPackage(System.getProperty("user.dir").toString()+"\\"+tmpFile)); } catch (IOException e) {
e.printStackTrace();
}
// 替换段落中的指定文字
Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
while (itPara.hasNext()) {
XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
String s = paragraph.getParagraphText();
System.out.println("s:"+s); Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
List<XWPFRun> run=paragraph.getRuns();
for(int i=0;i<run.size();i++)
{
if(run.get(i).getText(run.get(i).getTextPosition())!=null && run.get(i).getText(run.get(i).getTextPosition()).equals(key))
{
/**参数0表示生成的文字是要从哪一个地方开始放置,设置文字从位置0开始
* 就可以把原来的文字全部替换掉了
* */
run.get(i).setText(map.get(key),0);
}
}
}
}
// 替换表格中的指定文字
Iterator<XWPFTable> itTable = document.getTablesIterator();
while (itTable.hasNext()) {
XWPFTable table = (XWPFTable) itTable.next();
int rcount = table.getNumberOfRows();
for (int i = 0; i < rcount; i++) {
XWPFTableRow row = table.getRow(i);
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
String tempText = cell.getText();
int have = 0;
for (Map.Entry<String, String> e : map.entrySet()) {
if (tempText.contains(e.getKey())) {
have =1;
tempText = tempText.replace(e.getKey(),e.getValue());
}
}
if(have ==1) {
cell.removeParagraph(0);
//------------设置字体式样-----
XWPFParagraph pIO =cell.addParagraph();
XWPFRun rIO = pIO.createRun();
rIO.setFontFamily("楷体");
rIO.setFontSize(9);
rIO.setText(tempText);
//这样写格式没用
// cell.setText(tempText);
}
}
}
}
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(exportFile);
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace();
} }
}

poi 4.11版本 word模板操作的更多相关文章

  1. C# 后台模块 Word 模板操作

    public static string CreateWord() { //********************************************** //来自博客http://bl ...

  2. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  3. jar word 模板操作比较好用的工具

    个人觉得比较好用的java word 模板 http://deepoove.com/poi-tl/

  4. Open Xml SDK Word模板开发最佳实践(Best Practice)

    1.概述 由于前面的引文已经对Open Xml SDK做了一个简要的介绍. 这次来点实际的——Word模板操作. 从本质上来讲,本文的操作都是基于模板替换思想的,即,我们通过替换Word模板中指定元素 ...

  5. POI不同版本替换Word模板时的问题

    一.问题描述 通过POI,把Word中的占位符替换为实际的值,以生成复杂结构的业务报告. 在POI 3.9上,功能正常.由于某些原因升级到POI 3.10.1后,项目组反馈说Word模板出错,无法生成 ...

  6. 使用java Apache poi 根据word模板生成word报表

    项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...

  7. POI Word 模板 文字 图片 替换

    实验环境:POI3.7+Word2007 Word模板: 替换后效果: 代码: 1.入口文件 public class Test { public static void main(String[] ...

  8. JAVA Asponse.Word Office 操作神器,借助 word 模板生成 word 文档,并转化为 pdf,png 等多种格式的文件

    一,由于该 jar 包不是免费的, maven 仓库一般不会有,需要我们去官网下载并安装到本地 maven 仓库 1,用地址   https://www-evget-com/product/564  ...

  9. C#操作word模板插入文字、图片及表格详细步骤

    c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.W ...

  10. Csharp 简单操作Word模板文件

    原文:Csharp 简单操作Word模板文件 1.创建一个模板的Word文档  Doc1.dot 内容为: To: <Name> Sub:<Subject> Website i ...

随机推荐

  1. 掌握这些,轻松管理BusyBox:如何交叉编译和集成BusyBox

    在嵌入式系统中,由于设备的资源限制,需要开发人员寻找一种轻量.小型且使用广泛的工具集.而 BusyBox 就是这样一个在嵌入式系统中非常实用的工具集.本文将介绍如何在 Ubuntu 22.04 平台上 ...

  2. 基于python的Linux服务器资源监控

    介绍 项目地址: https://github.com/leeyoshinari/performance_monitor 已完成如下功能 1.监控整个服务器的CPU使用率.io wait.内存使用.磁 ...

  3. Git恢复删除的文件,一行命令就可以啦~

    情况一:删除或者修改了某个文件,但是没有add # 单个 git checkout filename # 多个 git checkout . 情况二:删除或者修改了某个文件,已经add,但是没有com ...

  4. 在CentOS安装BIND,把所有DNS请求日志转发到syslog服务器去

    在CentOS安装BIND,把所有DNS请求日志转发到syslog服务器去 在vim /etc/named.conf里配置的内容 logging { channel default_debug { f ...

  5. Ubuntu修改root可以远程ssh

    默认情况下,Ubuntu系统不允许root远程登录,新建的系统root密码为随机密码,你不会知道首次ssh登录需要用自建用户远程登录,登录后提示如下: seafile@seafile:~$  是以 ~ ...

  6. DVWA File Upload(文件上传)全等级

    File Upload(文件上传) 目录: File Upload(文件上传) 一句话木马的构成 1. Low 1.上传一句话木马1.php 2.中国蚁剑 2.Medium 3. High 4.Imp ...

  7. [Luogu 4998 信号塔] 题解报告

    估计没人看的简化版题意: 给定一个数轴,以及数轴上的 \(n\) 个点(这些点可能坐落在同一坐标上),第 \(i\) 个点的坐标为 \(a_i\) .现在要在数轴上找 \(k\) 个点,第 \(i\) ...

  8. Angular 集成 Material UI 后组件显示不正常 踩坑日记

    在使用了 npm 下载 Material 后, 项目不能正常使用 Material 组件, 随后又使用官方命令使用 Material 组件, 仍然不能正常使用 Material 组件. npm 命令 ...

  9. 【scikit-learn基础】--『监督学习』之 支持向量机分类

    支持向量机也是一种既可以处理分类问题,也可以处理回归问题的算法.关于支持向量机在回归问题上的应用,请参考:TODO 支持向量机分类广泛应用于图像识别.文本分类.生物信息学(例如基因分类).手写数字识别 ...

  10. Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 - type关键字和string类型

    本系列旨在介绍Json Schema的常见用法,以及.net实现库Lateapexearlyspeed.Json.Schema的使用 这篇文章将介绍Json Schema中的type关键字,和stri ...