Java导出word
需要的库
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
步骤
- 先在word中编辑好自己需要的模板 例如下图 其中占位是要动态输入的数据,后面要修改掉的
- 修改好模板后 转存为xml格式
- 打开转存的xml文档 ,对刚才的占位进行修改,换成freemarker的标识。其实就是Map<String, Object>中key,如${creator};在加入图片的地方会出现base64 编码 ,删除后换上你想要的标识 (编辑xml可用Firstobject free XML editor 、notepad++也可以。编辑后改后缀为.ftl
如果想要进行遍历的话可以使用<#list maps as map> </#list> maps是Map<String, Object>中key,值为数组,map为自定义;
在使用图片循环便利时需要注意的是:w:name 需要随着遍历动态去修改 否则 打印出来的图片全部都是同一个图片
代码实现
word工具类
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.URLEncoder;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class WordUtils {
private static Configuration configuration = null;
private static final String templateFolder = "H:/我的项目/lm/lm/web/src/main/webapp/WEB-INF/templates";
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
configuration.setDirectoryForTemplateLoading(new File(templateFolder));
} catch (IOException e) {
e.printStackTrace();
}
}
private WordUtils() {
throw new AssertionError();
}
public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String title,String ftlFile) throws IOException {
Template freemarkerTemplate = configuration.getTemplate(ftlFile);
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
file = createDoc(map,freemarkerTemplate);
fin = new FileInputStream(file);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
String fileName = title+DateUtil.formatDateDetailTime(new Date()) + ".doc";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
out = response.getOutputStream();
byte[] buffer = new byte[512];
int bytesToRead = -1;
while((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if(fin != null) fin.close();
if(out != null) out.close();
if(file != null) file.delete();
}
}
private static File createDoc(Map<?, ?> dataMap, Template template) {
String name = "sellPlan.doc";
File f = new File(name);
Template t = template;
try {
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;
}
}
Java实现
Map<String, Object> map = new HashMap<String, Object>();
map.put("creator","学习路上的菜鸡");
try {
WordUtils.exportMillCertificateWord(getRequest(),
getResponse(),map,"方案","sellPlan.ftl");
} catch (IOException e) {
e.printStackTrace();
}
前端调用
window.open(getRootPath()+"/ys/exportToWord.spr?id=9df8f063fca247a0bc05462daf20eb13");
参考自 https://www.zwqh.top/article/info/4