用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("<", "<").replaceAll(">", ">")
.replaceAll("&", "&");
}
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 ;
}
}