>  기사  >  Java  >  freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예

freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예

高洛峰
高洛峰원래의
2017-01-05 13:18:211395검색

최근 프로젝트에서는 워드 문서를 내보내야 했습니다. 오랫동안 고생한 끝에 freemarker 템플릿을 사용하는 것이 더 편리하고 번거롭지 않다는 것을 알았습니다. 이제 참고할 수 있도록 주요 단계를 요약하겠습니다. 시험지 생성의 간단한 예입니다.

1. 템플릿 제작

먼저 Word를 사용하여 아래와 같이 템플릿을 만듭니다.

freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예

(참고로 표가 있습니다.) 위의 경우 테두리가 보이지 않도록 설정한 다음 XML 파일로 저장한 다음 도구를 사용하여 xml 파일을 엽니다. 어떤 사람들은 firstobject XML Editor를 사용하는데 여기서는 notepad++만큼 좋지 않다고 느낍니다. , 주로 요소와의 강조 및 자동 페어링에 사용됩니다. 효과는 다음과 같습니다.

freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예

위의 검은색 영역은 기본적으로 xytitle을 ${로 바꾸는 등 나중에 교체할 ​​위치입니다. xytitle} 를 통해 테이블을 찾을 수 있습니다. 행, 즉 레코드(질문)입니다. 여기서는 후속 데이터 채우기에 이를 포함하기 위해 < ;#list>#list>를 사용합니다. 예를 들어 여기의 객관식 질문의 경우 하나의 레코드에 두 줄이 있으므로 # list> 형식으로 두 줄을 포함해야 합니다. 질문 번호 제목옵션 그런 다음 해당 xzn, xztest, ans1, ans2, ans3, ans4를 찾습니다. ${plan1.xzn}, ${plan1.xztest}, ${plan1.ans1}, ${plan1 .ans2}, ${plan1.ans3}, ${plan1.ans4}로 바꾸세요. table1 및 plan1의 이름은 table1 데이터의 후속 채우기에 사용됩니다. 다른 교체에 대해서도 동일한 작업이 수행되며 결과는 다음과 같습니다.

freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예

After 저장하고 접미사를 ftl로 변경하면 이제 템플릿이 완성됩니다.

2. 프로그래밍 구현

여기에서는 freemarker-2.3.13.jar 패키지가 사용되며 코드는 다음과 같습니다.

package common;
  
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) throws UnsupportedEncodingException {
  //dataMap 要填入模本的数据文件
  //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
  //这里我们的模板是放在template包下面
  configuration.setClassForTemplateLoading(this.getClass(), "/template");
  Template t=null;
  try {
   //test.ftl为要装载的模板
   t = configuration.getTemplate("fctestpaper.ftl");
  } 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("---------------------------");
 }
}

그런 다음 코드는 다음과 같습니다.

package com.havenliu.document;
  
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
  
public class Main {
  
 /**
  * @param args
  * @throws UnsupportedEncodingException
  */
 public static void main(String[] args) throws UnsupportedEncodingException {;
  
  Map<String, Object> dataMap = new HashMap<String, Object>();
  dataMap.put("xytitle", "试卷");
  int index = 1;
  // 选择题
  List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();//题目
  List<Map<String, Object>> list11 = new ArrayList<Map<String, Object>>();//答案
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("xzn", index + ".");
   map.put("xztest",
     "( )操作系统允许在一台主机上同时连接多台终端,多个用户可以通过各自的终端同时交互地使用计算机。");
   map.put("ans1", "A" + index);
   map.put("ans2", "B" + index);
   map.put("ans3", "C" + index);
   map.put("ans4", "D" + index);
   list1.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("fuck", index + ".");
   map1.put("abc", "A" + index);
   list11.add(map1);
  
   index++;
  }
  dataMap.put("table1", list1);
  dataMap.put("table11", list11);
  
  // 填空题
  List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> list12 = new ArrayList<Map<String, Object>>();
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("tkn", index + ".");
   map.put("tktest",
     "操作系统是计算机系统中的一个___系统软件_______,它管理和控制计算机系统中的___资源_________.");
   list2.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("fill", index + ".");
   map1.put("def", "中级调度" + index);
   list12.add(map1);
  
   index++;
  }
  dataMap.put("table2", list2);
  dataMap.put("table12", list12);
  
  // 判断题
  List<Map<String, Object>> list3 = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> list13 = new ArrayList<Map<String, Object>>();
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("pdn", index + ".");
   map.put("pdtest",
     "复合型防火墙防火墙是内部网与外部网的隔离点,起着监视和隔绝应用层通信流的作用,同时也常结合过滤器的功能。");
   list3.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("judge", index + ".");
   map1.put("hij", "对" + index);
   list13.add(map1);
  
   index++;
  }
  dataMap.put("table3", list3);
  dataMap.put("table13", list13);
  
  // 简答题
  List<Map<String, Object>> list4 = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> list14 = new ArrayList<Map<String, Object>>();
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("jdn", index + ".");
   map.put("jdtest", "说明作业调度,中级调度和进程调度的区别,并分析下述问题应由哪一级调度程序负责。");
   list4.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("answer", index + ".");
   map1.put("xyz", "说明作业调度,中级调度和进程调度的区别,并分析下述问题应由哪一级调度程序负责。");
   list14.add(map1);
  
   index++;
  }
  dataMap.put("table4", list4);
  dataMap.put("table14", list14);
  
  MDoc mdoc = new MDoc();
  mdoc.createDoc(dataMap, "E:/outFile.doc");
 }
  
}

위 맵의 키가 일치해야 합니다. 그렇지 않으면 오류가 보고됩니다. 효과는 다음과 같습니다.

freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예

위 내용은 모두의 학습에 도움이 되기를 바라는 글의 전체 내용입니다. PHP 중국어 웹사이트를 지원합니다.

freemarker를 사용하여 단어를 내보내는 Java의 더 실제적인 예를 보려면 PHP 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.