word文档的导出(用freemarker模板导出)

1、将要导出的word文档另存为xml格式的

2、用文档编辑器打开(如:notepad++),将要展示的数据用${name}的形式替换,“name”对应数据库中的字段

3、根据模板生成

package com.idcsol.apps.common.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class DocumentHandler {

private Configuration configuration = null;

public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}

public void createDoc(Map<String,Object> dataMap,String fileName,
String tempName) throws UnsupportedEncodingException {
//dataMap 要填入模本的数据文件
//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
//这里我们的模板是放在template包下面
configuration.setClassForTemplateLoading(this.getClass(), "/com/idcsol/apps/controller/positionSet/template");
Template t=null;
try {
//test.ftl为要装载的模板
t = configuration.getTemplate(tempName);
} catch (IOException e) {
e.printStackTrace();
}
//输出文档路径及名称
File outFile = new File(fileName);
Writer out = null;
FileOutputStream fos=null;
try {
fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}

try {
t.process(dataMap, out);
out.close();
fos.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

//System.out.println("---------------------------");
}
}

4、控制器中使用

DocumentHandler  mdoc = new DocumentHandler ();

String resourcepath = "文件名.doc";
mdoc.createDoc(dataMap, resourcepath,"remoceApplyOut.ftl");

5、通过上述实现,word文档已经导出到服务器上,但是,一般会需要把文件下载到客户机上

实现代码:

package com.idcsol.apps.common.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.multipart.MultipartFile;

import com.idcsol.base.common.constant.BaseConst;
import com.idcsol.base.common.utils.StringUtil;

public class UploadUtil {

private static Log log = LogFactory.getLog(UploadUtil.class);

/**
* 上传文件(下载文件的话不需要该方法)
* @param file
* @return 文件在服务器的相对路径
*/
public static String uploadFile(MultipartFile file) {

String url = "";

String path = "/upload";
try {
// 获取绝对路径
String realPath = com.idcsol.apps.common.constant.Const.REAL_PATH + path;

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式
String date = df.format(new Date());

realPath = realPath + "/" + date;

// 创建文件夹
File dir = new File(realPath);
if (!dir.exists()) {
dir.mkdirs();
}

// 构建文件名
String fileName = "" + new Date().getTime();
int ext = 0;
if ((ext = file.getOriginalFilename().lastIndexOf(".")) != -1) {
// 扩展名
fileName += file.getOriginalFilename().substring(ext);
}

path = path + "/" + date + "/" + fileName; // 相对路径

url = realPath + "/" + fileName;
file.transferTo(new File(url));

} catch (Exception e) {
log.error(StringUtil.getExceptionDetail(e));
return "";
}

return path;

}

public static void downloadFile(String resourcepath,String filename, HttpServletRequest request,
HttpServletResponse response) {
// String[] fileName1=resourcepath.split("/");
// String fileName=fileName1[fileName1.length-1];
FileInputStream fis = null;
OutputStream out = null;
if(StringUtil.isNotEmpty(filename) && StringUtil.isNotEmpty(resourcepath)) {
try {
//fileName = java.net.URLDecoder.decode(fileName,"UTF-8");
filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");
String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF");
realPath=realPath.replace("\\hrm\\WEB-INF","");
realPath.trim();
fis = new FileInputStream(new File(resourcepath));
//设置响应头和保存文件名
response.setContentType("application/x-download");
response.addHeader("Content-Disposition","attachment;filename=" + filename);
//写出流信息
int b = BaseConst.ZERO;
out = response.getOutputStream();
byte [] buf = new byte[1024];
while(-1 != (b = fis.read(buf))) {
out.write(buf,0,b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

6、控制器中调用下载的方法

UploadUtil.downloadFile(resourcepath, Docname, request, response);//文件路径、文件名

7、如果导出的文件在服务器上没有必要留下来的话,可以将对应文件删除

public boolean delDoc(HttpServletRequest request ,HttpSession httpSession,
String docName) throws UnsupportedEncodingException {
Result<Object> result = new Result<Object>();
String docname=docName;
// System.out.println(docname+"docname");
String lj= request.getRealPath("/")+docname;
boolean flag = false;
File file = new File(lj);
// 判断目录或文件是否存在
if (!file.exists()) { // 不存在返回 false
return flag;
} else {
// 判断是否为文件
/* if (file.isFile()) { // 为文件时调用删除文件方法
return deleteFile(lj);
}*/ /*else { // 为目录时调用删除目录方法
return deleteDirectory(lj);
} */
deleteFile(lj);
}
return flag;
}
private boolean deleteFile(String lj) {
// TODO Auto-generated method stub
boolean flag = false;
File file = new File(lj);
// 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) {
file.delete();
// System.out.println("删除成功");
flag = true;
}
return flag;
}

8、控制器中调用删除文件的方法

delDoc(request,httpSession,Docname);

需要导入freemarker的jar包

maven  pom.xml的写法

<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.8</version>
</dependency>

(导出word文档的方法完)

时间: 2024-09-30 16:06:18

word文档的导出(用freemarker模板导出)的相关文章

word 文档导出 (freemaker+jacob)--java开发

工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶段 1,.首先 是 先了解 java 通过什么方式 来操作word的导出工作.就有了下面这个帖子了: java 操作 word 的方法 :https://www.cnblogs.com/lcngu/p/5247179.html .新手可以先看看了解下. 2. 根据需求:操作word很复杂: 1.有图

java使用freemarker生成word文档

1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格的内容使用不同的标记标好,设计好word后,将word文档另存为xml文件(注:只有word2003 以上的版本可以),使用xml工具打开文件,将要输出到word的内容使用${XX}替换,保存后将文件直接改为tdl后缀 3.使用eclipse编写程序 1)获得一个Configuration实例,并为

Struts2利用iText导出word文档(包含表格)以提供下载

J2EE ExcelStrutsXML 在公司实习期间,带我的老师让我实现一功能——在显示课表的页面上上点击“导出文件“时能以word文档形式下载课表.将课表导出到excel里的功能他们已经实现了,用的是Struts2+poi实现的.poi对excel表格操作能力很强,但是对word文档的支持一直没有更新,操作能力有限. iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML.Ht

c#操作Word文档

c#操作Word文档 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Word = Microsoft.Office.Interop.Word; using System.Reflection; using System.Text.RegularExpressions; using System.IO; namespace WebWord { public cla

Java 用Freemarker完美导出word文档(带图片)

Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. 准备材料 1.word原件 2.编辑器(推荐Firstobject free XML editor) 实现步骤 1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型

使用Spire.Doc组件利用模板导出Word文档

以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件.开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的:但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题.最终找到了Spire.Doc组件,轻松实现! Spire的官网地址:https:

利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的博客介绍过几篇关于Aspose.Word控件和Aspose.Cell控件的使用操作,如下所示. <使用Aspose.Cell控件实现Excel高难度报表的生成(一)> <使用Aspose.Cell控件实现Excel高难度报表的生成(二)> <使用Aspose.Cell控件实现Ex

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

使用freemarker模板引擎生成word文档的开发步骤

1.准备模板文档,如果word文档中有表格,只保留表头和第一行数据:2.定义变量,将word文档中的变量用${var_name}替换:3.生成xml文件,将替换变量符后的word文档另存为xml文件:4.格式化xml文件,使用工具(XmlFormat.exe),自动生成格式化后的xml文件:5.美化xml文件,${}中的内容仅保留变量名:6.表格,将表格中的行数据用相应的变量替换,在第一行数据的收尾加标签:<#list tbl1 as tbl1></#list> ,注意:表格可嵌套