freemarker 导出word

本文介绍如何利用Freemarker结合Java代码生成Word文档,包括设置文档样式、填充数据及导出流程等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


学习的几篇文章:

使用Freemarker生成Word :http://my.oschina.net/liweigov/blog/63868

《ava freemarker(xml模板) 导出word 》 http://xustar.iteye.com/blog/1284104


我的问题:

1、导出IO流不熟悉

2、尝试过直接写word,格式太难控制


				Map<String, Object>  graduationCertificateInfo = statisticsDao.graduationCertificateInfo(idaos, params);
				if(graduationCertificateInfo.size()>0){
					
				}
				String studentName = (String) graduationCertificateInfo.get("studentName");
				String sex = (String) graduationCertificateInfo.get("sex");
				String specialty = (String) graduationCertificateInfo.get("specialty");
				BigDecimal requiredCredits = (BigDecimal) graduationCertificateInfo.get("requiredCredits");
				BigDecimal selectCredits = (BigDecimal) graduationCertificateInfo.get("selectCredits");
				BigDecimal totalScore = (BigDecimal) graduationCertificateInfo.get("totalScore");
				SimpleDateFormat sft = new SimpleDateFormat("yyyy年MM月dd日");
				sft.format(new Date());
		        XWPFDocument doc = new XWPFDocument();  
		        // 标题
		        XWPFParagraph paragraph1 = doc.createParagraph();  
		        paragraph1.setWordWrap(true);  
		        paragraph1.setPageBreak(true);  //换页
		         
		        //p3.setAlignment(ParagraphAlignment.DISTRIBUTE);  
		        // 设置字体对齐方式
		        paragraph1.setAlignment(ParagraphAlignment.CENTER);  
		        paragraph1.setSpacingLineRule(LineSpacingRule.EXACT);  
		  
		        paragraph1.setIndentationFirstLine(600);  
		        // title要使用paragraph1所定义的属性  
		        XWPFRun title = paragraph1.createRun();  
		        title.setBold(true);//加粗
		        title.setFontSize(26);
		        title.setTextPosition(-10);  
		        // 设置上下两行之间的间距
		        title.setTextPosition(20);
		        title.setText("素质拓展证书");  
		        title.addCarriageReturn();  
		        // 设置证书正文
		        XWPFParagraph paragraph2 = doc.createParagraph();
		        paragraph2.setAlignment(ParagraphAlignment.LEFT);
		        XWPFRun r2 = paragraph2.createRun();
		        r2.setFontSize(22);
		        r2.setTextPosition(-10);  
		        r2.setTextPosition(20);
		        r2.setText("    "+studentName+"");
		        r2.setUnderline(UnderlinePatterns.SINGLE);
//		        r2.setUnderline();
		        r2.setText(",性别"+sex+","+specialty+"专业"  
		        		+ "级学生,完成“综合素质教育”计划的学习,修满"  
		                + "必修学分"+requiredCredits+",选修学分"+selectCredits+",成绩"+totalScore+",特发"  
		                + "此证。");  
		        r2.addBreak();  
		        // 设置证书正文
		        XWPFParagraph paragraph3 = doc.createParagraph();
		        paragraph3.setAlignment(ParagraphAlignment.LEFT);
		        XWPFRun r3 = paragraph3.createRun();
		        r3.setFontSize(22);
		        r3.setText("证书编号:12345678989");  
		        r3.addBreak(); 
		        
		        // 设置证书正文
		        XWPFParagraph paragraph4 = doc.createParagraph();
		        paragraph4.setAlignment(ParagraphAlignment.RIGHT);
		        XWPFRun r4 = paragraph4.createRun();
		        r4.setFontSize(22);
		        r4.setText(sft.format(new Date()));  
		          
		        r2.addBreak(BreakClear.ALL);  
		        
		        String filename = "活动成绩详情.doc";
				OutputStream outStream = TempFileUtil.instanse().createFile(filename);
		        doc.write(outStream); 				
				Map<String, Object> result = new HashMap<String, Object>();
				result.put("path", "temp");
				result.put("filename", filename);
				return result;

3、xml格式乱了会打不开生成的word(注意〈〉和</>对称)
<think>好的,用户想用Freemarker生成或导出Word文件。我需要根据提供的引用信息来整理步骤。首先,用户可能对Freemarker不太熟悉,所以需要从基础步骤开始。 首先,应该提到准备模板。根据引用[1]和[3],需要将Word文档另存为XML,然后替换变量为${}格式。这一步很关键,因为用户可能不知道如何将Word转换成Freemarker能处理的模板。需要详细说明保存XML和修改变量的步骤,比如用Ctrl+F查找替换。 接下来是引入依赖。引用[1]和[2]提到了不同的依赖配置。用户可能使用不同的项目管理工具,比如Maven,所以需要给出正确的依赖项。注意引用[1]中的groupId是com.quhaodian,而引用[2]是Spring Boot的插件,可能需要确认最新版本,但通常Freemarker的依赖应该是org.freemarker,这里可能需要纠正。但根据用户提供的引用,可能需要保留他们提到的依赖,尽管可能有误,但按照用户给的引用信息来。 然后是加载模板和处理数据。需要说明如何读取模板文件,创建配置实例,并填充数据模型。这部分需要结合代码示例,可能用Java代码展示,比如使用Configuration类,设置目录,获取模板,然后处理合并。 最后是生成文档,输出为Word文件。要提到输出流的处理,比如FileOutputStream,以及可能的异常处理。 另外,用户可能遇到的问题包括模板路径设置不正确,变量名不匹配,或者依赖版本问题。需要提醒注意这些点,确保模板路径正确,变量名称一致,以及依赖版本兼容性。 可能还需要补充一些优化建议,比如模板复用、复杂数据结构的处理,或者异常处理机制,帮助用户更稳健地实现功能。 总结步骤应该是:准备模板→引入依赖→代码处理→输出文件。确保每个步骤清晰,并参考用户提供的引用内容,特别是变量替换和依赖部分。同时,考虑到用户可能遇到的常见问题,给出提示,避免他们走弯路。</think>### Freemarker生成Word文档的实现步骤 #### 一、模板准备(关键步骤) 1. 创建Word模板文件,将需要动态填充的内容标记为占位符,例如:`${username}`、`${reportDate}` 2. 将Word文档另存为**XML格式**(文件→另存为→选择XML格式) 3. 用文本编辑器打开XML文件,将占位符修改为Freemarker语法格式。例如: ```xml <w:t>${departmentName}</w:t> <!-- 原始内容 --> <w:t>${departmentName}</w/t> <!-- 修改后 --> ``` 注意需要保持XML标签结构完整[^3] #### 二、添加依赖(Maven示例) ```xml <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> ``` 推荐使用Spring Boot的自动配置支持[^2] #### 三、核心代码实现 ```java // 1. 配置模板引擎 Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); cfg.setClassForTemplateLoading(this.getClass(), "/templates"); cfg.setDefaultEncoding("UTF-8"); // 2. 准备数据模型 Map<String, Object> data = new HashMap<>(); data.put("title", "项目报告"); data.put("content", "生成内容示例"); // 3. 加载模板文件 Template template = cfg.getTemplate("template.xml"); // 4. 生成输出文件 try (Writer out = new OutputStreamWriter(new FileOutputStream("output.doc"), "UTF-8")) { template.process(data, out); } ``` #### 四、注意事项 1. 模板文件建议存放在`resources/templates`目录 2. 复杂表格处理需保持XML结构完整 3. 特殊字符需要使用Freemarker的内建函数处理,如`${content?html}` 4. 文件扩展名保持`.doc`以保证兼容性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值