解决思路是:获取html内容并传到后台,后台把html内容转换为输入流再传给浏览器,浏览器直接下载
1.获取html内容并传到后台
$("#zxjdck .ad-xzzy-anniu").click(function(){ //文件名 var filename = $("#zxjdck .ad-jrzy-name").text();(例如:test.doc) //文件内容 var zyHtml = '<?xml version="1.0"?> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"> <w:docPr> <w:view w:val="print"/><w:zoom w:percent="150"/> </w:docPr><w:body>'; zyHtml += '<w:p><w:pPr><w:outlineLvl w:val="'+outlineLvl+'"/> <w:spacing w:line="400" w:lineRule="auto"/></w:pPr> <w:r><w:rPr><w:b w:val="on"/></w:rPr> <w:t>' + 文件内容+'</w:t>/w:r></w:p>'; //模拟表单提交 var html = ''; html += '<form id="downForm" action="zxzyjd!htmlToWord.action" method="post" style="display:none">' ; html +='<input type="hidden" name="zyHtml" value="'+zyHtml+'"></input>'; html += '<input type="hidden" name="fileName" value="'+encodeURI(filename)+'.doc"></input>'; html += '</form>'; $("#zxjdck").append(html); $("#downForm").submit();
其中zyHtml部分使用wordXML处理,其中
encodeURI(filename) 为解决IE浏览器下载时文件名乱码问题。
<w:view w:val="print"/><w:zoom w:percent="150"/>表示默认打开为“页面视图”,缩放比例为150%。
具体请参考:
http://www.cnblogs.com/forlina/archive/2011/06/09/2076559.html
http://www.microsoft.com/china/msdn/library/office/office/XMLOfficeWord2003.mspx?mfr=true
2.后台把html内容转换为输入流再传给浏览器:
我使用的是注解方式配置的struts2。
在action中加入注解:
@Result(name = "download" , type = org.apache.struts2.dispatcher.StreamResult.class , value = "inputStream", params = {"contentDisposition","attachment;filename=\"${downloadFileName}\"", "inputName","inputStream", "contentType", "application/octet-stream", "bufferSize","4096" })
action中方法如下:
private String fileName; private String zyHtml; public String getZyHtml() { return zyHtml; } public void setZyHtml(String zyHtml) { this.zyHtml = zyHtml; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String htmlToWord(){ if(fileName!=null){ setFileName(fileName); }else{ setFileName("在线作业.doc"); } return "download"; } public String getDownloadFileName() { try { fileName = new String(fileName.getBytes(), "ISO8859-1"); return fileName; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return ""; } } public InputStream getInputStream(){ try { byte b[] = zyHtml.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream(b); return bais; } catch (Exception e) { e.printStackTrace(); return null; } }
通过fileName和zyHtml的get,set方法获得参数。
通过htmlToWord方法找到注解的result。
result中“inputStream”对应方法getInputStream(),"downloadFileName"对用方法getDownloadFileName()。
result返回输入流给浏览器后,浏览器自动下载文件。