1.首先需要借助office將需要的word模板轉(zhuǎn)成xml文件
在此操作之前需要將需要填入內(nèi)容的地方用${name}進(jìn)行占位,其中name為屬性值侦锯,可以為map的key。
如下圖:
其中keycode和unitname為我接下來需要填入的相應(yīng)框中的一個查詢結(jié)果的類中的兩個屬性,當(dāng)然為了處理的方便我也將它們存入了一個map
設(shè)計好模板后然后用word(ps:WPS不行)的另存為功能猩谊,存為xml文件。
2.將xml文件轉(zhuǎn)為ftl文件
接下來我們需要處理一下轉(zhuǎn)成的xml文件祭刚,因為有時這些占位符的內(nèi)容會被一對格式分開牌捷,這樣的話freemarker引擎就無法正常解析了
需要成為如下的樣子,也就是保持占位符還是書寫時的樣子
修改完畢后保存涡驮,然后將其另存為ftl格式的文件
3.引入freemarkerjar包
可去如下地址下載:
http://freemarker.org/freemarkerdownload.html
4.主要代碼
上圖是我的web程序有關(guān)導(dǎo)出word的主要部分暗甥,jar放在lib下
這里我用的
struts2
當(dāng)然servlet springmvc也是可以的
/**
* 將新增的查封出一個審批表
* @throws IOException
*/
public void exportCFw() throws IOException {
Session session = SessionHelper.currentSession();
HttpServletRequest req = ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
Map<String, Object> map = new HashMap<String, Object>();
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
cfkId="0000C3C1-DC90-4A3A-A5B3-3104623C64C5";
req.setCharacterEncoding("utf-8");
Query query = session.createQuery("from Cfk c where c.proid='" + cfkId + "'");
Cfk cfk = (Cfk) query.list().get(0);
// 為了通用性將model類存儲為map
map = ConvertModel2Map(map, cfk);
// 調(diào)用工具類WordGenerator的createDoc方法生成Word文檔
file=WordGenerator.createDoc(map, "cfk");
fin=new FileInputStream(file);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;filename=cfk.doc");
out=response.getOutputStream();
byte[] buffer=new byte[512];
int byteToRead=-1;
while((byteToRead=fin.read(buffer))!=-1){
out.write(buffer, 0, byteToRead);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fin != null) fin.close();
if(out != null) out.close();
if(file != null) file.delete(); // 刪除臨時文件
}
}
private Map<String, Object> ConvertModel2Map(Map<String, Object> map, Object model) {
Field[] fields = model.getClass().getDeclaredFields();// 獲取實體類的所有屬性,返回Field數(shù)組
try {
for (Field field : fields) { // 遍歷所有屬性
String name = field.getName(); // 獲取屬性的名字
field.setAccessible(true);// 設(shè)置當(dāng)前對象對model私有屬性的訪問權(quán)限
Object value = field.get(model);// 獲取屬性值
if(value==null){
value="";
}
map.put(name, value);
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map;
}
package com.fquery.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateNotFoundException;
public class WordGenerator {
private static Configuration configuration=null;
private static Map<String, Template> allTemplates = null;
static{
configuration=new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(WordGenerator.class, "/com/fquery/ftl");
allTemplates=new HashMap<String, Template>();
try {
allTemplates.put("cfk", configuration.getTemplate("cfk.ftl"));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private WordGenerator() {
throw new AssertionError();
}
public static File createDoc(Map<?, ?> dataMap, String type) {
String name = "temp" + (int) (Math.random() * 100000) + ".doc";
File f = new File(name);
Template t = allTemplates.get(type);
try {
// 這個地方不能使用FileWriter因為需要指定編碼類型否則生成的Word文檔會因為有無法識別的編碼而無法打開
Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
t.process(dataMap, w);
w.close();
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return f;
}
}
struts2
<action name="exportCFw" class="com.fquery.action.Export" method="exportCFw">
</action>
前端調(diào)用action
這里為了測試方便捉捅,直接給了查詢指定的條件撤防,實際中應(yīng)該是從前臺傳過去
function exportCF3(){
location.href="exportCFw.action";
}
本文參考如下文章,特此感謝作者:http://blog.csdn.net/jackfrued/article/details/39449021