上1篇博客中讲FreeMarker做了简单的介绍,这篇博客就来使用它来完成两个例子。
在项目中使用它完成的功能是依照固定的模板将数据导出到Word。比如台账。在完成后将处理进程依照台账的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变。
这个功能就是由XML+Freemarder来实现的,Word从2003开始支持XML格式,大致的步骤:用office2003或以上的版本编辑好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。
上1篇博客中提到,使用Freemarker其实就只准备模板和数据。下面的步骤其实概括起来就两步:第1步是制作模板,第2步是准备数据.
具体实现进程如 下:
1、 制作模板
首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,将需要动态填充的内容使用Freemarker标签替换:Word文档样式以下:
将Word文档另存为XML格式,将后缀名“xml”修改成“ftl”,模板制作完成
图片处理:
我们可以看到上面的模板中有图片,当我们将xml修改成ftl以后打开文件可以看到原来图片的位置全部都是乱码。这是由于ftl不能够辨认图片,我们只要将这些乱码用${image}替换掉既可以了。
循环处理:
模板中明细表中的数据是1个集合,我们需要循环遍历才能够将数据全部注入,这个时候我们就会用到了FreeMarker本身的语法了。
循环:
<#list array as bean>
${bean.property}
</#list>
代码放在表格的开头和结尾,也即是将表格中的标签包括在循环里面,这模样就能够了。
在制作模板的进程中遇到的1个问题:${xxx}这些标记在ftl中被拆成1个1个的,让我很无语。最后我还是手动的将这些又重新拼到1起了。
2. 准备数据,将上面模板中的${}的标签放上对应的数据
首先要讲freemarker的jar包放到程序中,然后将上面制作好的模板放到程序中;
最后加上下面的代码就能够了
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;
public class DocumentHandler {
private Configuration configuration = null;
public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf⑻");
}
public void createDoc() {
// 要填入模本的数据文件
Map dataMap = new HashMap();
getData(dataMap);
// getTest(dataMap);
// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
// 这里我们的模板是放在com.template包下面
configuration.setClassForTemplateLoading(this.getClass(),
"/com/template");
Template t = null;
try {
// test.ftl为要装载的模板
t = configuration.getTemplate("temple.ftl");
t.setEncoding("utf⑻");
} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称
File outFile = new File("D:/test.doc");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf⑻"));
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 注意dataMap里寄存的数据Key值要与模板中的参数相对应
* @param dataMap
*
*/
@SuppressWarnings("unchecked")
private void getData(Map dataMap) {
dataMap.put("image", getImageStr());
dataMap.put("name", "张3");
List<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>();
for(int i=1;i<=5;i++){
Map<String, Object> map=new HashMap<String, Object>();
map.put("purchaseTime", "进货日期"+i);
map.put("product", "产品名称"+i);
map.put("factory", "生产厂家"+i);
map.put("spec", "产品规格"+i));
map.put("number", "进货数量"+i);
newsList.add(map);
}
dataMap.put("newsList",newsList);
}
private String getImageStr() {
String imgFile = "d:/1.png";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
}
public class main {
/**
* @param args
*/
public static void main(String[] args) {
DocumentHandler dh=new DocumentHandler();
dh.createDoc();
System.out.println("end");
}
}
3. 生成的结果展现
4. 总结
这个工具生成word确切很方便,但是通过这两天查找资料也发现这个工具也是有很多不足的地方的,毕竟不是甚么都是10全10美的。在网上找到1个帖子简单的总结了1下这个工具的3个不好的地方,下面是连接地址有肯定的可以去看看。http://www.iteye.com/topic/17468
波比源码 » FreeMarker之生成复杂word(包含图片) (二)
order levaquin 500mg sale levofloxacin 500mg brand
avodart canada order celebrex pills ondansetron brand
cost spironolactone 100mg order fluconazole 200mg sale buy diflucan online cheap
order ampicillin 250mg pill buy cephalexin 125mg online order erythromycin 500mg for sale
order sildenafil without prescription nolvadex usa robaxin drug
purchase lamictal generic oral vermox 100mg buy retin online
tadalis 10mg sale tadalafil drug cost voltaren 100mg
cialis daily cost cialis 20 mg film-coated tablets tadalafil viagra pill
cost anastrozole 1 mg order biaxin 500mg online cheap sildenafil tablets
prednisone 20mg tablet buy sildenafil 50mg buy viagra 100mg online cheap
buy generic modafinil 100mg Cialis women brand diamox 250 mg
doxycycline pill furosemide 100mg price order furosemide 40mg without prescription
buspar 10mg without prescription ditropan medication buy ditropan pill
zyban 150mg cost cheap atomoxetine seroquel pills
buy tadalafil without prescription Get cialis online viagra usa
buy generic naltrexone 50 mg femara brand buy abilify
provigil 200mg pill modafinil 100mg cost buy ivermectin 2mg
nootropil pills cheap viagra sildenafil 100mg england
oral azithromycin buy prednisolone 5mg order gabapentin 600mg pills
itraconazole generic order tinidazole 500mg online purchase tindamax
order generic olanzapine diovan 80mg for sale buy valsartan 80mg pill
order sildenafil 100mg for sale order viagra sale lisinopril 5mg drug
buy zyvox 600mg online cheap poker online game online casinos for real money
order metoprolol for sale buy lopressor online order levitra 10mg online
writing a paper essays writing online gambling for real money
levitra online pregabalin over the counter methylprednisolone 16 mg pills
help with research paper cheap paper writing sildenafil 50mg brand
cialis professional tadalafil without prescription sildenafil 50mg pills
order priligy 90mg online cheap purchase cytotec generic levothyroxine uk
allopurinol 100mg us buy crestor online buy zetia without prescription
methotrexate cost metoclopramide 10mg uk metoclopramide online buy
ozobax price ketorolac without prescription ketorolac generic
imitrex 25mg drug order imitrex sale avodart brand
buy gloperba without prescription online casino bonus slot games
zantac brand order meloxicam 7.5mg without prescription celebrex 200mg brand
online card games best online casinos that roulette
order flomax 0.4mg buy spironolactone 25mg generic aldactone canada
simvastatin 10mg canada finasteride 1mg brand finasteride 5mg for sale
order keflex 500mg online cheap erythromycin order cost erythromycin
buy cialis 20mg for sale sildenafil order sildenafil 50mg us
cefuroxime 500mg ca cost careprost robaxin canada
free blackjack online online slot machines buy cialis 5mg
order trazodone pills aurogra online buy buy sildenafil generic
thesis writing services research paper assistance stromectol 12 mg