利用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模板导出word(带有合并单元格)文档

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

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

public class ExportQualityWordHandler { private Configuration configuration = null; public Exp...
  • cicada688
  • cicada688
  • 2014年01月13日 14:38
  • 6645

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

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

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

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

freemarker 生成word,支持一个单元格生成多张图片

  • 2017年05月24日 00:10
  • 916KB
  • 下载

js 实现 动态生成包含合并单元格的表格

  • 2010年03月31日 14:28
  • 1KB
  • 下载

C# 读取Word 表格数据(单元格纵合并)

对于word中存在合并单元格的表格:  下图是对Cells遍历的结果,True表示该行该列的单元格存在,False表示不存在。...
  • shuaishifu
  • shuaishifu
  • 2014年05月08日 11:13
  • 3879

C# 读取Word 表格数据(单元格纵合并)

先介绍一个例子,来说明行中单元格合并(横合并) 与 列单元格合并(纵合并)的区别:    对于上面的表格,对Cells遍历的结果,True表示该行该列的单元格存在,False表示不...
  • u010954794
  • u010954794
  • 2014年05月09日 18:12
  • 602

Aspose.Word控件实现Word文档的操作(创建和合并单元格)

Aspose系列的控件,功能都挺好,之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出,可以实现多样化的报表设计及输出,由于一般输出的内容比较正规化或者多数是表格居多,所以一般...
  • liuwen718
  • liuwen718
  • 2014年05月16日 15:00
  • 3119

让图片填满Word表格里的单元格

(1)情况:让图片充満Word里的表格的单元格(如下图)。 ‍ (2)方法: ①选中整个表格【也可以只选中某单元格】。执行:表格属性——“表格”选项卡——“选项”按钮——把单元格上下左右...
  • luckyboy101
  • luckyboy101
  • 2013年04月06日 16:28
  • 2816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用freemarker生成包含合并单元格的表格的word文档
举报原因:
原因补充:

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