利用freemarker生成包含合并单元格的表格的word文档

原创 2016年08月31日 21:17:12

1.项目中有需求要生成那种合并单元格而且行数不确定的情况,之前有用过freemarker生成固定格式的word文档,网上找了很多资料,经过两天的研究,现在提供一个东西可以供大家参考。

需求图:


2.然后把这个word文档另存为xml格式的,这个可以参照我之前写的一篇文章:点击打开链接

3.然后利用xml代码格式化工具(网上有很多),把你的xml代码全部格式化。然后另外保存一个xml文档,最好是在eclipse中生成,因为改起来很快。在新的xml文档中,查找标签如下:<w:tbl>代表表格的开始,<w:tr>代表这个表格的行,只要知道这两个标签,就可以根据需求实现我们的循环了。

4.循环的写法和jsp页面的迭代标签比较相似


结尾也是</#list>

写好之后把这个xml修改为ftl格式的文件

5.然后在代码里面把生成的集合放在这里进行显示

public void exportRegisterModel(){
		try {  
			SureDocument sureDocument = sureDocumentService.getById(model.getId());
			Configuration configuration = new Configuration();  
	        configuration.setDefaultEncoding("utf-8");  
	        
	        
	        Map<String,Object> dataMap=new HashMap<String,Object>();  
	        RegisterCover registerCover = sureDocument.getRegisterCover();
	        //封面
	        dataMap.put("name", registerCover.getName());
	        dataMap.put("version", registerCover.getVersion());
	        dataMap.put("jidi", registerCover.getJidi());
	        dataMap.put("year", registerCover.getYear());
	        dataMap.put("month", registerCover.getMonth());
	        dataMap.put("name2", registerCover.getName2());
	        //课程表
	        HqlHelper hqlHelper = new HqlHelper(Schedule.class, "s")
	        		.addWhereCondition("s.sureDocument.id = ?",sureDocument.getId())
	        		.addOrderByProperty("s.dateTime", true);
	        List<Schedule> scheduleList = scheduleService.queryWithSplitPage(hqlHelper, currentPage, pageSize);
	        List<ScheduleForm> scheduleFormList = scheduleService.coverPO2VO(scheduleList);
	        dataMap.put("scheduleForms", scheduleFormList);
	        dataMap.put("position", registerCover.getPosition());
	        //作息时间

	        //学员名单
			hqlHelper = new HqlHelper(TrainClass.class, "t")
	        		.addWhereCondition("t.sureDocument.id = ?",sureDocument.getId())
	        		.addOrderByProperty("t.createdTime", true);
			List<TrainClass> trainClassList = trainClassService.queryWithSplitPage(hqlHelper, null, null);
			//装班级的集合
			List<TrainClass2Register> trainClass2Registers = new ArrayList<TrainClass2Register>();
			if(trainClassList!=null&&trainClassList.size()!=0){
				for(TrainClass trainClass : trainClassList){
					TrainClass2Register trainClass2Register = new TrainClass2Register();
					trainClass2Register.setPcname(trainClass.getName());
					//装学员的集合
					List<Person2Register> person2Registers = new ArrayList<Person2Register>();
					
					HqlHelper hqlHelper2 = new HqlHelper(TrainClassAndUser.class, "t")
							.addWhereCondition("t.trainClass.id = ?", trainClass.getId());
					
					List<TrainClassAndUser> trainClassAndUserList = trainClassAndUserService.queryWithSplitPage(hqlHelper2, null, null);
					String banzhang = "";
					String shuji = "";
					String zuzhang = "";
					String pnum = "";
					if(trainClassAndUserList!=null&&trainClassAndUserList.size()!=0){
						pnum = trainClassAndUserList.size()+"";
						for(TrainClassAndUser classAndUser : trainClassAndUserList){
							if(classAndUser.getType().equals("1")){//判断是否为班长
								banzhang += "   "+classAndUser.getUser().getName();
							}else if(classAndUser.getType().equals("3")){//判断是否为书记
								shuji += "   "+classAndUser.getUser().getName(); 
							}else if(classAndUser.getType().equals("5")){//判断是否为组长
								zuzhang += "   "+classAndUser.getUser().getName(); 
							}
							
							String hql = "From Personal p where p.user.id = " + classAndUser.getUser().getId();
							Personal personal = personalService.querySingleWithHql(hql);
							if(personal!=null){
								Person2Register person2Register = new Person2Register();
								person2Register.setPname(personal.getName());
								person2Register.setPnational(personal.getNational());
								person2Register.setPsex(personal.getSex());
								person2Register.setProom(classAndUser.getStayName());
								String parea = "";
								//所在机构
								if(personal.getProvince()!=null&&personal.getProvince().length()!=0){
									Department department = departmentService.getById(Long.parseLong(personal.getProvince()));
									parea = department.getName();
								}
								if(personal.getCity()!=null&&personal.getCity().length()!=0){
									Department department = departmentService.getById(Long.parseLong(personal.getCity()));
									parea = department.getParent().getName()+department.getName();
								}
								if(personal.getArea()!=null&&personal.getArea().length()!=0){
									Department department = departmentService.getById(Long.parseLong(personal.getArea()));
									parea = department.getParent().getParent().getName() + department.getParent().getName()+department.getName();
								}
								person2Register.setParea(parea);
								person2Register.setPposition(personal.getPosition());
								person2Register.setPphone(personal.getPhone());
								
								person2Registers.add(person2Register);
							}else{
								Person2Register person2Register = new Person2Register();
								User user = classAndUser.getUser();
								person2Register.setPname(user.getName());
								person2Register.setPnational("");
								person2Register.setPsex(user.getGender());
								person2Register.setProom(classAndUser.getStayName());
								String parea = "";
								//所在机构
								Department department = user.getDepartment();
								if(department.getType().equals("1")){
									parea = department.getName(); 
								}
								if(department.getType().equals("2")){
									parea = department.getParent().getName()+department.getName();
								}
								if(department.getType().equals("3")){
									parea = department.getParent().getParent().getName() + department.getParent().getName()+department.getName();
								}
								person2Register.setParea(parea);
								person2Register.setPposition("");
								person2Register.setPphone(user.getPhoneNumber());
								
								person2Registers.add(person2Register);
							}
						}
					}
					trainClass2Register.setPerson2Registers(person2Registers);
					trainClass2Register.setBanzhang(banzhang);
					trainClass2Register.setShuji(shuji);
					trainClass2Register.setZuzhang(zuzhang);
					trainClass2Register.setPnum(pnum);
					trainClass2Registers.add(trainClass2Register);
				}
			}
	        dataMap.put("xueyuanmingdan", "");
	        dataMap.put("trainClass2Registers", trainClass2Registers);

	        configuration.setClassForTemplateLoading(this.getClass(), "/cn/mym/sysi/template");  //FTL文件所存在的位置  
	        Template t = null;  
	        t = configuration.getTemplate("registerModel.ftl"); //文件名
	        t.setEncoding("utf-8");  
	        
	        String fileName = sureDocument.getName() + "报名手册.doc";  
	          
	        //ActionContext ctx = ActionContext.getContext(); 
	      //定义输出类型
	        HttpServletResponse response = getResponse();
     		response.reset();
     		response.setHeader("Content-type", "application/msword;charset=ISO8859-1");  
     		response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
     		response.setHeader("Content-disposition", "attachment; filename="+new String(fileName.getBytes(),"ISO8859-1"));
            response.setCharacterEncoding("utf-8");  
            PrintWriter out = response.getWriter();  
            t.process(dataMap, out);  
            out.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
	}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

另类:JAVA用freemarker生成复杂Excel。(freemarker)

上次写了一篇关于生成Word文档:http://blog.csdn.net/zhanwentao2/article/details/7255432。 在生成Excel的时候,大多时候都是使用...

使用freemarker生成word,步骤详解并奉上源代码

步骤 1、 用word编辑好模板 1、 普通字符串替换为 ${string} 2、 表格循环用标签 姓名:${user.userName}   , 性别:${user.sex} 2、    将...

freemarker导出word——让表格数据行数 列数自动变化

行数。列数变化只需定义一个List>      freemarker遍历的话,只需要使用freemarker的标记性语言遍历即可,如图     实现的效果...

java使用freemarker模板导出word(带有合并单元格)文档

前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的。研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有...

jacob 操纵Microsoft Word 进行转移、拆分、合并、插入等操作 结合Freemarker将无所不能

public class ExportQualityWordHandler { private Configuration configuration = null; public Exp...

freemarker 的换行 与 合并单元格

用freemarker来导出word文档时,经常会有换行的问题。在 freemarker中 所对应的换行符就是  。对于静态数据,直接替换即可。对于动态数据用replace方法亦可实现。 第二点就是...

利用Freemarker生成doc文件(包含list循环,ifelse判断,合并单元格,嵌入表格单元格字数过多报错等)

1、利用office等软件打开doc文档,另存为word2003xml形式的文件。 2、修改xml中的需要动态生成的值,Freemarker变量为${data}格式的,修改完改成ftl后缀,复制到加...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用FreeMarker将数据模型中的值合并到模板文件中

 步骤如下:①创建Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例。②使用Configuration实例来生成Template实例,同时需要指定使用的...

FreeMarker生成复杂word(包含图片,表格)

Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各种方式,其实在从Office 2003开始...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用freemarker生成包含合并单元格的表格的word文档
举报原因:
原因补充:

(最多只允许输入30个字)