poi 4.11版本 word模板操作
写代码之前先说说遇到的问题,之前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模板操作的更多相关文章
- C# 后台模块 Word 模板操作
public static string CreateWord() { //********************************************** //来自博客http://bl ...
- 利用POI 技术动态替换word模板内容
项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...
- jar word 模板操作比较好用的工具
个人觉得比较好用的java word 模板 http://deepoove.com/poi-tl/
- Open Xml SDK Word模板开发最佳实践(Best Practice)
1.概述 由于前面的引文已经对Open Xml SDK做了一个简要的介绍. 这次来点实际的——Word模板操作. 从本质上来讲,本文的操作都是基于模板替换思想的,即,我们通过替换Word模板中指定元素 ...
- POI不同版本替换Word模板时的问题
一.问题描述 通过POI,把Word中的占位符替换为实际的值,以生成复杂结构的业务报告. 在POI 3.9上,功能正常.由于某些原因升级到POI 3.10.1后,项目组反馈说Word模板出错,无法生成 ...
- 使用java Apache poi 根据word模板生成word报表
项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...
- POI Word 模板 文字 图片 替换
实验环境:POI3.7+Word2007 Word模板: 替换后效果: 代码: 1.入口文件 public class Test { public static void main(String[] ...
- JAVA Asponse.Word Office 操作神器,借助 word 模板生成 word 文档,并转化为 pdf,png 等多种格式的文件
一,由于该 jar 包不是免费的, maven 仓库一般不会有,需要我们去官网下载并安装到本地 maven 仓库 1,用地址 https://www-evget-com/product/564 ...
- C#操作word模板插入文字、图片及表格详细步骤
c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.W ...
- Csharp 简单操作Word模板文件
原文:Csharp 简单操作Word模板文件 1.创建一个模板的Word文档 Doc1.dot 内容为: To: <Name> Sub:<Subject> Website i ...
随机推荐
- FreeSWITCH在answer前主动发dtmf
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 NAT环境的主动外呼场景下,会遇到线路侧回铃音数据无法接收的问题,需要FreeSWITCH主动发送RTP数据,发送D ...
- 串ababaaababaa的next和串ababaabab的nextval
这个next求法我看了视频和网上的,发现有两种求法,一种是求最左边和最右边相等的最大个数, 就比如说串ababaaababaa,这个 所以这个3的位置为1,依次下来. 这个唯一要注意的是,是按照你选择 ...
- [ABC299F] Square Subsequence
Problem Statement You are given a string $S$ consisting of lowercase English letters. Print the numb ...
- 异常:Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.qbb.srb.core.mapper.DictMapper.batchInsert
程序报错:Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com ...
- 生成式AI:未来的发展方向是什么?
生成式AI的问世标志着人工智能领域迎来了一个全新时代的开启.今年,ChatGPT的面世引起了广泛的热议和关注,许多人认为这标志着人工智能领域进入了一个大规模探索的时代.然而,事实上,这只是生成式AI发 ...
- 华企盾DSC导致svn、git更新卡、慢常见处理方法
1.svn客户端加密所有网络导致(应勾选其它范围IP不加密,同时在加密地址框里填写加密的端口如:80,443) 2.加密类型太多导致,先试试加密nofile 3.启用文件夹大小缓存导致,去掉该选项试试 ...
- 万界星空科技五金家具企业MES案例介绍
五金家具行业MES解决方案 MES系统如何与家具企业生产相匹配?相较于其它大多数工业软件,MES系统无疑是受企业欢迎的软件之一.MES系统处于制造生产企业信息化的核心领域,有着承上启下的作用.那MES ...
- ElasticSearch之cat recovery API
命令样例如下: curl -X GET "https://localhost:9200/_cat/recovery?v=true&pretty" --cacert $ES_ ...
- 部署堡垒机2——安装MySQL8.0.32或8.0.28+
MySQL的三大版本 a)MySQL Enterprise Edition:企业版本(付费)b)MySQL Cluster CGE:高级集群版(收费)c)MySQL Community Server: ...
- 占位图片(Placeholder Image)
一.引言 在网页设计和开发中,占位图片(Placeholder Image)是一种常见的技术手段,用于在用户上传图片之前或者图片加载失败时,展示一个临时替代的图片,以提高用户体验.本文将详细介绍占位图 ...