Java通过FreeMarker生成Word文件

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>

发布了95 篇原创文章 · 获赞 131 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/rexueqingchun/article/details/89569279