Maison  >  Article  >  Java  >  Java utilise Freemarker pour exporter des exemples pratiques de mots

Java utilise Freemarker pour exporter des exemples pratiques de mots

高洛峰
高洛峰original
2017-01-05 13:18:211434parcourir

Un projet récent nécessitait l'exportation d'un document Word. Après avoir longtemps lutté, j'ai trouvé qu'il était plus pratique et plus simple d'utiliser le modèle freemarker. Je vais maintenant résumer les étapes clés pour votre référence. exemple simple de génération de papier test.

1. Production du modèle

Utilisez d'abord Word pour créer un modèle, comme indiqué ci-dessous :

Java utilise Freemarker pour exporter des exemples pratiques de mots

(notez qu'il existe un tableau ci-dessus, j'ai défini la bordure pour qu'elle soit invisible), puis je l'enregistre en tant que fichier XML. Ensuite, utilisez un outil pour ouvrir le fichier XML. Certaines personnes utilisent FirstObject XML Editor et pensent que ce n'est pas aussi bon que le bloc-notes ici. , principalement pour la mise en évidence et l'appariement automatique avec les éléments. L'effet Comme suit :

Java utilise Freemarker pour exporter des exemples pratiques de mots

La zone noire ci-dessus est essentiellement l'endroit que nous remplacerons plus tard, par exemple en remplaçant xytitle par ${. xytitle}. Portez une attention particulière au tableau, comme ci-dessous la question à choix multiples. Nous pouvons localiser le tableau grâce à la recherche . ligne, c'est-à-dire un enregistrement (une question). Ici, nous utilisons une paire de < ;#list>#list> pour l'inclure pour le remplissage ultérieur des données. Pour plus de détails, veuillez vous référer à la syntaxe de la page Freemarker. Par exemple, pour la question à choix multiples ici, nous avons deux lignes pour un enregistrement, nous avons donc besoin que # list> doit inclure deux lignes, sous la forme : Numéro de questionOptions, puis recherchez les xzn, xztest, ans1, ans2, ans3, ans4 et remplacez-les par ${plan1.xzn}, ${plan1.xztest}, ${plan1.ans1}, ${plan1 .ans2}, ${plan1.ans3}, ${plan1.ans4}, faites attention au nom de table1 et plan1 ici, qui seront utilisés pour le remplissage ultérieur des données de la table1. La même opération est effectuée pour les autres remplacements, et le résultat est le suivant :

Java utilise Freemarker pour exporter des exemples pratiques de mots

Après la sauvegarde. , remplacez le suffixe par ftl et le modèle est maintenant terminé.

2. Implémentation de la programmation

Le package freemarker-2.3.13.jar est utilisé ici, le code est le suivant :

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("---------------------------");
 }
}

Ensuite, préparez simplement l'appel de données. Le code est le suivant :

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");
 }
  
}

Notez que la clé dans la carte ci-dessus doit correspondre. à celui du modèle, sinon une erreur sera signalée. L'effet est le suivant :

Java utilise Freemarker pour exporter des exemples pratiques de mots

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun, et j'espère aussi que tout le monde. prendra en charge le site Web chinois PHP.

Pour des exemples plus pratiques de Java utilisant freemarker pour exporter des mots, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn