文档章节

spring 利用freemarker生成并导出word文档

wenwen1
 wenwen1
发布于 2014/05/20 19:19
字数 901
阅读 493
收藏 7

Word从2003开始支持XML格式,用XML还做就很简单了。

大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,如下图所示:

将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc,如图所示的操作:

后台生成word的代码如下:

package net.gvsun.service;


import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;


import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;


public class WordHandler {


private Configuration configuration = null;


public WordHandler() {

configuration = new Configuration();

configuration.setDefaultEncoding("utf-8");

}


public File createDoc(String templatePath, String templateName, Map dataMap,String fileName) {


/* // 要填入模本的数据文件

Map dataMap = new HashMap();

getData(dataMap);*/


// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,

// ftl文件存放路径

configuration.setClassForTemplateLoading(this.getClass(), templatePath);


Template t = null;

try {

// test.ftl为要装载的模板

t = configuration.getTemplate(templateName);

t.setEncoding("utf-8");

} catch (IOException e) {

e.printStackTrace();

}


// 输出文档路径及名称

String root = System.getProperty("dhulims.root");

String upLoad=root+"upload"+File.separator;

//    File sendPath = new File(upLoad+projectNO);

File file = new File(upLoad);

if(!file.exists()){

file.mkdirs();

}

File outFile = new File(upLoad+fileName+".doc");

Writer out = null;

try {

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));

} catch (Exception e1) {

e1.printStackTrace();

}


try {

t.process(dataMap, out);

/*out.close();*/

} catch (TemplateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return outFile;

}

public static void main(String templatePath, String templateName, Map dataMap,String fileName) {

new WordHandler().createDoc(templatePath,templateName,dataMap,fileName);

}


}

control导出word并传入参数的代码如下:

/**

* 下载实验项目的word文档

* 作者:彭文玉

*/

@RequestMapping("/downloadLmsExperiment")

public void downloadLmsExperiment(@RequestParam int idKey,HttpServletResponse response)

{

response.setContentType("application/doc;charset=UTF-8");

 byte b[] = new byte[1024];   

//转换startDate的时间格式;

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

//根据主键idKey查找到LmsExperiment

LmsExperiment lmsexperiment=lmsExperimentDAO.findLmsExperimentByPrimaryKey(idKey);

//如果lmsexperiment的系部不为空

if(lmsexperiment.getSysDepartment()!=null){

//映射lmsexperiment的departmentName给departName;

dataMap.put("departName",lmsexperiment.getSysDepartment().getDepartmentName());

}

//否则设置lmsexperiment的null为departName

else{

dataMap.put("departName", "");

}

//映射lmsexperiment的experimentNumber给experimentNumber;

dataMap.put("experimentNumber",lmsexperiment.getExperimentNumber());

//映射Experiment的ExperimentName给ExperimentName;

dataMap.put("ExperimentName",lmsexperiment.getExperimentName());

 //映射lmsexperiment的experimentCardNumber给experimentCardNumber;

dataMap.put("experimentCardNumber",lmsexperiment.getExperimentCardNumber());

 //映射lmsexperiment的experimentMajor给experimentMajor;

dataMap.put("experimentMajor",lmsexperiment.getExperimentMajor());

 //映射lmsexperiment的totalCourseHours给totalCourseHours;

dataMap.put("totalCourseHours",lmsexperiment.getTotalCourseHours());

//映射lmsexperiment的totalExperimentHours给totalExperimentHours;

dataMap.put("totalExperimentHours",lmsexperiment.getTotalExperimentHours());

//映射lmsexperiment的thisExperimentHours给thisExperimentHours;

dataMap.put("thisExperimentHours",lmsexperiment.getThisExperimentHours());

  //映射lmsexperiment的experimentEachNumber给experimentEachNumber;

dataMap.put("experimentEachNumber",lmsexperiment.getExperimentEachNumber());

//映射lmsexperiment的experimentGroup给experimentGroup;

dataMap.put("experimentGroup",lmsexperiment.getExperimentGroup());

    //映射lmsexperiment的experimentCreatedAt给experimentCreatedAt;

dataMap.put("experimentCreatedAt",sdf.format(lmsexperiment.getExperimentCreatedAt().getTime()));

//映射lmsexperiment的experimentChangelog给experimentChangelog;

dataMap.put("experimentChangelog",lmsexperiment.getExperimentChangelog());

//映射lmsexperiment的experimentDesign给experimentDesign;

dataMap.put("experimentDesign",lmsexperiment.getExperimentDesign());

//映射lmsexperiment的experimentRequired给experimentRequired;

dataMap.put("experimentRequired",lmsexperiment.getExperimentRequired());

//映射lmsexperiment的experimentPurposes给experimentPurposes;

dataMap.put("experimentPurposes",lmsexperiment.getExperimentPurposes());

//映射lmsexperiment的experimentAward给experimentAward;

dataMap.put("experimentAward",lmsexperiment.getExperimentAward());

//如果lmsexperiment的学院不为空

if(lmsexperiment.getSysAcademy()!=null){

 //映射lmsexperiment的AcademyName给academyName;

dataMap.put("academyName",lmsexperiment.getSysAcademy().getAcademyName());

}

//否则设置lmsexperiment的null为academyName

else{

dataMap.put("academyName", "");

}

//如果lmsexperiment的课程不为空

if(lmsexperiment.getSysCourse()!=null){

 //映射lmsexperiment的CourseName给courseName;

dataMap.put("courseName",lmsexperiment.getSysCourse().getCourseName());

}

//否则设置lmsexperiment的null为courseName

else{

dataMap.put("courseName","");

}

//如果lmsexperiment的实验室不为空

if(lmsexperiment.getLmsLab()!=null){

 //映射lmsexperiment的labName给labName;

dataMap.put("labName",lmsexperiment.getLmsLab().getLabName());

}

//否则设置lmsexperiment的null为courseName

else{

dataMap.put("courseName","");

}

//如果lmsexperiment的项目类型不为空

if(lmsexperiment.getDataFieldByExperimentCategory()!=null){

 //映射lmsexperiment的categoryName给categoryName;

dataMap.put("categoryName",lmsexperiment.getDataFieldByExperimentCategory().getName());

}

//否则设置lmsexperiment的null为categoryName

else{

dataMap.put("categoryName","");

}

WordHandler handler = new WordHandler();

//生成word

File outFile =handler.createDoc("/com/ftl", "AA.ftl", dataMap,lmsexperiment.getExperimentName());

//下面的代码是导出word

FileInputStream in = null;

 OutputStream o = null;

 try {

 in = new FileInputStream(outFile);  

 o = response.getOutputStream();  

 response.setContentType("application/x-tar"); 

 response.setHeader("Content-disposition", "attachment; filename="

    + URLEncoder.encode(lmsexperiment.getExperimentName()+".doc", "UTF-8"));// 指定下载的文件名 

 response.setHeader("Content_Length",String.valueOf( outFile.length()));       // download the file.

       int n = 0;       

       while ((n = in.read (b))!= -1)

       {        

        o.write(b, 0, n);   

       } 

 } catch (Exception e) {

  e.printStackTrace();

 }finally{

   try {

    in.close();

    o.flush();

    o.close();

  } catch (IOException e) {

   e.printStackTrace();

  }

  

 }

}

经测试这样方式生成导出word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。


© 著作权归作者所有

wenwen1
粉丝 1
博文 26
码字总数 9049
作品 0
徐汇
私信 提问
使用freemarker生成word文档

项目有时候需要将一些内容导出成word格式,实现方式很多种,如:POI导出,freemarker导出。freemarker导出比较简单。 主要分三步: 新建一个word文档 生成模板 动态生成word。 新建一个word文...

leesama
2014/05/01
1K
3
FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】

版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行。所以此方案是:APP将表单数据发送给后台,后台通过freemarker将表单数据根...

HaiyuKing
04/26
0
0
在Spring+FreeMarker框架中使用Shiro的Tag标签

目前Freemarker对Shrio的标签还不支持,不过已经有人贡献出来第三方面解决方案,如下: 1、下载shiro-freemarker-tags GitHub地址:https://github.com/jagregory/shiro-freemarker-tags 可以...

zkool
2014/01/19
7.9K
0
java使用freemarker导出word(标准格式版)

版权声明:本文供交流学习,能够帮助到你是我最大的荣幸! https://blog.csdn.net/u014231523/article/details/88933319 之前使用freemarker导出word,可以在PC上打开。但是它不能在手机上打...

兴国First
03/31
0
0
Rapid Framework 发布 3.5 版本

本次的主要更新内容是重新拾起flex,重整了flex插件. 而spring3.0.2及ibatis3正式版一直未发布,只能先发布rapid v3.5以后再更新进来,感谢一直支持rapid的同学. v3.5更新内容: 扩展jsp,freemar...

红薯
2010/03/24
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
27分钟前
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
29分钟前
7
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
32分钟前
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
37分钟前
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部