Недавно проект должен экспортировать документ Word. Я много работал в течение долгого времени. Я обнаружил, что это удобнее и удобно использовать шаблоны Freemarker. Я суммирую ключевые шаги для вашей ссылки. Вот простой пример генерации тестовой бумаги.
1. Производство шаблонов
Сначала используйте слово, чтобы сделать шаблон, как показано на рисунке ниже:
(Обратите внимание, что есть таблица выше, я установил границу невидимой), затем сохраняю ее в виде файла XML, а затем использую инструмент для открытия файла XML. Кто -то использует редактор FirstObject XML, чтобы чувствовать, что он не так хорош, как блокнот ++. Я использую блокнот ++ здесь, в основном потому, что он имеет выделение и автоматически сочетается с элементами. Эффект заключается в следующем:
Черное место выше - это в основном место, которое мы хотим заменить позже. Например, если xytitle заменяется $ {xytitle}, вы должны уделять большое внимание таблице. Например, таблица ниже вопросов с несколькими вариантами ответов может быть расположена путем поиска вопросов с несколькими вариантами выбора. Пара <W: tr> </w: tr> представляет ряд, то есть запись (вопрос). Здесь нам нужно использовать пару <#list> </#List>, чтобы включить ее, чтобы впоследствии заполнить данные. Для получения подробной информации, пожалуйста, обратитесь к грамматике страницы Freemarker. For example, here multiple-choice questions, we have two behaviors and one record, so we need <#list></#list> to include two rows, as shown in: <#list table1 as plan1><w:tr>Question number Question</w:tr><w:tr>Option</w:tr></#list>, and then find the corresponding xzn, xztest, ans1, ans2, ans3, and ans4 to replace it with $ {plan1.xzn}, $ {plan1.xztest}, $ {plan1.ans1}, $ {plan1.ans2}, $ {plan1.ans3}, $ {plan1.ans4}, обратите внимание, что таблица 1 и Plan1 указаны здесь. Таблица 1 и последующие данные заполнения должны использоваться. Другие замены одинаковы, и результаты следующие:
После сохранения измените имя суффикса в FTL, и шаблон завершен.
2. Программирование реализации
Здесь используется пакет Freemarker-2.3.13.Jar, а код следующим образом:
пакет общий; Импорт java.io.bufferedwriter; Импорт java.io.file; Импорт java.io.filenotFoundException; Импорт java.io.fileOutputStream; импортировать java.io.ioexception; импортировать java.io.outputstreamwriter; импортировать java.io.unsupportedencodingexception; Импорт java.io.writer; импортировать java.util.map; импортировать freemarker.template.configuration; импортировать freemarker.template.template; импортировать freemarker.template.template; импортировать freemarker.template.templateexception; открытый класс DocumentHandler {частная конфигурация конфигурации = null; public DocumentHandler () {configuration = new Configuration (); configuration.setDefaultEncoding ("UTF-8"); } public void Canectionoc (map <string, object> dataMap, string filename) бросает UnsupportedEncodingException {// dataMap, чтобы заполнить файл данных сценария модуля // Установить метод и путь модуля сценария, FreeMarker поддерживает множественные методы загрузки шаблонов. Вы можете переоценить,, классная дорожка и загрузка базы данных. // Здесь наш шаблон помещается в конфигурацию пакета шаблона. SetClassFortemplayLateLoading (this.getClass (), "/template"); Шаблон t = null; try {//test.ftl - это шаблон для загрузки t = configuration.gettemplate ("fctestpaper.ftl"); } catch (ioException e) {e.printstackTrace (); } // Вывод пути документа и файла имени OutFile = новый файл (имя файла); Писатель Out = null; FileOutputStream fos = null; try {fos = new FileOutputStream (Outfile); OutputStreamWriter OWRITER = новый OutputStreamWriter (FOS, "UTF-8"); // Это место необходимо для кодирования потоковой передачи. При вызове отдельно с использованием main () он должен быть в порядке, но если это веб -запрос для экспорта документа Word не будет открыт после экспорта, а файл XML -пакета неверен. Основная причина заключается в том, что формат кодирования неверен и не может быть проанализирован. // out = new BufferedWriter (новый 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("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. Затем подготовьте звонок данных, код выглядит следующим образом:
пакет com.havenliu.document; импортировать java.io.unsupportedencodingexception; импортировать java.util.arraylist; импортировать java.util.hashmap; импортировать java.util.list; импортировать java.util.map; открытый класс main { / ** * @param args * @throws unsupportedencodingexception * / public static void main (string [] args) бросает UnsupportedEncodingException {; Map <string, object> dataMap = new hashmap <string, object> (); dataMap.put ("xytitle", "Exam Paper"); int index = 1; // Список с множественным выбором <map <string, object >> list1 = new ArrayList <map <string, object >> (); // список вопросов <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); // Заполнить список Blanss <map <string, object >> list2 = new ArrayList <map <string, object >> (); Список <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); // Список вопросов суждения <map <string, object >> list3 = new ArrayList <map <string, object >> (); Список <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 («судья», index + "."); map1.put ("hij", "v" + index); List13.Add (MAP1); index ++; } dataMap.put ("table3", list3); dataMap.put ("table13", list13); // Список вопросов короткого ответа <map <string, object >> list4 = new ArrayList <map <string, object >> (); Список <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 ("ответ", 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"); }} Обратите внимание, что ключ на карте выше должен соответствовать шаблону, в противном случае будет сообщена ошибка. Эффекты следующие:
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.