利用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();  
        }  
	}



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

相关文章推荐

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

Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各种方式,其实在从Office 2003开始...

使用struts2实现数据库数据导出成word文档(项目当中实际用的)

首先,需要准备一个Word(.doc或者.docx)文档的

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

强大的freemarker的介绍

首先先来看看官方对freemarker的介绍: What is FreeMarker? FreeMarker is a "template engine"; a generic tool to g...

动态表单及动态建表实现原理

1 应用场景   项目中往往需要动态的创建一个表单,或者添加一个新的数据模板,这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重。     ...

js 操作 ftl 页面中的动态表格数据

$(document).on("click", '#ButtonList1_btnSaveDraft', function () { var detailList = new Arra...

浅析动态表单

动态表单的应用非常广泛,面对复杂的需求要求,在一些情况下使用动态表单能够解决很多问题。与一般的需求一样,动态表单主要包含两部分:动态表单的定义和显示、动态表单内容的接收与存储。 用例分析: 表单就不用...

freemarker+jstl自定义标签实现动态表单的显示

上一篇文章中,已经对freemarker做了简单的了解;动态表单的概念大家也应该不陌生了,在《浅析动态表单》文章中已经做了一定的分析;jstl自定义标签也比较熟悉了,在此之前已经使用多次了。今天我们就...

通过freemarker生成一个超简单的动态表单例子

Configuration cfg = new Configuration();  Map map = new HashMap();  map.put("username", "");  map.pu...

Sping MVC + Freemarker实现表单提交

下面我以一个用户登录表单提交作为示例 配置Spring MVC + Freemarker,请参考我的另一篇文章, http://blog.csdn.net/yakson/article/detai...
  • yakson
  • yakson
  • 2013-12-11 19:52
  • 9911
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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