最近写点东西练练手,就是页面中表格输入的数据要存入word的模板当中,记录一下 看了几种办法大概就是:
- poi-tl,word模板引擎,可以根据模板来创建word文档,很简单也方便上手。
- Jacob,调用微软Office的COM接口,生成的word文件格式规范。
- Apache POI包括一系列的API,通过这些API在Java中读写Excel、Word等文件。
- FreeMarker生成word文档,是由XML+FreeMarker来实现的。先把word文件另存为xml,在xml文件中插入特殊的字符串占位符,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板,编码调用FreeMarker实现文本替换并输出Doc。
- PageOffice,封装了微软Office繁琐的vba接口,支持生成word文件,也可以在线编辑word文档和读取word文档内容。
我最后是用的poi-tl实现的,poi-tl官方文档在这里,下边举个我测试时候的例子:
提交用的表单:
word模板:
把表单的内容填好提交按照已有的word模板生成word文档,随便提交了点数据,最后生成的结果:
首先需要引入依赖:
<!--文件上传的工具,不上传文件就不用了-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!--poi-tl 导出word的依赖-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.0</version>
</dependency>
生成word文档的工具类:
public static void word(Map<String,Object> map) {
String filepath = "d:/"+map.get("name")+"-"+map.get("sign")+".docx";
try {
XWPFTemplate template = XWPFTemplate.compile("d:/menzhen.docx").render(map);
FileOutputStream out = new FileOutputStream(filepath);
template.write(out);
out.flush();
out.close();
template.close();
} catch (IOException e) {
e.printStackTrace();
}
}
后台处理的servlet(这里是把要上传的数据存在hashmap里,图片的话是把上传的图片存在本地再new一个PictureRenderData对象存到hashmap里):
public class exportWord extends HttpServlet {
private Map<String,Object> BingLiMap= new HashMap<String, Object>();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
DiskFileItemFactory diskFileItemFactory =new DiskFileItemFactory();
ServletFileUpload servletFileUpload =new ServletFileUpload(diskFileItemFactory);
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if(fileItem.isFormField()){
String name=fileItem.getFieldName();
BingLiMap.put(name,fileItem.getString("UTF-8"));
} else {
String LuJing="d:/"+BingLiMap.get("sign")+".png";
InputStream inputStream = fileItem.getInputStream();
OutputStream outputStream = new FileOutputStream(LuJing);
int len=0;
byte[] bytes=new byte[1024];
while ((len=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
inputStream.close();
outputStream.close();
BingLiMap.put("file",new PictureRenderData(120, 110, LuJing));
}
}
} catch (Exception e) {
e.printStackTrace();
}
wordUtil.word(BingLiMap);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
走完servlet word文档就会创建在工具类的输出路径中,随便写写,水平有限哈~
|