文档章节

Velocity+docx4j 模板替换

业余编程人士
 业余编程人士
发布于 2014/01/24 13:25
字数 410
阅读 827
收藏 1

http://kodak-zhou.iteye.com/blog/970682
http://velocity.apache.org/engine/devel/developer-guide.html
http://www.360doc.com/content/11/1203/22/834950_169480722.shtml
http://www.java2s.com/Code/Java/Velocity/VelocityMathToolAdd.htm

import java.io.File;
import java.io.StringWriter;
import java.util.Map;
import java.util.Properties;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Document;

public final class DocumentTemplateUtil {
/**
* Method to do the template merge directly in Ms Word and return the document/xml contents
* The format of replaced content is "$colour";
*
* @param sourceFile  the source file of .docx
* @param templateParams
*        the contents need to be merged  like:{( "color", "Red" )}
* @return A StringWriter contents word/document.xml's contents
*/

@SuppressWarnings("rawtypes")
public static StringWriter getMsWordDocumentXMLString(File sourceFile, Map templateParams) throws Exception {

String result = "";
if (sourceFile != null) {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(sourceFile);
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document)documentPart.getJaxbElement();
String xmlContent = org.docx4j.XmlUtils.marshaltoString(wmlDocumentEl, true);
result = xmlContent;
}

// Initialise enigine injecting basic properties
VelocityEngine ve = new VelocityEngine();
Properties properties = new Properties();
properties.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
properties.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
properties.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
ve.init(properties);

templateParams.put("DateTool", new ComparisonDateTool());
templateParams.put("MathTool", new MathTool());
templateParams.put("NumberTool", new NumberTool());
templateParams.put("EscapeTool", new EscapeTool());
templateParams.put("DisplayTool", new DisplayTool());
templateParams.put("ConversionTool", new ConversionTool());
templateParams.put("LoopTool", new LoopTool()); 

// Template mergering
VelocityContext context = new VelocityContext(templateParams);
StringWriter writer = new StringWriter();
Velocity.init();
Velocity.evaluate( context, writer, "log tag name", result);

return writer;
}

/**
* Method to do the template merge directly in Ms Word and export out to specifc location
* The format of replaced content is "$colour";
*
* @param sourceFile the source file of .docx
* @param templateParams
*        the contents need to be merged  like:{( "colour", "Red" )}
* @param outputPath the location which the file is to be exported to.
*/

@SuppressWarnings("rawtypes")
public static void exportMergedXMLtoDocx(File sourceFile ,String outputPath, Map templateParams) throws Exception {

if (sourceFile != null) {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(sourceFile);
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
StringWriter writer = getMsWordDocumentXMLString(sourceFile, templateParams);

Object obj = XmlUtils.unmarshalString(writer.toString());
documentPart.setJaxbElement((Document) obj);
wordMLPackage.addTargetPart(documentPart);
wordMLPackage.save(new java.io.File(outputPath));
writer.flush();
writer.close();
}
}
}


© 著作权归作者所有

业余编程人士
粉丝 5
博文 19
码字总数 9137
作品 0
其他
程序员
私信 提问
加载中

评论(1)

s
sunnyguohua
你好:

ComparisonDateTool 好像没有啊?

Andy sunnyguohua@163.com
ThinkPHP 模板魔术常量

模板特殊字符串替换 ThinkPHP 系统定义了一些特殊的字符串(常量)以方便在模板中的使用,这些特殊字符串给模板的应用带来了极大的便利。 这些特殊的字符串是在进行模板输出之前有系统自动替...

WangEven
2012/05/11
352
0
开源轻便的PHP模板引擎phptpl,简洁就是美。

phptpl是一个轻便的PHP模板引擎。不需要什么学习成本就能轻松掌握,简洁就是美。 最近想写一个项目管理平台,原来想用自己 搭建的LAPC/F平台来开发,考虑到推广使用的便捷性,最后决定重拾多...

calvinwilliams
2014/02/16
1K
0
springboot使用properties定义短信模板

通常我们做开发时候会遇到短信发送邮件发送之类的需求,发送内容往往会由客户提供一个模板,如果我们是在程序里拼接字符串来搞定这个模板,很明显是一种坑队友的做法。一般将模板放入propert...

梦想修补师
2017/12/30
0
0
使用Freemarker生成Word

场景: 需要通过模板动态生成word,模板中包括普通字符串和表格 实现方法: 需要:Freemarker 下载 1、将word模板另存为xml格式,将需要替换的地方使用标签和指令替换,具体参照Freemarker开...

liweigov
2012/06/26
9.9K
20
apkplug主题皮肤切换之自定义样式-05

本文基于apkplug V1.6.9讲解 一 何为apkplug自定义样式切换 apkplug主题切换包含两个层次 1.通用主题,与系统主题相似 2.自定义控件样式切换 根据上一篇文章讲解我们可以判定通用主题有其局限...

梁大帅
2014/05/26
74
0

没有更多内容

加载失败,请刷新页面

加载更多

黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
3
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
3
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
4
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
昨天
7
0
Vue核心概念及特性 (一)

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 > 特点: 易用,灵活,高效,渐进式框架。 > 可以随意组合需要用到的模块 vue + components + vue-router + vuex + v...

前端优选
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部