`

java freemarker(xml模板) 导出word

阅读更多

最近,由于项目的需要要导出规范样式的word文档,且要求较高。

之前已经尝试过两种方式(

1.使用POI在后台写出WORD,该方法和基础,写简单格式很ok,打样式复杂的时候,就纠结了,反正我是没调整好,放弃。

2.将内容传到页面,在用特殊的格式后,将页面另存为DOC格式的文档。这种方法很简单,几乎都都在客户端页面解决,但是另存后,其中html标签转在word中显示主要的问题是很多框线显示出来了,相当的不好看。

以上两种方法确定可以实现word导出,但是word样式没有达到客户要求。

 

因此,在网上查找得到可以使用freemarker的模板来搞定,极度兴奋。

总结一下关键步骤,供大家参考。

 

1.将处理好的的word模板,另存为xml格式的文档。并在其中添加参数:  ${export}

<!--StartFragment -->
2.将xml文档修改完成后,保存并修改后缀名为“****.ftl”;
 
3.编写java类,主要实现对模板的赋值以及生成流,用于导出。
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.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; 
import com.cist.bayonet.mainstat.model.Dljtsgjbxxb;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
 * @fun 重大事故word导出类
 * @author xzl
 *
 */
public class export_word {  
 
 private Configuration configuration = null;
 public export_word() {     
  configuration = new Configuration();   
  configuration.setDefaultEncoding("utf-8");
  //System.out.print("========");
  }  
 public File createDoc(Dljtsgjbxxb dlb,String spth) throws UnsupportedEncodingException {        //要填入模本的数据文件 
  Map dataMap=new HashMap();    
  getData(dataMap,dlb);        //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
  //这里我们的模板是放在com.cist.bayonet.mainstat.service.impl包下面  
  configuration.setClassForTemplateLoading(this.getClass(), "/com/cist/bayonet/mainstat/service/impl"); 
  Template t=null;
  try {           //sgxxb_info.ftl为要装载的模板     
   t = configuration.getTemplate("sgxxb_info.ftl");  
   }
  catch (IOException e) {    
   e.printStackTrace();     
   }        //输出文档路径及名称   
  File outFile = new File(spth+"/.doc");
  Writer out = null;   
  try {    
   FileOutputStream fos = new FileOutputStream(outFile);
   OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");//
这个地方对流的编码不可或缺,
使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
   out = new BufferedWriter(oWriter);  
   } catch (FileNotFoundException e1) {
    e1.printStackTrace();     
    }     
   try {         
    t.process(dataMap, out);
    } catch (TemplateException e) {  
     e.printStackTrace();    
     } catch (IOException e) {   
      e.printStackTrace();    
      }
             return outFile; 
     }
 /**     * 注意dataMap里存放的数据Key值要与模板中的参数相对应     * @param dataMap     */  
 @SuppressWarnings("unchecked")
 private void getData(Map dataMap,Dljtsgjbxxb db)     {  //这里就是给模板的的Map赋值,通过接受的实体对象来获取所需的值。测试时建议直接用常量,如dataMap.put("jbdw1", "绵阳市二大队");

  dataMap.put("jbdw1", db.getJbdw1());
  dataMap.put("jbdw2", db.getJbdw2());
  dataMap.put("jbdw3", db.getJbdw3());
  dataMap.put("sjfs1", db.getJbsjfs1().toString().substring(0, 19)+db.getJbsjfs1f());
  dataMap.put("sjfs2", db.getJbsjfs2().toString().substring(0, 19)+db.getJbsjfs2f());
  dataMap.put("sjfs3", db.getJbsjfs3().toString().substring(0, 19)+db.getJbsjfs3f());
  dataMap.put("jbyxm1", db.getJbr1());
  dataMap.put("jbyxm2", db.getJbr2());
  dataMap.put("jbyxm3", db.getJbr3());
  dataMap.put("sbpzr1", db.getSbpzr1());
  dataMap.put("sbpzr2", db.getSbpzr2());
  dataMap.put("sbpzr3", db.getSbpzr3());
  dataMap.put("xxsbr1", db.getSbr1());
  dataMap.put("xxsbr2", db.getSbr2());
  dataMap.put("xxsbr3", db.getSbr3());
  dataMap.put("sbsjfs1", db.getSbsjfs1().toString().substring(0, 19)+db.getSbsjfs1f());
  dataMap.put("sbsjfs2", db.getSbsjfs2().toString().substring(0, 19)+db.getSbsjfs2f());
  dataMap.put("sbsjfs3", db.getSbsjfs3().toString().substring(0, 19)+db.getSbsjfs3f());
  dataMap.put("dcsw", db.getDcsw());
  dataMap.put("szrs", db.getXlbm());
  dataMap.put("qjwx", db.getQjwxsw());
  dataMap.put("zsrs", db.getSs());
  dataMap.put("jyqk", db.getJbqk());
  dataMap.put("jbsj", db.getJbsj().toString().substring(0, 19));
  dataMap.put("zby", db.getZby());
  dataMap.put("sghsqk", db.getSgxxhsqk());
  DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
  String string = dFormat.format(new Date());
  dataMap.put("export", string);
  } 
//      public static void main(String args[]){
//       export_word word = new export_word();
//       word.createDoc();
//           }
 }

4.由于我使用的是SSH框架,所以struts处理Action部分如下:
(一下类由于内容较多只贴了有用的部分,个人觉得重点的部分的result注解中的设定)
@ParentPackage("json-default")
@Namespace("/struts/mainstat")
@Results({
 @Result(name="word",type="stream",params={"contentDisposition","attachment;filename=${filename}","bufferSize","4096","contentType","application/octet-stream;charset=utf-8","inputName","inputStream"}),
 @Result(name="msg",location="/bayonet_jsp/result.jsp"),
 @Result(name="alltoll",type="json"),
 @Result(name="repeat",type="json",params={"includeProperties","m_StringResult","noCache","true","ignoreHierarchy","false"}),
})
public class MainstartAction extends BasePageAction<Dljtsgjbxxb> {
 /**
  *
  */
 private static final long serialVersionUID = 1L;
 private static final Logger lr = LoggerFactory.getLogger(MainstartAction.class);
 @Resource(name = "MainstartService")
 private IMainstartService m_css;
 private int cont_a;
 private String cityString;
 private Dljtsgjbxxb dlb; 
 private FileInputStream inputStream = null;
 private String filename = "SGXXBG" + java.util.Calendar.getInstance().get(java.util.Calendar.MILLISECOND) +".doc";
 
。。。。。。。。。。。。。。。。。。。。。。。。
/**
  * WORD导出
  * @return
  */
 @Action("word_accident")
 public String exportWord() {
  try{
   ServletContext sc = ServletActionContext.getServletContext();
   String path = sc.getRealPath("/bayonet_file/word/");//获取服务器端,暂时存储路径
   dlb = m_css.getEntity(dlb);
         export_word word = new export_word();
         File file = word.createDoc(dlb, path);//返回的是,已经使用模板生成的word文档的路径
   if (file.exists()) {
    this.inputStream = new FileInputStream(file);//Action需要返回的流
   } else {
    m_StringResult = Messages.MSG_FAIL;
  return "msg";
   }
   return "word";//通过上面对应的注解返回stream;客户端可以在线打开或者下载。 
  }catch(Exception ex){
   m_StringResult = Messages.MSG_SEARCH_FAILTURE;
   lr.error(ex.getMessage());
   return "msg";
  }
  
 }
  • 大小: 108.2 KB
分享到:
评论

相关推荐

    Java freemarker 根据模板 导出word.rar

    springboot 根据word模板,导出word,设置好word2003模板,利用 word2003-&gt;另存为 2003.xml-&gt;.ftl。然后根据ftl,填充数据导出word. 生成xml或者 flt文件后可以用 vs或者 IDEA 格式化代码,方便阅读

    Java项目中利用Freemarker模板引擎导出--生成Word文档

    基于Java语言来导出Word文档的方式也有很多种,如Jacob,Apache POI,Freemarker,PageOffice,java2word 等等。。。。 在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring ...

    java使用word模板导出个人简历

    java使用word模板导出个人简历 a、处理word2003模板导出doc文件 b、处理word2007模板导出docx文件

    java web+freemarker导出word

    java web+freemarker 导出word 单个字符串${name}, 列表&lt;#list tail as item&gt; ${item.id} ,附有源码,导出word的word模板 以及另存为的xml文件和 ftl模板,只需要改下里面的查询数据库即可

    Java导出Word文档的实现.docx

    在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。 导出Word方式多种多样,通常有以下几种方式: 1. 使用第三方Java工具类库Hutool的...

    Java中使用 FreeMarker 生成pdf盖章合同文件

    1.html模板+model数据,通过freemarker进行渲染,便于维护和修改 2.渲染后的html流,可通过Flying Saucer组件生成pdf文件流,或者生成pdf后再转成jpg文件流

    java导出word文档,固定模板

    使用freemarker技术,首先将word模板另存为xml文档,方便填充数据。然后将后缀名改为ftl,简单方便.

    freemarker 导出word功能

    java利用freemarker组件导出word功能 包含图片有xml模板,下载后可直接运行

    freeMarker导出word两种方式最全代码样例.rar

    freeMarker导出word两种方式:1、生成xml方式模板并附带图片导出,2、总结生成的html模板可以直接导出word,也可以在页面查看。项目中使用过,拿出来分享

    word文档生成html模板(freemarker)再转为pdf示例代码

    2、由上述生成的html模板通过java代码生成pdf; 3、示例有本地模板和远程模板之分,可杜绝pdf标题丢失的问题; 4、资源概要:先阅读README.md文档,然后根据文档中的资源示例运行代码,有postman和内部调用两种方式; 5...

    SpringBoot_Freemarker生成Word_多个表格+两层嵌套循环

    SpringBoot_Freemarker生成Word_多个表格+两层嵌套循环; 步骤说明: 1.用Microsoft Office Word打开word原件;将文档中需要动态生成的内容,替换为属性名 ${name} 2.另存为,选择保存类型Word 2003 XML 文档(*....

    导出Word:POI or Freemarker

    导出word的两种方式:1.docx文本模板导出;2.docx转换为xml后的文本模板导出; 简单内容可以使用doc模板导出; 复杂内容可以使用xml模板导出(支持行、列数据自增、合并等);

    用Freemarker生成word文档

    1.用word写一个需要导出的word模板,然后存为xml格式。 2.将xml中需要动态修改内容的地方,换成freemarker的标识符 添加图片 如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开...

    JAVA项目代码绘制PDF和通过freemarker动态生成PDF

    对于没有使用宏、函数等word、excel,需要按模板动态生成word、excel、html,只需要一个freemarker,先将word、excel、html等另存为**xml**,即可使用模板动态生成文件,目前xlsx是不支持的 4. PdfTemplate 对于不会...

    freemarker生成复杂word

    Word从2003开始支持XML格式,用XML+Freemarder还做就很简单了,大致的思路是先用office2003或者2007编辑好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。...

    JavaWord.zip

    Freemarker java导出word文档,通过模板和freemaker利用java语言生成对应的word文档。 其中模板来源:word模板,另存为xml文件,把需要替换的内容用${XX}形式替换。

    Eclipse模板化生成Word&PDF;文档.zip

    Java后端使用freemarker基于.ftl配置文件模板化模式生成文档,内容可以包括文本、图片、表文本格、目录、附件(excel等文件),适用于已经规范化的各种报告等文件;将后端生成的xml格式文档转换为word格式以及pdf...

    word源码java-officeexport-java:三行代码导出自定义样式word

    开发中偶尔会有固定模板导出word的需求,常见的导出通常通过直接修改xml或者通过工具库代码调整样式输出,这些方式开发困难并且不利于后期维护。 一些有规则的文档需要人工填写,费时费力,此时配置数据库做模板渲染...

    ftl模板生成的word文档打不开

    1.word模板另存为xml格式文件的时候,选择Word 2003 XML格式(兼容问题) 2.模板中有图片的时候,将ftl文件中图片的base64编码改成变量${xxx} 改为对应的变量名 3.图片的标签必须在同一行,不能跳行,中间不能加...

Global site tag (gtag.js) - Google Analytics