java关于ftl模板⽣成html以及word(实现在线预览、编辑功
能)
问题描述:
最早试过了xml模板⽣成word,虽然⽂件格式保留的多,但是这种模板⽣成的word转html,⽤单纯的poi中的XWPFDocument、HWPFDocument是有问题的,因为word本质上还是xml,xml转html,poi是暂时不⽀持的,⽽且,除了上述的问题外,xml模板的语⾔很少有java去学习,⼀旦涉及到模板的调整,⼀般都是花费很⼤⼒⽓都很难改成功的,基于上述的情况,我并没有采⽤这种⽅法。
后来试过了zip中提取l的形式,再将动态的xml最后压缩进zip源⽂件中,但是发现,维护成本加⼤,需要⼀个word和⼀个xml来进⾏维护,调整格式总是需要兼顾word模板,⽽且word转html还是有poi出现的问题,虽然可以⽣成docx格式的⽂件,但是还是⽆法应对需求
当然⽤Jacob也是可以的,不过因为Jacob的要求需要在windows系统上,所以只能pass掉
为了实现ftl转word和html,转化之后,在富⽂本中进⾏编辑修改,保存再次转化成word,实现⽂件的在线编辑和预览功能,采⽤了如下的操作⽅法
1、⽣成html模板
原始的word,通过⽂件->另存为
⽣成的⽂件为格式并不是utf-8,需要转码⼀下,这⾥直接⽤notepad++菜单栏中的Encoding直接转为utf-8编码即可
删除掉图⽚中绿⾊部分的xml代码,且修改<meta http-equiv=Content-Type  content="text/html; charset=gb2312" >中的charset为utf-8,且⽂件名称后缀修改为.ftl格式
需要动态的内容可以将ftl的内容动态化,参考freemark的语法
2、springboot配置freemark解析
需要引⼊的jar:
<!-- freemarker -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在application.properties⽂件中配置freemarker
#freemarker
plate-loader-path=classpath:/templates/
spring.freemarker.charset=utf-8
spring.freemarker.cache=false
spring.freemarker.suffix=.ftl
项⽬如果启动不起来,可能是spring-boot-starter-freemarker中引⼊的jar出现了冲突,重复引⼊,需要排除重复的jar,需要注意
3、ftl⽣成html和word
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.StringWriter;
import java.util.Map;
import java.io.FileOutputStream;
plate.Configuration;
plate.Template;
slf4j.Slf4j;
import org.apachemons.lang.StringEscapeUtils;
import org.apachemons.lang.StringEscapeUtils;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.web.util.HtmlUtils;
/**
* @FileNName: WordUtil
* @Description: word操作⼯具类
* @Author: guoxingliang
* @Create: 2019-08-16 17:08
* @Copyright: (c)2018年 ***公司
*/
@Slf4j
public class WordUtil {
private WordUtil() {}
/**
* @param content      页⾯内容
* @param filePath    ⽂件⽣成的⽬标路径,例如:D:/wordFile/
* @param fileName    ⽣成的⽂件名称,例如:test.doc
* @Desc:⽣成word⽂件
* @Author:guoxingliang
* @Date:2018-8-22下午05:33:42
*/
public static void createWord(String content, String filePath, String fileName) {
try {
//输出⽂件
File outFile = new File(filePath + File.separator + fileName);
//如果输出⽬标⽂件夹不存在,则创建
if (!ParentFile().exists()) {
}
content = HtmlUtils.htmlUnescape(StringEscapeUtils.unescapeHtml(content));
//格式化html
byte[] by = Bytes();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(by);
POIFSFileSystem poifsFileSystem = new POIFSFileSystem();
DirectoryEntry directory = Root();
DocumentEntry documentEntry = ateDocument("WordDocument", byteArrayInputStream);            FileOutputStream fileOutputStream = new FileOutputStream(filePath + File.separator + fileName);
poifsFileSystem.writeFilesystem(fileOutputStream);
byteArrayInputStream.close();
fileOutputStream.close();
} catch (Exception e) {
<("word create fail, exception:", e);
}
}
/**
* @param dataMap      word中需要展⽰的动态数据,⽤map集合来保存
* @param templateName word模板名称,例如:test.ftl
* @Desc:⽣成html⽂件
* @Author:guoxingliang
* @Date:2018-8-22下午05:33:42
*/
public static String createHtml(Map dataMap, String templateName) {
try {
//创建配置实例
Configuration configuration = new Configuration();
//设置编码
configuration.setDefaultEncoding("UTF-8");
//ftl模板⽂件统⼀放⾄ plate 包下⾯
configuration.setClassForTemplateLoading(WordUtil.class, "/templates");
//获取模板
//获取模板
Template template = Template(templateName);
//将模板和数据模型合并⽣成⽂件
StringWriter stringWriter = new StringWriter();
//⽣成html
template.process(dataMap, stringWriter);
String();
} catch (Exception e) {
<("html create fail, exception:", e);
}
return null;
}
}
4、html字符串转码
由于html字符串中存在很多的特殊字符,⽐如说\t,\n,\r以及空格回车双引号,为了好处理,这⾥我进⾏了⼀些代码转化
加密:
解密:
StringEscapeUtils.unescapeHtml(htmlStr);
replaceBlank⽅法:
public static String replaceBlank(String str) {
String dest = "";
if (str!=null) {
java修改html文件
Pattern p = Patternpile("\t|\r|\n");
Matcher m = p.matcher(str);
dest = m.replaceAll("");
}
return dest;
}
<!-- StringEscapeUtils所需要引⼊的依赖 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
注:上述⽅法虽然可以实现功能,但是暂未涉及到图⽚、页眉页脚等复杂格式的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。