HTML页面导出为Word

    protected void btnExport_Click(object sender, EventArgs e)

    {

        string strFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".doc";

        string sHtml = hfdHtml.Value;//前台的HTML传递过来的,注意加ValidateRequest="false"

        string sMht = HtmlToMht(sHtml);

        DnLoadFileFromMemoryStream(strFileName, sMht);

    }



    /// <summary>

    /// 将HTML文本导出到Word或者MHT格式

    /// </summary>

    /// <param name="strHtml"></param>

    /// <returns></returns>

    public static string HtmlToMht(string strHtml)

    {

        strHtml = strHtml.Replace("<", "<").Replace(">", ">");

        StringBuilder sb = new StringBuilder();

        sb.AppendLine("From:");

        sb.AppendLine("Subject:");

        sb.AppendLine("Date:");

        sb.AppendLine("MIME-Version: 1.0");

        sb.AppendLine("Content-Type: multipart/related;");

        sb.AppendLine("\ttype=\"text/html\";");

        sb.AppendLine("\tboundary=\"----=_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"");

        sb.AppendLine("\n");

        sb.AppendLine("------=_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

        sb.AppendLine("Content-Type: text/html;");

        sb.AppendLine("charset=\"gb2312\"");

        sb.AppendLine("Content-Transfer-Encoding: quoted-printable");

        sb.AppendLine("\n");

        sb.AppendLine("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");

        sb.AppendLine("<html xmlns=\"http://www.w3.org/1999/xhtml\">");

        sb.AppendLine("<head>");

        sb.AppendLine("<style>");

        sb.AppendLine("@page WordSection1");

        sb.AppendLine("{size:532.5pt 757.5pt;");

        sb.AppendLine("mso-page-orientation:poPortrait;");

        sb.AppendLine("margin:26.25pt 26.25pt 26.25pt 26.25pt;");

        sb.AppendLine("mso-header-margin:42.55pt;");

        sb.AppendLine("mso-footer-margin:49.6pt;");

        sb.AppendLine("mso-paper-source:0;}");

        sb.AppendLine("div.WordSection1");

        sb.AppendLine("{page:WordSection1;}");

        sb.AppendLine("</style>");

        sb.AppendLine("</head>");

        sb.AppendLine("<body>");

        sb.AppendLine("<div class=3DWordSection1>");

        sb.AppendLine(strHtml.Replace("src=", "src=3D").Replace("style=\"", "style= \\\"")).Replace("rowSpan=", "rowSpan=\\\"")

            .Replace("colSpan=", "colSpan=\\\"").Replace("width=", "width=\\\"").Replace("height=", "height=\\\"");

        sb.AppendLine("</div>");

        sb.AppendLine("</body>");

        sb.AppendLine("</html>");

        sb.AppendLine("\n");

        string[] imgSrcs = GetHtmlImageUrlList(strHtml);

        if (imgSrcs.Length > 0)

        {

            for (int i = 0; i < imgSrcs.Length; i++)

            {

                string strLink = imgSrcs[i];

                string strBianm = ConvertBase64(strLink);

                if (strBianm != "")

                {

                    sb.AppendLine("\n");

                    sb.AppendLine("------=_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

                    sb.AppendLine("Content-Type: image/jpeg");

                    sb.AppendLine("Content-Transfer-Encoding: base64");

                    sb.AppendLine("Content-Location: " + strLink);

                    sb.AppendLine("\n");

                    sb.AppendLine(strBianm);

                    sb.AppendLine("\n");

                }

            }

        }

        sb.AppendLine("------=_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--");

        return sb.ToString();

    }



    /// <summary>

    /// 更改Img等HTML标签从相对路径改为绝对路径,注意HTML里初始化时是什么路径,在后台就是什么路径,它不会在后台变为绝对路径,所以有必要转换一下,不然导出的图片不能显示

    /// </summary>

    /// <param name="sHtmlText"></param>

    /// <returns></returns>

    public static string[] GetHtmlImageUrlList(string sHtmlText)

    {

        // 定义正则表达式用来匹配 img 标签       

        Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);

        // 搜索匹配的字符串       

        MatchCollection matches = regImg.Matches(sHtmlText);

        int i = 0;

        string[] sUrlList = new string[matches.Count];

        // 取得匹配项列表       

        foreach (Match match in matches)

            sUrlList[i++] = match.Groups["imgUrl"].Value;

        return sUrlList;

    }



    /// <summary>

    /// 将图片转换为Base64位格式字符串流

    /// </summary>

    /// <param name="filepath"></param>

    /// <returns></returns>

    public static string ConvertBase64(string filepath)

    {

        //变量

        string result = string.Empty;

        string path = string.Empty;

        if (filepath.Trim().Substring(0, 4) == "http")

        {

            result = string.Empty;

        }

        else

        {

            path = HttpContext.Current.Server.MapPath(filepath);

            //将文件转换为stream

            using (FileStream fs = new FileStream(path, FileMode.Open))

            {

                byte[] buffer = new byte[fs.Length];

                fs.Read(buffer, 0, buffer.Length);

                result = Convert.ToBase64String(buffer); //base64编码

            }

        }

        //返回编码后的字符串

        return result;

    }



    /// <summary>

    /// 将文本流转换为word流

    /// </summary>

    /// <param name="sFileName"></param>

    /// <param name="sContent"></param>

    public static void DnLoadFileFromMemoryStream(string sFileName, string sContent)

    {

        byte[] arrByte = Encoding.UTF8.GetBytes(sContent);

        using (MemoryStream ms = new MemoryStream())

        {

            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;

            HttpContext.Current.Response.ContentType = "application/octet-stream";

            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + sFileName);

            HttpContext.Current.Response.BinaryWrite(arrByte);

        }

    }

 

你可能感兴趣的:(html)