指定html内容下载为word文档

解决思路是:获取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返回输入流给浏览器后,浏览器自动下载文件。

上一篇:[ionic开源项目教程] - 第11讲 封装BaseController实现controller继承


下一篇:OOP组合和继续的优缺点