0

その場で html ドキュメントを生成し、後で .doc 拡張子の word ファイルとしてダウンロードしました。問題は、自分のマシン (localhost) ではロゴ イメージが正常に表示されているのに、コードをサーバーにアップロードするとイメージが表示されないことです。サーバー上のイメージ src に問題は見つかりませんでした。また、サーバーに ms-office がインストールされていませんが、マシンには ms-office がインストールされています。以下は、Wordファイルを生成するための私のコードです。それをチェックして、私の問題を解決できるかどうか教えてください。前もって感謝します。

     public void DownloadWordFormat(string id)
    {
        ViewModel model = FetchContent(id);
        string fileName = Guid.NewGuid().ToString() + ".html";
        string path = MyConfiguration.Instance.DirectoryToDownloadFile + fileName;
        string savePath = Request.MapPath(path);
        string logoPath = Request.MapPath(GetLogo());
        StringBuilder sb = GenerateHTMLForWordDocument(model, logoPath);                

        // Create the file.
        using (FileStream fs = System.IO.File.Create(savePath, 1024))
        {
            Byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString());
            // Add some information to the file.
            fs.Write(info, 0, info.Length);
        }
        Response.Clear();
        Response.ClearContent();
        Response.ClearHeaders();
        Response.Buffer =true;
        Response.WriteFile(savePath);
        Response.ContentType="application/msword";
        string file = model.SessionId + ".doc";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + file);
        Response.Flush();
        Response.End();
        // Delete the file if it exists.
        if (System.IO.File.Exists(savePath))
        {
            System.IO.File.Delete(savePath);
        }


    }

     private static StringBuilder GenerateHTMLForWordDocument(ViewModel model,string logo)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'> ");
        sb.Append("<head>");
        sb.Append("<title></title>");
        sb.Append("<!--[if gte mso 9]><xml> <w:WordDocument>  <w:View>Print</w:View>  <w:Zoom>90</w:Zoom></w:WordDocument></xml><![endif]-->");
        sb.Append("<style>");
        sb.Append("p.MsoFooter, li.MsoFooter, div.MsoFooter");
        sb.Append("{");
        sb.Append("margin:0in;margin-bottom:.0001pt;mso-pagination:widow-orphan;tab-stops:center 3.0in right 6.0in;font-size:12.0pt;");
        sb.Append("}");
        sb.Append("<style>");
        sb.Append("<!-- /* Style Definitions */");
        sb.Append("@page Section1");
        sb.Append("{");
        sb.Append("size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in;mso-header-margin:.5in;mso-footer-margin:.5in;mso-title-page:yes; mso-header: h1;mso-footer: f1;mso-first-header: fh1;mso-first-footer: ff1;mso-paper-source:0;");
        sb.Append("}");
        sb.Append("div.Section1");
        sb.Append("{");
        sb.Append("page:Section1;");
        sb.Append("}");
        sb.Append("table#hrdftrtbl");
        sb.Append("{");
        sb.Append("margin:0in 0in 0in 900in;width:1px;height:1px;overflow:hidden;");
        sb.Append("}");
        sb.Append("-->");
        sb.Append("</style></head>");
        sb.Append("<body lang=EN-US style='tab-interval:.5in'>");
        sb.Append("<div class=Section1>");
        sb.Append(model.Content);
        sb.Append("<table id='hrdftrtbl' border='0' cellspacing='0' cellpadding='0'>");
        sb.Append("<tr><td>");
        sb.Append("<div style='mso-element:header' id=h1 >");
        sb.Append("<div class=MsoHeader >");
        sb.Append("<table width='100%'>");

        sb.Append("<tr><td><img src='" + logo + "' alt='logo' /></td><td style='vertical-align:top'><span>" + model.Session + "&nbsp;(" + model.SessionId + ")</span></td></tr>");
        sb.Append("<tr><td colspan='2'><hr /><br /></td></tr>");
        sb.Append("</table>");
        sb.Append("</div>");
        sb.Append("</div>");
        sb.Append("");

        sb.Append("</td><td>");
        sb.Append("<div style='mso-element:footer' id=f1>");
        sb.Append("<p class=MsoFooter>");
        sb.Append(" <span style=mso-tab-count:2'></span>");
        sb.Append("<table width='100%'>");
        sb.Append("<tr><td colspan='2'><hr /></td></tr>");
        sb.Append("<tr><td align='left'>Page <span style='mso-field-code: PAGE '><span style='mso-no-proof:yes'></span></span> of <span style='mso-field-code: NUMPAGES '></span></td>");
        sb.Append("<td align='right'>Downloaded on: <span> " + DateTime.Now.ToString("dd MMM yyyy h:MM tt") + "</span></td></tr>");
        sb.Append("</table></p></div>");
        sb.Append("<div style='mso-element:header' id=fh1 >");
        sb.Append("<div class=MsoHeader >");
        sb.Append("<table width='100%'>");
        sb.Append("<tr><td><img src='" + logo + "' alt='logo' /></td><td style='vertical-align:top'><span>" + model.Session + "&nbsp;(" + model.SessionId + ")</span></td></tr>");
        sb.Append("<tr><td colspan='2'><hr /><br /></td></tr>");
        sb.Append("</table>");
        sb.Append("</div></div>");
        sb.Append("<div style='mso-element:footer' id=ff1>");
        sb.Append("<p class=MsoFooter><span lang=EN-US style='mso-ansi-language:EN-US'>");
        sb.Append(" <table width='100%'>");
        sb.Append("<tr><td colspan='2'><hr /></td></tr>");

        sb.Append("<tr><td align='left'>Page <span style='mso-field-code: PAGE '><span style='mso-no-proof:yes'></span></span> of <span style='mso-field-code: NUMPAGES '></span></td>");
        sb.Append("<td align='right'>Downloaded on: <span>" + DateTime.Now.ToString("dd MMM yyyy h:MM tt") + "</span></td></tr>");
        sb.Append("</table>");
        sb.Append("<o:p></o:p></span></p>");
        sb.Append("</div>");
        sb.Append("</td></tr>");
        sb.Append("</table>");
        sb.Append("</body></html>");
        return sb;
    }

       private static string GetLogo()
    {
        string logo = Links.Areas.MAL.Content.Images.LOGO_png;
        logo = logo.Substring(0, logo.LastIndexOf("?"));
        return logo;
    }
4

2 に答える 2

0

この問題の解決策を得ました。実は問題はロゴ画像の選び方でした。上記のコードでは、画像パスを取得する行は次のようになります。

Request.MapPath(GetLogo());

ここでの問題は、Request.MapPath() が指定された仮想パスを物理パスにマップすることです。そのため、Word ドキュメントがクライアント マシンにダウンロードされたときに、パス「C:\XYZ\Dev\VNext\Scs.root\Scs\WWW\Areas\OnlineShoping\Content\Images\LOGO」でヘッダー ロゴを探していました。 .png" であり、このパスからのクライアント マシンではなくサーバーにロゴ イメージが存在するため、ダウンロード時に Word ドキュメントに追加されませんでした。次のように絶対パスを指定すると、問題は解決しました。

string path="http://abc.com/Areas/Content/Images/LOGO.png"

したがって、上記のコードは、入力として html データを持つ .doc 拡張子を持つ Word ドキュメントを正常に生成します。また、このコードは ms-office または ms-word をサーバーにインストールする必要はありません

于 2013-05-02T08:24:36.263 に答える