Java使用模板打印文档记录
前段时间做了一个打印文档的功能,没有接触过,开始也是走了许多冤枉路,特此将打印word文档的简单实现的过程记录下来。
首先,第一步,我们先创建一个模板,新建一个word文档,命名为,填入我们想要打印的内容。
将其另存为xml格式
Notepad是无法格式化此文件的,我们可以用idea来打开他,并格式化。
这里就是我们需要传入的值的位置,那么,关于word的xml文档标签的含义,可以去看
https://blog.****.net/u010371710/article/details/51966236/
<w:t>表示真正的文本内容
<w:r>表示关系,段落中以相连续的中文或英文字符字符串,作为开始和结束。目的就是要把一个段落中的中英文字符区分开来。
<w:tbl></w:tb1> 表格标签
<w:tc></w:tc> 单元格
在需要我们赋予数据的地方写入占位表达式${value!}
这里的!比较官方的意思记不住了,大概为当传入的数据为空时,便赋予为空。假如不写!,当我们的数据有空值的时候,你是无法打印出一个正常的word文档的,反正我是无法打开他。。。,当然还有其他的方式来防止数据为空出现异常,如下:
<#if (testList)??> 判断数据是否为空,和if作用一样 单数据等同于 !
</#if>
假如数据附带有其他组合件,则可以使用<#if>让不需要的样式和文字隐藏掉
为了简便我选择使用!。
在我们编辑模板的时候,最好使用表格的方式来控制整个文档的样式,防止假如某一个数据量很大,导致整个模板的样式都乱掉,而另一个好处就是是使用表格的形式来进行样式控制,我们能对集合类的数据放置的样式自动增加或减少所在区域的长度,防止数据重叠或者空出一大片白色区域来,显得整个文档更紧凑。
友情提示:最好提前将模板改好再存为xml,否则在加入占位表达式后再修改可能会引起一些些问题。比如样式乱掉。
这里演示使用的一个简单的表格,为了演示,用虚线展示不需要的格子,那实际在项目中不可能会这么简单,可能会包含多种数据、图片、加入图片的组合样式等等,那我们可以在表格中嵌入子表格来完成更多的样式布局排版。
构建数据
Map params=new HashMap();
params.put("school","一个不知名的学校");
params.put("name","王五");
params.put("sex","女");
params.put("age","18");
params.put("chinese","59");
params.put("math","48");
搜索放在项目中的模板,一般位置是固定的
String templateName="test.xml";
String fileName="d:/test.doc";
String templatePath = this.getClass().getClassLoader().getResource(".").getPath();
String proName="ProSys";
int index=templatePath.indexOf(proName);
templatePath=templatePath.substring(0,index+proName.length())+"/target/classes/";
打印
这里用的是freemarker的包
import freemarker.template.Configuration;
import freemarker.template.Template;
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
try {
configuration.setDirectoryForTemplateLoading(new File(templatePath));
Template templet = null;
templet = configuration.getTemplate(templateName, "UTF-8");
File file=new File(fileName);
if(!file.exists()){
file.createNewFile();
}
OutputStreamWriter writer=new OutputStreamWriter(new FileOutputStream(file));
templet.process(params,writer);
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
打印效果为
多条数据,格式为
<#list testList as test>
${test.name!}
</#list>