Grid++Report Web入门ASPX与MVC使用

引用附件的三个js文件

网站根目录下建立文件夹,将报表插件放在里面

由于报表文件是grf的所以需要web.config中添加下面的mime

 <system.webServer>
    <staticContent>
      <mimeMap fileExtension=".grf" mimeType="报表模板文件" />
    </staticContent>
  </system.webServer>

页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GridReport.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
  <script src="CreateControl.js" type="text/javascript"></script>
	<script src="GRUtility.js" type="text/javascript"></script>
       <script src="GRInstall.js" type="text/javascript"></script>
	<script type="text/javascript">
        //先检查客户端是否已经安装插件
        Install_InsertReport();
        var Installed = Install_Detect();
        if (Installed)
        {
            CreateReport("Report");
        }
        //可以在页面加载的时候加载grf文件,<body onload="window_onload()">
        function window_onload()
        {
           Report.LoadFromURL("Barcode.grf");
        }
        //打印预览
        function btnPreview_onclick()
        {
            if (!Installed)
            {
                alert("请先安装插件!");
                return false;
            }
            Report.LoadFromURL("Barcode.grf");
            //利用ajax参数第一个report对象第二个url,第三个回调函数
            AjaxReportRun(Report, "Data.aspx?ReportType=Barcode", ReportPrintPreview);
         }
    function ReportPrintPreview()
    {
        Report.PrintPreview(true);
    }
	</script>
</head>
<body>
    <form id="form1" runat="server"> 
    <div>
    <input id="btnPreview" onclick="return btnPreview_onclick()" type="button" value="打印预览" />
    </div>
    </form>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//引用三个dll
using System.IO;
using System.Data;
using System.IO.Compression;
namespace GridReport
{
    public partial class Data : System.Web.UI.Page
    {
        //以下枚举指定报表数据的格式类型
        public enum ResponseDataType
        {
            PlainText, //报表数据为XML或JSON文本,在调试时可以查看报表数据。数据未经压缩,大数据量报表采用此种方式不合适
            ZipBinary, //报表数据为XML或JSON文本经过压缩得到的二进制数据。此种方式数据量最小(约为原始数据的1/10),但用Ajax方式加载报表数据时不能为此种方式
            ZipBase64, //报表数据为将 ZipBinary 方式得到的数据再进行 BASE64 编码的数据。此种方式适合用Ajax方式加载报表数据
        };
        public const ResponseDataType DefaultDataType = ResponseDataType.ZipBase64;
        protected void Page_Load(object sender, EventArgs e)
        {
            string Type = Request.QueryString["ReportType"];
            switch (Type)
            {
                case "1a":
                    CreateXmlData();
                    break;
                case "Barcode":
                    CreateBarcodeData();
                    break;
            }
        }
        protected void CreateBarcodeData()
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dt.Columns.Add(new DataColumn("cInvName", typeof(string)));
            dt.Columns.Add(new DataColumn("cInvStd", typeof(string)));
            dt.Columns.Add(new DataColumn("cBarCode", typeof(string)));
            DataRow dr = dt.NewRow();
            dr["cInvCode"] = 123456789;
            dr["cInvName"] = "计算机CPU";
            dr["cInvStd"] = "50*60";
            dr["cBarCode"] = "123456789";
            DataRow dr2 = dt.NewRow();
            dr2["cInvCode"] = "6943620580207";
            dr2["cInvName"] = "水瓶";
            dr2["cInvStd"] = "20*60";
            dr2["cBarCode"] = "6943620580207";
            dt.Rows.Add(dr);
            dt.Rows.Add(dr2);
            ds.Tables.Add(dt);
            string strXml = ds.GetXml();
            ResponseData(this, strXml, DefaultDataType);
        }
        protected void CreateXmlData()
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("CustomerID", typeof(int)));
            dt.Columns.Add(new DataColumn("CompanyName", typeof(string)));
            dt.Columns.Add(new DataColumn("ContactName", typeof(string)));
            dt.Columns.Add(new DataColumn("ContactTitle", typeof(string)));
            dt.Columns.Add(new DataColumn("Address", typeof(string)));
            dt.Columns.Add(new DataColumn("City", typeof(string)));
            dt.Columns.Add(new DataColumn("Region", typeof(string)));
            dt.Columns.Add(new DataColumn("PostalCode", typeof(string)));
            dt.Columns.Add(new DataColumn("Country", typeof(string)));
            dt.Columns.Add(new DataColumn("Phone", typeof(string)));
            dt.Columns.Add(new DataColumn("Fax", typeof(string)));
            DataRow dr = dt.NewRow();
            dr["CustomerID"] = 1;
            dr["CompanyName"] = "CompanyName";
            dr["ContactName"] = "ContactName";
            dr["ContactTitle"] = "ContactTitle";
            dr["Address"] = "Address";
            dr["City"] = "City";
            dr["Region"] = "Region";
            dr["PostalCode"] = "PostalCode";
            dr["Country"] = "Country";
            dr["Phone"] = "Phone";
            dr["Fax"] = "Fax";
            dt.Rows.Add(dr);
            ds.Tables.Add(dt);
            string strXml = ds.GetXml();
            ResponseData(this, strXml, DefaultDataType);//压缩文件
        }
        //将报表XML数据文本输出到HTTP请求此方法是官方的写法
        public static void ResponseData(System.Web.UI.Page DataPage, string DataText, ResponseDataType DataType)
        {
            //报表XML数据的前后不能附加任何其它数据,否则XML数据将不能成功解析,所以调用ClearContent方法清理网页中前面多余的数据
            DataPage.Response.ClearContent();

            if (ResponseDataType.PlainText == DataType)
            {
                // 把xml对象发送给客户端
                //DataPage.Response.ContentType = "text/xml";
                DataPage.Response.Write(DataText);
            }
            else
            {
                //将string数据转换为byte[],以便进行压缩
                System.Text.UTF8Encoding converter = new System.Text.UTF8Encoding();
                byte[] XmlBytes = converter.GetBytes(DataText);

                //在 HTTP 头信息中写入报表数据压缩信息
                DataPage.Response.AppendHeader("gr_zip_type", "deflate");                  //指定压缩方法
                DataPage.Response.AppendHeader("gr_zip_size", XmlBytes.Length.ToString()); //指定数据的原始长度
                DataPage.Response.AppendHeader("gr_zip_encode", converter.HeaderName);     //指定数据的编码方式 utf-8 utf-16 ...

                // 把压缩后的xml数据发送给客户端
                if (ResponseDataType.ZipBinary == DataType)
                {
                    DeflateStream compressedzipStream = new DeflateStream(DataPage.Response.OutputStream, CompressionMode.Compress, true);
                    compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
                    compressedzipStream.Close();
                }
                else //ResponseDataType.ZipBase64
                {
                    MemoryStream memStream = new MemoryStream();
                    DeflateStream compressedzipStream = new DeflateStream(memStream, CompressionMode.Compress, true);
                    compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
                    compressedzipStream.Close(); //这句很重要,这样数据才能全部写入 MemoryStream

                    // Read bytes from the stream.
                    memStream.Seek(0, SeekOrigin.Begin); // Set the position to the beginning of the stream.
                    int count = (int)memStream.Length;
                    byte[] byteArray = new byte[count];
                    count = memStream.Read(byteArray, 0, count);

                    string Base64Text = Convert.ToBase64String(byteArray);
                    DataPage.Response.Write(Base64Text);
                }
            }
            //报表XML数据的前后不能附加任何其它数据,否则XML数据将不能成功解析,所以调用End方法放弃网页中后面不必要的数据
            DataPage.Response.End();
        }
    }
}

测试结果

MVC使用:结果和上面一样

页面基本和上面一样

function ReportPrintPreview() {
            //Report.PrintPreview(true);//打印预览
            Report.Print(true);//直接打印
        }
   function btnPreview_onclick() {
            if (!Installed) {
                alert("请先安装插件!");
                return false;
            }
            Report.LoadFromURL("report/Barcode.grf");
            //请求地址
            AjaxReportRun(Report, "HelloWorld/Report", ReportPrintPreview);
        }

//控制器下的方法
  public ActionResult Report()
        {
            return Content(CreateBarcodeData());
        }
        protected string CreateBarcodeData()
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dt.Columns.Add(new DataColumn("cInvName", typeof(string)));
            dt.Columns.Add(new DataColumn("cInvStd", typeof(string)));
            dt.Columns.Add(new DataColumn("cBarCode", typeof(string)));
            DataRow dr = dt.NewRow();
            dr["cInvCode"] = 123456789;
            dr["cInvName"] = "计算机CPU";
            dr["cInvStd"] = "50*60";
            dr["cBarCode"] = "123456789";
            DataRow dr2 = dt.NewRow();
            dr2["cInvCode"] = "6943620580207";
            dr2["cInvName"] = "水瓶";
            dr2["cInvStd"] = "20*60";
            dr2["cBarCode"] = "6943620580207";
            dt.Rows.Add(dr);
            dt.Rows.Add(dr2);
            ds.Tables.Add(dt);
            string strXml = ds.GetXml();
            return strXml;
           // ResponseData(this, strXml, DefaultDataType);//这里不调用官方方法直接返回xml
        }
posted @ 2026-09-06 09:40  清哥的码农生活  阅读(22)  评论(0)    收藏  举报