java word模板 变量,Java-POI替换Word模板文档中的变量,生成Word文档
第一步:在项目中导入POI的jar包,以及相关的jar包。
所需的jar包列表:
下载地址:http://download.csdn.net/download/qq_34908167/10046670
第二步:建立util工具类。
public class DocxUtil{
/**
* @Description: 将t中的字段转换成替换模板需要的数据${字段}-->字段值
* 在word模板中变量为${valuename},为每个值建一个以‘${valuename}’为键,‘value’为值的Map集合,
* 利用键去和Word模板中寻找相等的变量
*/
public MapcopyParamFromBean(T t, Mapparams) {
Field[] fields = t.getClass().getDeclaredFields();
String key;
String value;
for (Field field : fields) {
String fieldName = field.getName();
key = "${" + fieldName + "}";
String name = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
try {
value = String.valueOf(t.getClass().getMethod(name).invoke(t));
params.put(key, value);
} catch (Exception e) {
e.printStackTrace();
}
}
return params;
}
/***
*替换Word模板中的对应变量。
*两种情况:1-段落中的变量。 2-表格中的变量
*/
public static void searchAndReplace(XWPFDocument document,Mapmap) {
try {
// 替换段落中的指定文字
IteratoritPara = document.getParagraphsIterator();//获得word中段落
while (itPara.hasNext()) { //遍历段落
XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
Setset = map.keySet();
Iteratoriterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Listrun=paragraph.getRuns();
for(int i=0;iitTable = document.getTablesIterator();//获得Word的表格
while (itTable.hasNext()) { //遍历表格
XWPFTable table = (XWPFTable) itTable.next();
int count = table.getNumberOfRows();//获得表格总行数
for (int i = 0; i < count; i++) { //遍历表格的每一行
XWPFTableRow row = table.getRow(i);//获得表格的行
Listcells = row.getTableCells();//在行元素中,获得表格的单元格
for (XWPFTableCell cell : cells) { //遍历单元格
for (Entrye : map.entrySet()) {
if (cell.getText().equals(e.getKey())) {//如果单元格中的变量和‘键’相等,就用‘键’所对应的‘值’代替。
cell.removeParagraph(0);//所以这里就要求每一个单元格只能有唯一的变量。
cell.setText(e.getValue());
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关闭输出流
*
* @param os
*/
public void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
第三步:在项目的对应目录下放入Word模板。
这里给出我的Word模板:http://download.csdn.net/download/qq_34908167/10046772
第四步:导出Word的java实现。
public String exportDoc(){
XWPFDocument doc = null;
OutputStream out = null;
FileInputStream in = null;
DocxUtil docxUtil = null;
try {
String rootPath = "";
ServletContext context = servletRequest.getSession().getServletContext();
String studentId = this.servletRequest.getParameter("studentid");//得到页面的参数
RankExportDocVO docVo=null;
if (studentId!=null) {
rootPath = context.getRealPath("/docmodel/PG/RankPrintAll_WordTemplate.docx");//Word模板所在的路径
docVo = rankPrintService.queryStudentInfo((studentId);//调用service得到对应的VO类
}else{
throw new Exception("传输字段为空!");
}
Mapparams = new HashMap();
docxUtil = new DocxUtil();
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(rootPath));//读取Word模板
docxUtil.copyParamFromBean(docVo, params);//调用DocxUtil中的copyParamFromBean方法,为VO的每个值建立“${valuename}”键
docxUtil.searchAndReplace(document, params);//替换模板中的对应变量。
// 清空response
this.servletResponse.reset();
// 设置response的Header
String userAgent = this.servletRequest.getHeader("User-Agent");
String realname = "学生信息文档_"+docVo.getXm()+".docx";//最终导出文档的新文档名
if (userAgent.contains("Firefox")) {
// 采用BASE64编码
realname = "=?UTF-8?B?" + new BASE64Encoder().encode(realname.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器 IE 、google 采用URL编码
realname = URLEncoder.encode(realname, "utf-8");
realname = realname.replace("+", " ");
}
servletResponse.setHeader("Content-Disposition", "attachment;filename=" + realname);
String minitype = ServletActionContext.getServletContext().getMimeType(realname);
servletResponse.setContentType(minitype);
out = this.servletResponse.getOutputStream();
document.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != docxUtil) {
docxUtil.close(out);//关闭流
}
}
return null;
}
这就是利用Java-poi技术导出Word文档的全部步骤。
这样的好处,就在于我们可以根据需求制定我们需要的Word样式。
后语
注意事项:
1:Word模板中,表格的单元格的变量必须是唯一的,如果需要多个变量,我们可以利用word的隐藏表格功能,
来实现视觉上的一个单元格有多个变量的效果。
2:Word模板中的变量左右不能有空格,不然不能识别。
3:都 9102 年了,还在看java-poi吗?去看看我的另外一篇使用freemaker来根据模板定制word文档的博文吧:
Java-Freemarker替换模板文件.ftl中的变量,生成Word文档
-----------------------------------------------------------------------------------------不关注我“象话”吗?(哈哈,逗比)
java word模板 变量,Java-POI替换Word模板文档中的变量,生成Word文档相关推荐
- Java-POI替换Word模板文档中的变量,生成Word文档
第一步:在项目中导入POI的jar包,以及相关的jar包. 所需的jar包列表: 下载地址:http://download.csdn.net/download/qq_34908167/10046670 ...
- 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你
在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...
- php访问父类变量,php – 如何使用parent :: method访问父类中的变量
我在Parent Class.i中有受保护的变量UserId我将在我的子类中扩展变量,如下所示 class Main { protected $UserId = "151"; pr ...
- java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...
个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法 ``` /** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队 ...
- java导出生成word文档_java使用freemarker 生成word文档
最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式--- ...
- Java Web项目中使用Freemarker生成Word文档
Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...
- Java项目中使用Freemarker生成Word文档
Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...
- java web 操作word文档_Java Web项目中使用Freemarker生成Word文档
Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...
- 利用freemarker 在模板里面写入动态数据,动态表格,图片插入并生成word文档
利用freemarker 在模板里面写入动态数据,动态表格,图片插入. 以下测试代码图片(image.jpg)和模板(template.xml)是直接放到src目录下面的,可以根据自己需求调整 废话不 ...
- php打开word文档_PHP使用phpword生成word文档
写在前边的话 使用phpword生成文档有两种方式 直接使用代码编写word文档,用代码生成word,但是设置样式,格式,图片非常麻烦,不建议使用.如果客户或产品提供一份word的样式,我们也难以完全 ...
最新文章
- idea类模版,创建时生成一句歌词
- sqlserver启用登陆审计
- 实现连麦_直播课程系统如何实现互动连麦效果?
- C语言实现1~100的和(三种循环)
- Molile App(HTTP/HTML)—Record and Analyze Traffic
- [转]使用Visual C#制作可伸缩个性化窗体
- Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
- 使用jmeter做接口测试----柠檬不萌!
- 通过MDaemon自带功能,实现同部门用同一账号对外收发邮件
- 必备的海外贸易沟通工具 - intbell使用教程
- 高阶常微分方程的求解
- 快速切换node版本
- 可靠性工程师是做什么的?需要哪些能力?
- 软件图形用户界面设计
- APP行业基准营销数据怎么获取?快用这两个免费应用数据工具
- 如何将苹果手机中的M4A音乐转换为MP3格式 1
- I Need Some Sleep / Eels
- 1079. 活字印刷
- 网络管理系统、网管、network manage system、运维系统
- Error (171173): Node xxxx from partition Top cannot preserve previous placement at PIN D16 and honor