ReportViewer自己寫自定義檔名並下載PDF按鈕

Designed by Freepik
承上篇 其實ReportViewer裡面已經內建非常好用的轉檔功能(PDF, Word,Excel)了,
但你就是會遇到一些(更懶)講求效率的同事,
能不能直接就下載,不要讓我另存新檔,
而且可以幫我把檔名命名完畢!(只有更懶沒有最懶!!!)
好阿~閒閒沒事,我就來幫你想辦法,
(其實我也很懶,引言直接從上一篇複製過來!)

其實就是在Server端產生PDF檔,然後下載而已。
缺點就是,Server上的PDF檔,得另外清理了。
圖片來源Designed by Freepik


  1. 同樣的我們得準備將報表產生為PDF檔的function
private string CreateFile(string szFileType, string szfilename)
{
    string sMSG = "";
    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding = "utf-8";

    string extension;
    try
    {
        byte[] bytes = this.ReportViewer1.LocalReport.Render(szFileType.ToUpper(), null, out mimeType,
           out encoding, out extension, out streamids, out warnings);
        FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(szfilename), FileMode.Create);
        fs.Write(bytes, 0, bytes.Length);
        fs.Close();
        fs.Dispose();
    }
    catch (Exception ex)
    {
        sMSG = ex.Message.ToString();
    }
    return sMSG;
}

  1. 接著再準備一個直接下載檔案的function
public string DownloadFile(string path, string name)
{
    string sMSG = "";
    try
    {
        System.IO.FileInfo file = new System.IO.FileInfo(HttpContext.Current.Server.MapPath(path));
        Response.Clear();
        Response.Charset = "utf-8";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        // 添加頭資訊,為"檔案下載/另存為"對話方塊指定默認檔案名
        Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
        // 添加頭資訊,指定檔大小,讓流覽器能夠顯示下載進度
        Response.AddHeader("Content-Length", file.Length.ToString());
        // 指定返回的是一個不能被用戶端讀取的stream,必須被下載
        Response.ContentType = "application/octet-stream";
        // 把文件stream發送到用戶端
        Response.WriteFile(file.FullName);
        // 停止頁面的執行
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    catch (Exception ex)
    {
        sMSG = ex.Message.ToString();
    }
    return sMSG;
}

  1. 最後就是我們的下載按鈕
protected void btnSavePDF_Click(object sender, EventArgs e)
{
    string sOutPutFile, sServerFile, sMSG;
    sOutPutFile = "檔名_" + Request.QueryString["eventID"].ToString() + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
    sServerFile = @"~/temp/檔名_" + Request.QueryString["eventID"].ToString() + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
    sMSG = CreateFile("PDF", sServerFile);
    if (sMSG.Equals(""))
    {
        sMSG = DownloadFile(sServerFile, sOutPutFile);
        if (!sMSG.Equals(""))
            ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('" + sMSG + "');", true);
    }
    else
        ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('" + sMSG + "');", true);
}

沒有留言:

張貼留言

技術提供:Blogger.