Heim  >  Artikel  >  Java  >  Praktisches Beispiel für die Verwendung von Freemarker zum Exportieren von Wörtern mit Java

Praktisches Beispiel für die Verwendung von Freemarker zum Exportieren von Wörtern mit Java

高洛峰
高洛峰Original
2017-01-05 13:18:211395Durchsuche

Ein aktuelles Projekt erforderte den Export eines Word-Dokuments. Nachdem ich lange gekämpft hatte, stellte ich fest, dass es bequemer und problemloser war, die Freemarker-Vorlage zu verwenden. Hier ist eine Zusammenfassung einfaches Beispiel für die Erstellung von Testpapieren.

1. Vorlagenerstellung

Erstellen Sie zunächst mit Word eine Vorlage, wie unten gezeigt:

Praktisches Beispiel für die Verwendung von Freemarker zum Exportieren von Wörtern mit Java

(Beachten Sie, dass es eine Tabelle gibt (oben habe ich den Rand auf unsichtbar gesetzt) ​​und ihn dann als XML-Datei gespeichert. Einige Leute verwenden den XML-Editor von firstobject und meinen, dass er hier nicht so gut ist wie Notepad++ , hauptsächlich zum Hervorheben und automatischen Koppeln mit Elementen. Der Effekt lautet wie folgt:

Praktisches Beispiel für die Verwendung von Freemarker zum Exportieren von Wörtern mit Java

Der schwarze Bereich oben ist im Grunde der Ort, den wir später ersetzen werden, z. B. xytitle durch ${ ersetzen. xytitle}. Achten Sie besonders auf die Tabelle, z. B. unter den Multiple-Choice-Fragen. Ein Paar von Hier verwenden wir ein Paar von < ;#list>#list>. Weitere Informationen finden Sie in der Syntax der Freemarker-Seite Für die Multiple-Choice-Frage hier haben wir beispielsweise zwei Zeilen für einen Datensatz, daher müssen # list> zwei Zeilen in der Form enthalten: < ;w:tr>Titel der FragenummerOptionen, und suchen Sie dann die entsprechenden xzn, xztest, ans1, ans2, ans3, ans4 und ersetzen Sie sie durch ${plan1.xzn}, ${plan1.xztest}, ${plan1.ans1}, ${plan1 .ans2}, ${plan1.ans3}, ${plan1.ans4}, achten Sie darauf Benennung von Tabelle1 und Plan1 hier, die zum anschließenden Füllen der Daten von Tabelle1 verwendet werden. Der gleiche Vorgang wird für andere Ersetzungen durchgeführt, und das Ergebnis ist wie folgt:

Praktisches Beispiel für die Verwendung von Freemarker zum Exportieren von Wörtern mit Java

Nachher Speichern Sie, ändern Sie das Suffix in ftl, und die Vorlage ist nun fertig.

2. Programmierimplementierung

Hier wird das Paket freemarker-2.3.13.jar verwendet, der Code lautet wie folgt:

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

Dann bereiten Sie einfach den Datenanruf vor. Der Code lautet wie folgt:

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

Beachten Sie, dass die Tasten in der Karte oben übereinstimmen müssen denen in der Vorlage entsprechen, andernfalls wird ein Fehler gemeldet. Der Effekt ist wie folgt:

Praktisches Beispiel für die Verwendung von Freemarker zum Exportieren von Wörtern mit Java

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich sein wird wird die chinesische PHP-Website unterstützen.

Weitere praktische Beispiele für Java mit Freemarker zum Exportieren von Word finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn