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代码。可能思路不太清晰。。。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战