freemarker를 사용하여 Java를 사용하여 단어를 내보내는 실제 예
최근 프로젝트에서는 워드 문서를 내보내야 했습니다. 오랫동안 고생한 끝에 freemarker 템플릿을 사용하는 것이 더 편리하고 번거롭지 않다는 것을 알았습니다. 이제 참고할 수 있도록 주요 단계를 요약하겠습니다. 시험지 생성의 간단한 예입니다.
1. 템플릿 제작
먼저 Word를 사용하여 아래와 같이 템플릿을 만듭니다.
(참고로 표가 있습니다.) 위의 경우 테두리가 보이지 않도록 설정한 다음 XML 파일로 저장한 다음 도구를 사용하여 xml 파일을 엽니다. 어떤 사람들은 firstobject XML Editor를 사용하는데 여기서는 notepad++만큼 좋지 않다고 느낍니다. , 주로 요소와의 강조 및 자동 페어링에 사용됩니다. 효과는 다음과 같습니다.
위의 검은색 영역은 기본적으로 xytitle을 ${로 바꾸는 등 나중에 교체할 위치입니다. xytitle}
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"); } }
위 맵의 키가 일치해야 합니다. 그렇지 않으면 오류가 보고됩니다. 효과는 다음과 같습니다.
위 내용은 모두의 학습에 도움이 되기를 바라는 글의 전체 내용입니다. PHP 중국어 웹사이트를 지원합니다.
freemarker를 사용하여 단어를 내보내는 Java의 더 실제적인 예를 보려면 PHP 중국어 웹사이트에 주목하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

데이터베이스 쿼리에 tkmyBatis를 사용하는 경우 쿼리 조건을 구축하기 위해 엔티티 클래스 변수 이름을 우아하게 가져 오는 방법이 일반적인 문제입니다. 이 기사는 고정 될 것입니다 ...
