关于在Java中实现导出功能,导出格式为Word文档导出,具体参考如下代码。
1 先准备好一个导出Word文档的模板。
例如:
将其存值地方用字段代替。例如:
2.打开doc文件后 ,文件中的另存为,然后选择 保存类型为 版本的(*.xml)
3、 刚生成的xml文件里面比较乱,要整理一下,方法如下:
使用Eclipse/idea ,新建一个jsp ,把xml里面的东西覆盖更新刚才的jsp ,ctrl+Shift+F/ ctrl+alt+L 把文件整理一下,在拷贝出来,放到刚才的xml。文件内容就排好了,然后找到刚才我们写的name,sex,adress等地方,修改成为 name,{name} ,name,{sex},R{adress} (这些其实就是占位符,等下我们把我们的实际数据以一对应 的替换掉),
注意:需要注意的是 在列表上方,需要定义集合遍历的名称,例如你后台定义的list 是
<#list listTotol as notice>例如时间:${notice.Day}关于自增序号的是:${notice_index+1}</list>
4.xml完成后.将格式改成ftl格式 (个人基本情况.xml ==>修改成:basic.ftl )(名字最好不要用中文)
5.将 basic.ftl 放到 com.xxx.template文件下(具体放的位置看项目具体结构是怎么样的)
6、导入jar包:freemarker-2.3.18.jar (可自行下载,或者问我要都行)
7、导入工具类
import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.io.Writer;import java.util.Iterator;import java.util.Map;import javax.servlet.http.HttpServletResponse;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;public class WordDataUtil {/*** * @param mouldName 模板的名称 比如"basic.ftl"* @param dataMap传入的数据(key=ftl 中的站位的名称同时 要是String )* @param fileName 最后生成的word文件的名称* @param response* @throws IOException*/public void exportWord(String mouldName,Map<String,Object> dataMap,String fileName,HttpServletResponse response) throws IOException {Configuration configuration = new Configuration();configuration.setDefaultEncoding("utf-8");if(dataMap != null) {Iterator it = dataMap.entrySet().iterator();while (it.hasNext()) {Map.Entry entry = (Map.Entry) it.next();String key = (String)entry.getKey();Object value = entry.getValue();dataMap.put(key,value==null?"":value);//集合}}// 所在的项目中的路径configuration.setClassForTemplateLoading(this.getClass(), "/com/jaguar/template");Template t=null;try {//test.ftl word模板文件t = configuration.getTemplate(mouldName);} catch (IOException e) {e.printStackTrace();}String FileName = fileName + ".doc";response.setContentType("application/x-msdownload");response.setHeader("Content-Disposition","attachment;filename="+FileName);response.setHeader("Content-Disposition","attachment;filename="+new String(FileName.getBytes("gbk"),"iso-8859-1")); Writer out = null;try {try {out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e1) {e1.printStackTrace();}try {t.process(dataMap, out);} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
8、编写controller层相关代码。在点击导出的时候,将查询到的相关对应的值set到对应的字段里。如:
/*** 下载表单数据* @param request* @param response* @throws Exception*/@RequestMapping("download")public void download(HttpServletRequest request, HttpServletResponse response) throws Exception{SimpleDateFormat data=new SimpleDateFormat("yyyy年MM月dd日");Long id=RequestUtil.getLong(request,"id");OaApplyInvite oaApplyInvite = oaApplyInviteService.getById(id);WordDataUtil wordDataUtil=new WordDataUtil();String fileName="个人基本情况表";String mouldName="basic.ftl";Map<String,Object> dataMap=new HashMap<String, Object>();SysOrg sysOrg=sysOrgService.getById(oaApplyInvite.getDeptid());//总的List<Notice> listTotol = attendUserService.findNoticeListTotol(sysOrg.getUserId());String Applydate=oaApplyInvite.getApplydate()==null?"":data.format(oaApplyInvite.getApplydate());dataMap.put("name",sysOrg.getName());//姓名,这里的那么 是和 刚才的xml中的${name} 对应的,dataMap.put("sex",sysOrg.getSex());//性别//集合列表dataMap.put("listTotol",listTotol);// 。。。。。。。。。。。wordDataUtil.exportWord(mouldName, dataMap, fileName, response);//打印的方法}
9、导出模板示例:
注意:dataMap中只能赋予String,不能直接传入类似date类型的值,需要转为String类型再插入。