Java使用模板打印文档记录

      前段时间做了一个打印文档的功能,没有接触过,开始也是走了许多冤枉路,特此将打印word文档的简单实现的过程记录下来。

     首先,第一步,我们先创建一个模板,新建一个word文档,命名为,填入我们想要打印的内容。

将其另存为xml格式

Notepad是无法格式化此文件的,我们可以用idea来打开他,并格式化。

这里就是我们需要传入的值的位置,那么,关于word的xml文档标签的含义,可以去看

https://blog.csdn.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>

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值