Java を使用して FreeMarker を使用して Word をエクスポートする実践例

高洛峰
リリース: 2017-01-05 13:18:21
オリジナル
1443 人が閲覧しました

最近、あるプロジェクトで Word ドキュメントをエクスポートする必要がありました。長い間苦労した結果、FreeMarker テンプレートを使用する方が便利で手間がかからないことがわかりました。参考までに、ここに主要な手順をまとめます。試験紙生成の簡単な例。

1. テンプレートの作成

まず、以下に示すように Word を使用してテンプレートを作成します (テーブルがあることに注意してください。境界線は非表示に設定しています)。それから XML として保存します。この XML ファイルについては、firstobject XML エディターを使用すると notepad++ ほど良くないと感じる人もいますが、ここでは主に要素の強調表示と自動ペアリングのために notepad++ を使用します。 :

Java を使用して FreeMarker を使用して Word をエクスポートする実践例

上の黒い領域は、基本的に後で置き換える場所です。たとえば、複数選択の下にあるテーブルの場合は、xytitle を ${xytitle} に置き換えます。質問の場合は、 検索を通じて見つけることができます。/w :tr> のペアは、レコード (質問) を表します。後でデータを入力するためにそれを含める #list> のペア。詳細については、Freemarker ページの構文を参照してください。たとえば、ここでは複数選択の質問について 2 行があります。 1 つのレコードなので、#list> の形式で 2 行を含める必要があります: 質問番号とタイトルOptions#list> を選択し、対応する xzn、xztest、ans1、ans2、ans3、ans4 を見つけて、${ plan1.xzn}、${plan1.xztest に置き換えます。 }、${plan1.ans1}、${plan1.ans2}、${plan1.ans3}、${plan1.ans4}、ここでは table1 と plan1 の名前に注意してください。table1 が続きます。充填データを使用する必要があります。 、その他の置換操作も同様に実行され、結果は次のようになります:

Java を使用して FreeMarker を使用して Word をエクスポートする実践例

保存後、サフィックスを ftl に変更すると、テンプレートが作成されます。

2. プログラミングの実装Java を使用して FreeMarker を使用して Word をエクスポートする実践例

ここでは 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");
 }
  
}
ログイン後にコピー

上のマップに注意してください。キー入力はテンプレート内のキーに対応している必要があります。そうでない場合は、エラーが報告されます。効果は次のとおりです:


以上がこの記事の全内容です。皆様の学習に役立つことを願っております。また、皆様にも PHP 中国語 Web サイトをサポートしていただければ幸いです。

FreeMarker を使用して Word をエクスポートする Java のより実践的な例については、PHP 中国語 Web サイトに注目してください。 Java を使用して FreeMarker を使用して Word をエクスポートする実践例

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート