java通过freemarker生成word文档

用word模板,将其另存为xml格式,模板的文件名最好是英文,可以设置生成的文件名成。然后将xml文件的后缀名修改为ftl格式,就变成了freemarker的标准格式(xml格式的其实也可以)。比较繁琐的就对格式的搜索,动则几万行费眼,博主曾半个月对一个word模板修改十多次,心累,最好确定好最终的模板格式,记录下我的word生成工具和调用,freemarker语法这里就不说了,过程就是搬砖的过程,跟jsp页面其实没太大区别。

之前的项目比较老,有时间在调整一份springboot的版本吧

调用 并返回导出模板路径

//导出模板路径
String path=WordUtils.exprotWordToLocal(param,"MorningMeetingDaily.xml","XX会日报");

工具类

package com.sgcc.common.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.common.BaseUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 
 * @ClassName: WordUtils
 * @描述: word工具类,提供导出方法
 * @@author: jinyihao
 * @date: 2019-7-16 下午3:01:51
 */
@SuppressWarnings({ "rawtypes", "deprecation" })
public class WordUtils {
	private static final Logger logger = Logger.getLogger(WordUtils.class.getName());
	
	private static Configuration configuration = null;
	private static String code = "UTF-8";
	private static String upload_url;
	static {
		try {
			logger.log(Level.INFO,"WordUtils 初始化开始");
			configuration = new Configuration();
			configuration.setDefaultEncoding(code);
			upload_url = BaseUtils.getProperties("upload_url");
			configuration.setDirectoryForTemplateLoading(new File(upload_url));
		} catch (Exception e) {
			logger.log(Level.SEVERE,"WordUtils 初始化异常    upload_url: "+upload_url ,e);
		}
	}

	private WordUtils() {
		throw new AssertionError();
	}

	/**
	 * 获取网络图片的流
	 * 
	 * @param imgURL
	 * @return
	 * @throws IOException
	 */
	@SuppressWarnings("unused")
	private static InputStream getUrlInputStream(String imgURL) {
		try {
			// 创建URL
			URL url = new URL(imgURL);
			// 创建链接
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(5 * 1000);
			InputStream is = conn.getInputStream();
			return is;
		} catch (IOException e) {
			logger.log(Level.SEVERE,"WordUtils 获取网络图片异常 ",e);
			return null;
		}

	}

	/**
	 * 从输入流中获取数据
	 * 
	 * @param inStream
	 *            输入流
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	@SuppressWarnings("unused")
	private static byte[] readInputStream(InputStream inStream)
			throws IOException {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[10240];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		inStream.close();
		return outStream.toByteArray();
	};

	/**
	 * 处理转义字符
	 * @param str
	 * @return
	 */
	public static String transform(String str) {
		if (str.contains("<") || str.contains(">") || str.contains("&")) {
			str = str.replaceAll("<", "&lt;").replaceAll(">", "&gt;")
					.replaceAll("&", "&amp;");
		}
		return str;
	}

	/**
	 * 创建文件路径
	 * @param destFileName  字符串格式的 文件路径
	 * @return
	 */
	  public static boolean createFile(String destFileName) {  
	        File file = new File(destFileName);  
	        if(file.exists()) {  
	            return false;  
	        }  
	        if (destFileName.endsWith(File.separator)) {   
	            return false;  
	        }  
	        //判断目标文件所在的目录是否存在  
	        if(!file.getParentFile().exists()) {  
	            //如果目标文件所在的目录不存在,则创建父目录  
	            if(!file.getParentFile().mkdirs()) {  
	                return false;  
	            }  
	        }  
	        //创建目标文件  
	        try {  
	            if (file.createNewFile()) {  
	                return true;  
	            } else {  
	                return false;  
	            }  
	        } catch (IOException e) {  
	            logger.log(Level.SEVERE,"word 导出文件生成异常" + destFileName + "  :",e);
	            return false;  
	        }  
	}  

	private static File createDoc(Map<?, ?> dataMap, Template t){
		return createDoc(dataMap, t,"test.doc") ;
	}
	private static File createDoc(Map<?, ?> dataMap, Template t,String name) {
		createFile(name);
		File f = new File(name);
		// 生成文件路径
		try {
			Writer w = new OutputStreamWriter(new FileOutputStream(f), code);
			t.process(dataMap, w);
			w.close();
		} catch (Exception e) {
			logger.log(Level.SEVERE,"word 导出文件异常" + name + "  :",e);
		}
		return f;
	}

	public static void exprotWord(HttpServletRequest request,
			HttpServletResponse response, Map map, String modleName,
			String fileName) throws IOException {
		Template template = configuration.getTemplate(modleName);
		File file = null;
		InputStream inputStream = null;
		ServletOutputStream servletOutputStream = null;
		try {
			// 调用工具类的方法生成Word文档
			file = createDoc(map, template);
			inputStream = new FileInputStream(file);
			response.setCharacterEncoding(code);
			response.setContentType("application/msword");
			// 设置浏览器以下载的方式处理该文件名
			fileName.concat(".doc");
			response.setHeader("Content-Disposition", "attachmentfilename="
					.concat(String.valueOf(URLEncoder.encode(fileName, code))));
			servletOutputStream = response.getOutputStream();
			byte[] buffer = new byte[512];// 缓冲区
			int bufferToRead = -1;
			// 通过循环讲读入的Word文件的内容输出到浏览器中
			while ((bufferToRead = inputStream.read(buffer)) != -1) {
				servletOutputStream.write(buffer, 0, bufferToRead);
			}
		} catch (Exception e) {
			logger.log(Level.SEVERE,"word 导出异常" + fileName + "  :",e);
		} finally {
			if (inputStream != null)
				inputStream.close();
			if (servletOutputStream != null)
				servletOutputStream.close();
			if (file != null)
				file.delete();// 删除临时文件
		}
	}

	/**
	 * 
	 * @描述: TODO(导出word到本地)   
	 * @param: @param map         导出数据
	 * @param: @param modleName   模版名称
	 * @param: @param fileName    文件名称: 早例会日报
	 * @param: @return      
	 * @return: String      
	 * @throws
	 */
	public static String exprotWordToLocal(Map map, String modleName,
			String fileName) {
		fileName += DateUtil.getDate("yyyyMMddHHmmss") + ".doc";
		String filePath = upload_url;
		try {
			Template template = configuration.getTemplate(modleName);
			File file = createDoc(map, template,filePath+fileName);
			if(file==null){
				return null;// 文件生成异常
			}
		} catch (Exception e) {
			logger.log(Level.SEVERE,"WordUtils 初始化异常",e);
			return null;// 文件生成异常
		}
		return fileName ;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_39308071/article/details/112554792