前端时间需要实现一个能设计固定文档的格式的系统,系统目的是想实现一个类似于在线office的功能,但是要预设文档格式。
开始的第一步就是先确定要怎么样才可以导出.doc文档,根据我的了解大概有以下几种方式:
因为Deadline在即,这个项目结构的层次说实话我自己也觉得有点乱七八糟。。。
大概总结一下在这个项目中的几个功能,代码和演示页面我会在结尾贴出来。
用Freemarker输出文档的话首先需要先准备一个.ftl的模板文件。首先先打开word,将文字的样式先设置好,然后需要接收参数的地方用${参数名}来替换,就像下图这样:
然后把这个文档保存为.xml格式,用文本编辑器打开,要确保${参数名}不能被隔开,否则参数内容没办法正常替换。然后如果要插入图片的话可以在插入位置预先随便放一张图片,然后在xml中把
将改好的.xml文件后缀名改成.ftl放在项目路径下,我是在resources里面新建了一个template1来放这个模板文件。写一个用于导出的工具类ExportUtil。
package com.homewin.util;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;
public class ExportUtil {
private Configuration configuration;
private String encoding;
public ExportUtil(String encoding) {
this.encoding= encoding;
configuration = new Configuration(Configuration.VERSION_2_3_22);
configuration.setDefaultEncoding(encoding);
configuration.setClassForTemplateLoading(this.getClass(), "/template1");
}
//载入模板文件
public Template getTemplate(String name) throws Exception {
return configuration.getTemplate(name);
}
//将图片转化成BASE64编码类型
public String getImageStr(InputStream is) throws IOException {
BASE64Encoder encoder = new BASE64Encoder();
byte[] data = new byte[is.available()];
is.read(data);
is.close();
return encoder.encode(data);
}
//生成文档
public void exportDoc(String doc, String name,Map dataMap) throws Exception {
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(doc), encoding));
getTemplate(name).process(dataMap, writer);
writer.flush();
writer.close();
}
}
要调用的话就可以这样写
ExportUtil exportUtil = new ExportUtil("UTF-8");
File image1 = new File("D:/test/cover.jpg");
Map dataMap = new HashMap<>();
dataMap.put("title","你想要插入的标题");
try {
dataMap.put("image1", exportUtil.getImageStr(new FileInputStream(image1)));
} catch (IOException e) {
e.printStackTrace();
}
String path = "D:/test/";
exportUtil.exportDoc(path + word_name + ".doc", "templatez.ftl", dataMap);
就能够在对应路径下创建出新的文档,要注意的是,同名文档的话会直接覆盖原文档。还有就是如果传入的字符串内有换行符的情况下,想要文档内容也换行的话可以这样写。
//这个a1_1是一个带换行符的字符串
dataMap.put("a1_1", a1_1.replaceAll("\r\n", ""));
还有就是网页想要预览上传图片的话可以这样写
这样上传图片可以在label这个标签里显示,效果大概是这样。
上传之后:
因为之前有写过一个邮箱验证的demo,这次就试一下短信验证码,这种短信发送平台其实很多,也不太知道差别在哪里,就选了一个注册送180条短信的平台——云之讯全能力通讯开发平台。不知道现在还有没有这个活动,建议如果是自己玩的话可以选个优惠一些的平台。各个平台会提供对应的api和demo等等,上手也很简单。
项目代码我放在了github上:https://github.com/homewin21/ExportWord,只需要改一下数据库用户名密码就可以正常使用,数据库表字段和entity内的User类和Word类的属性映射一致。如果也是云之讯平台的话,修改config.properties内的属性,要是其他短信平台的话可以重写一下MailUtil这个类,然后在调用验证码的地方改一下就可以了。
运行页面我放在了服务器上,有的改动还没有同步上去,效果其实是差不多就这样了。
很久都没有写博客了,在写项目的时候有遇到不少问题,看了不少前人写的博客,都给了我很多帮助和启发。说实话现在这个水平还没办法写出那种技术性强,结构整洁清楚的博客,但是我希望以后如果接触比较有意思的东西或者学到一些新知识都能够有时间写一个博客总结一下。虽然说实话整个文章都很抽象,还是留着吧,希望以后自己能看到这篇博客!