1.pom.xml配置freemarker依賴包
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
2.打開word模版文件,另存爲.xml格式,然後將.xml文件後綴改爲.ftl,引入.ftl模板文件到項目指定目錄
3.編寫生成Word工具類
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class DcWordUtil {
public static void download(HttpServletRequest request,HttpServletResponse response,String newWordName,Map dataMap) {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(DcWordUtil.class, "/templates");//模版文件的存放路徑
Template t = null;
try {
//讀取模版文件
t = configuration.getTemplate("word.ftl","utf-8");
} catch (Exception e) {
e.printStackTrace();
}
File outFile = null;
Writer out = null;
String filename = newWordName;
try {
outFile = new File("word.doc");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (Exception e) {
e.printStackTrace();
}
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
InputStream fis = null;
OutputStream toClient = null;
try {
fis = new BufferedInputStream(new FileInputStream(outFile));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 設置response的Header
filename = URLEncoder.encode(filename, "utf-8");//要用URLEncoder轉下才能正確顯示中文名稱
response.addHeader("Content-Disposition", "attachment;filename=" + filename+"");
response.addHeader("Content-Length", "" + outFile.length());
toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
} catch (Exception e) {
} finally{
try {
if(toClient!=null){
toClient.close();
}
} catch (Exception e) {
}
try {
if(fis!=null){
fis.close();
}
} catch (IOException e) {
}
}
}
}
4.業務層調用
@RequestMapping("/exportWord")
public String exportWord(Model model,HttpServletRequest request,HttpServletResponse response) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("導出開始時間:"+format.format(new Date()));
List<Map<String, Object>> list = jkconfigDao.exportWord();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("list", list);
String title = "測試.doc";
DcWordUtil.download(request, response, title, dataMap);
System.out.println("導出結束時間:"+format.format(new Date()));
return null;
}
5.ftl文件通過表達式獲取值
List集合遍歷:<#list list as list> 第一個list 不能變 ,第二個list 爲變量名 ,第三個list 爲別名,遍歷結束加上</#list>
List集合遍歷獲取索引:${list_index}
List集合遍歷拼接索引動態取值:${list['qq${list_index}']}
Map集合取值:${list.name}
IF判斷:<#if list_index*3+1 <= qqcount>${list_index*3+1}</#if>