java实现的导出word文档

之前没有做过类似的功能,所以第一次接触的时候费了我一天的时间来完成这个功能。先说一下原理,其实就是通过修改后缀来完成的。

需要先用office2013做一个word模板,就是你想要生成的word的模板,保存为xml格式。然后在线格式化一下,这样生成的代码比较规范,然后将后缀修改为ftl,内容为一下格式:、

我使用的方法是通过Action跳转的方法来进行调用的,Action方法如下,

public String exportProWorkOrder(){
			
			/** 取出 参数**/
			
			/** 输出审批  **/
			Template t=null;
	        PrintWriter wt = null;
	        
			try { 
				/** 查询数据 **/
				ProjectWorkOrder pwo = consultingProjectBo.findPWOMessage(18);
				
				Map<String,Object> dataMap=new HashMap<String,Object>();
			    
	            //getData(dataMap);  
			    /** 放置数据 **/
				consultingProjectBo.makeExportProWorkOrderData(pwo,dataMap); 
			    String fn = makeFileName(pwo);
			    
	            //FTL文件所存在的位置  
			    	t = freeMarkerConfiguration.getTemplate("export_proworkorder.ftl"); //文件名  
	            
	            
	            //配置 Response 参数
	    		getResponse().setContentType(
	    				"application/msword; charset=UTF-8");
	            getResponse().setHeader(
						"Content-Disposition",
						"Attachment;filename= "
								+ new String(fn.toString().getBytes(
										//"UTF-8"),"UTF-8"));
										"gb2312"), "ISO8859_1"));//20151030 改为UTF-8 需要兼容性测试
				wt = getResponse().getWriter();
				t.process(dataMap, wt);
				
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        } finally {
	        	if(wt!=null){
	        		wt.flush();
	            	wt.close();	
	        	}
	        }
			return null;
		}
	
	protected String makeFileName(ProjectWorkOrder pwo) {
		if(pwo==null){
			return "文件不存在";
		}
		
		String filename = "";
		if(pwo.getProjectTitle()!=null){
			filename = pwo.getProjectTitle() + "工程造价咨询项目工作交办单" + ".doc";
		}else{
			filename = "工程造价咨询项目工作交办单"+".doc";
		}
		
		return filename;
	}

跳转进入方法中,期中放置数据的方法如下,

public ProjectWorkOrder findPWOMessage(Integer projectId){
		SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); 
		Project project = null;
		List<ProjectDepartment> list = null;
		ProjectEngineering pe = null;
		project = projectBo.findFull(projectId);
		list = projectDepartmentBo.findPDByProjectId(projectId);
		pe = projectEngineeringBo.findPEByProjectId(projectId);
		ProjectWorkOrder pwo = new ProjectWorkOrder();
		  if(projectId != null){
		     pwo.setProjectId(projectId);
		  }
		  if(project.getProject_title() != null){
		     pwo.setProjectTitle(project.getProject_title());
		  }
		  if(project.getBegin_date() != null){
		     pwo.setBeginDate(sdf.format(project.getBegin_date()));
		  }
		  if(project.getEnd_date() != null){
		     pwo.setEndDate(sdf.format(project.getEnd_date()));
		  }
		  if(project.getProject_target() != null){
		     pwo.setProjecTarget(project.getProject_target());
		  }
		  if(project.getMember_id() != null){
			  Member member = memberBo.getCacheMember(project.getMember_id());
		     pwo.setMemberId(member.getMember_name());
		  }
		  if(pe.getPlan_no() != null){
		     pwo.setPlanNu(pe.getPlan_no());
		  }
		  if(pe.getIncrement() != null){
		     pwo.setInvestment(pe.getIncrement());
		  }
		  if(pe.getDo_item() != null){
		     pwo.setDoItem(pe.getDo_item());
		  }
		  if(pe.getKey_point() != null){
		     pwo.setKeyPoint(pe.getKey_point());
		  }
		  if(list != null){
		     pwo.setChild(addtypePlus(list));
		  }
		return pwo;
	}
	/**
	 *将工程造价咨询项目工作交办单导出为word 
	 */
	@Override
	public void makeExportProWorkOrderData(ProjectWorkOrder pwo, Map<String, Object> dataMap) {
			if(pwo==null){
				return;
			}
			if(pwo.getProjectTitle() != null){
			     dataMap.put("ptitle",pwo.getProjectTitle());//项目名称
			}else{
				 dataMap.put("ptitle","无");
			}
			if(pwo.getProjectId() != null){
				 dataMap.put("pid", pwo.getProjectId());//工程id
			}else{
				 dataMap.put("pid", "0");
			}
			if(pwo.getBeginDate() != null){
				 dataMap.put("begindate", pwo.getBeginDate());//项目开始时间
			}else{
				 dataMap.put("begindate", "无");
			}
			if(pwo.getEndDate() != null){
				 dataMap.put("endate", pwo.getEndDate());//结束日期
			}else{
				 dataMap.put("endate", "无");
			}
			if(pwo.getProjecTarget() != null){
				 dataMap.put("ptarget", pwo.getProjecTarget());//目标
			}else{
				 dataMap.put("ptarget", "无");
			}
			if(pwo.getMemberId() != null){
				 dataMap.put("pmemberid", pwo.getMemberId());//负责人
			}else{
				 dataMap.put("pmemberid", "无");
			}
			if(pwo.getPlanNu() != null){
				 dataMap.put("plano", pwo.getPlanNu());//计划编号
			}else{
				 dataMap.put("plano", "无");
			}if(pwo.getInvestment() != null){
				 dataMap.put("investment", pwo.getInvestment());//总投资
			}else{
				 dataMap.put("investment", "无");
			}
			if(pwo.getDoItem() != null){
				 dataMap.put("doitem", pwo.getDoItem());//事项
			}else{
				 dataMap.put("doitem", "无");
			}
			if(pwo.getKeyPoint() != null){
				 dataMap.put("keypoint", pwo.getKeyPoint());//重点
			}else{
				 dataMap.put("keypoint", "无");
			}
			if(pwo.getChild() != null){
				 dataMap.put("list", pwo.getChild());//联系人列表
			}else{
				 dataMap.put("list", "无");
			}
			SimpleDateFormat tempDate = new SimpleDateFormat("yyyy年MM月dd日");    
			String datetime = tempDate.format(DateTimeUtil.getCurrDate());    
			dataMap.put("datetime", datetime);
	}
	/**
	 * 将单位类型数字转换为对应的字符
	 */
	private List<ProjectDepartment> addtypePlus(List<ProjectDepartment> list){
		for (ProjectDepartment projectDepartment : list) {
			if(projectDepartment.getType() == 1){projectDepartment.setTypePlus("委托单位");}
			if(projectDepartment.getType() == 2){projectDepartment.setTypePlus("建设单位");}
			if(projectDepartment.getType() == 3){projectDepartment.setTypePlus("施工单位");}
			if(projectDepartment.getType() == 4){projectDepartment.setTypePlus("监理单位");}
			if(projectDepartment.getType() == 5){projectDepartment.setTypePlus("设计单位");}
			if(projectDepartment.getType() == 6){projectDepartment.setTypePlus("编制单位");}
		}
		return list;
	}

配置文件的信息这里就不在多说了,同时需要修改ftl中的参数,修改方法如下,

 <w:r wsp:rsidRPr="002C3578">
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
                <w:t><![CDATA[${doitem}]]></w:t>
              </w:r>

与jsp中的方法基本一致,

处理list,

如果遇到循环的话,使用如下的方法,

<#list list as bean><!-- Start 循环体 -->
        <w:tr wsp:rsidR="002C3578" wsp:rsidRPr="002C3578" wsp:rsidTr="002C3578">
          <w:trPr>
            <w:trHeight w:val="427"/>
          </w:trPr>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="534" w:type="dxa"/>
              <w:vmerge/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">
              <w:pPr>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
              </w:pPr>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="1596" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">
              <w:pPr>
                <w:spacing w:line="360" w:line-rule="auto"/>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="002C3578">
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
                <w:t><![CDATA[${bean.typePlus}]]></w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2130" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">
              <w:pPr>
                <w:spacing w:line="360" w:line-rule="auto"/>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="002C3578">
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
                <w:t><![CDATA[${bean.department_name}]]></w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2131" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">
              <w:pPr>
                <w:spacing w:line="360" w:line-rule="auto"/>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="002C3578">
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
                <w:t><![CDATA[${bean.linkman}]]></w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2131" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">
              <w:pPr>
                <w:spacing w:line="360" w:line-rule="auto"/>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="002C3578">
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体"/>
                  <wx:font wx:val="宋体"/>
                  <w:sz-cs w:val="21"/>
                </w:rPr>
                <w:t><![CDATA[${bean.phone}]]></w:t>
              </w:r>
            </w:p>
          </w:tc>
        </w:tr>
        </#list><!-- End 循环体 -->

这样就能导出想要的word文档,一定要记住,使用office2013,我试着用WPS,但是生成内容让我很懵逼,全是xml代码。可能思路不太清晰。。。


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值