ASP项目中使用DevExpress开发出的报表确实比较强大和灵活,使用起来也比较简单,项目中也经常用到,有时候,隔了很久不用,也容易忘记操作,遂记录报表开发如下:

1.安装DevExpress
参考:Devexpress 14.1安装记录

DevExpress EXCEL导入 devexpress如何使用_html

DevExpress安装好之后,在VS控制栏上,会多出一个DevExpress功能插件,即意味可以直接建DevExpress报表等了

2.项目添加引用

安装完后,再开始建之前,我们先需要给我们的项目添加引用,如果是ASP报表,我们需要添加以下两个引用文件:

DevExpress EXCEL导入 devexpress如何使用_DevExpress EXCEL导入_02

这两个,在DevExpress安装目录bin/framework下,默认安装路径参考:C:\Program Files (x86)\DevExpress 14.1\Components\Bin\Framework\..

添加引用的方式很简单,只需要在VS的引用右键,添加应用,选择 浏览 ,找到安装路径下的bin/framework,选择到截图中两个文件.dll,文件比较多,可以借助搜索筛选

DevExpress EXCEL导入 devexpress如何使用_html_03

3.新建报表

在ASP项目中新建报表,一般需要四个文件:

(1)ReportList.aspx  前端静态网页,为报表未生成的触发显示文件

(2)ReportList.js 报表触发文件对应的js文件,主要任务:一是根据需求完成对ReportList.aspx文件数据的渲染和处理;二是触发报表的生成;

(3)ReportShow.aspx 主要用于DevExpress报表样式文件,完成DevExpress报表的一些基本配置,如报表按钮/保存等一些属性配置,类似清单文件;但是关键的地方在于这个文件ReportShow.aspx.cs下完成了向后端数据发起请求的操作,得到报表数据,用于第四个文件的数据绑定.

(4)ReportShow.cs  这个才是DevExpress报表的核心,里面要完成报表格式的设计和数据绑定.

上次四个文件,从用户请求发表的角度看,其执行顺序也基本从1-4.

3.1 ReportList.aspx  前端静态网页交互界面

完成条件筛选,发起报表等操作,基本没有什么需要注意地方,唯一需要注意的就是需要指定相应的处理js文件

DevExpress EXCEL导入 devexpress如何使用_数据_04

页面参考代码:
这个页面效果路上,主要完成前端交互页面显示和报表触发,然后关键的地方就是需要绑定对应的js处理入口

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CompanyReport.aspx.cs" Inherits="FunnyPig.BookReport.CompanyReport" %>

<!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>
    <meta name="renderer" content="webkit" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
    <link rel="stylesheet" href="/UIAdmin/layui/css/layui.css" media="all" />
    <link rel="stylesheet" href="/UIAdmin/style/admin.css" media="all" />
</head>
<body>
    <div class="layui-fluid">
        <div class="layui-card layui-row  layui-col-space15">

            <div class="layui-col-xs12 layui-col-md12">
                <div class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="lay-admin">
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">接单时间:</label>
                            <input type="text" name="startTime" id="startTime" placeholder="请选择起始时间" autocomplete="off" class="layui-input layui-input-inline"/>  — 
                            <%--<input type="text" id="placeid" name="placeid" class="layui-hide" value="0"/>--%>
                        </div>
                        <div class="layui-inline">
                            <input type="text" name="endTime" id="endTime" placeholder="请选择结束时间" autocomplete="off" class="layui-input layui-input-inline"/>
                        </div>
                        <div class="layui-inline">
                            <button class="layui-btn layuiadmin-btn layui-btn-normal" id="searchBtn">
                                <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
                            </button>
                            <input id="btnClose" type="button" value="button" class="layui-hide" onclick="loadClose()" />
                        </div>

                    </div>
                </div>
            </div>

            <div class="layui-col-xs12 layui-col-md12">
                <div class="layui-card">
                    <div class="layui-card-body">
                        <iframe id="conFrame" name="conFrame" style="width: 100%;" scrolling="no" frameborder="0"></iframe>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script src="/UIAdmin/layui/layui.js"></script>
    <script>
        layui.config({
            base: '/UIAdmin/' //静态资源所在路径
            , version: true
        }).extend({
            index: 'lib/index', //主入口模块
            CompanyReportMod: '{/}/SmartPension/BookReport/CompanyReportMod'//每日报表入口模块
        }).use(['index', 'CompanyReportMod'], function () {
            var CompanyReportMod = layui.CompanyReportMod;
            CompanyReportMod.init();
        });

    </script>
</body>
</html>

3.2 ReportList.js 报表入口响应入口

这里主要完成了:

(1)完成上面交互页面的一些处理,如渲染一些数据,或者处理一些请求参数,用于请求报表数据查询;

(2)这里还有一个关键就是触发Dev报表生成入口,指定了报表生成的入口文件;

layui.extend({
    comm: '{/}/UIAdmin/lib/CommonFunction'
});
layui.define(['index', 'comm', 'laydate', 'jquery', 'ztree', 'form', 'layer'], function (exports) {
    var $ = layui.jquery
        , form = layui.form
        , ztree = layui.ztree
        , layer = layui.layer
        , laydate = layui.laydate
        , comm = layui.comm;
    /**获取近N天*/
    function getRecentDay(day) {
        var today = new Date();
        var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
        today.setTime(targetday_milliseconds);
        var tYear = today.getFullYear();
        var tMonth = today.getMonth();
        var tDate = today.getDate();
        tMonth = doHandleMonth(tMonth + 1);
        tDate = doHandleMonth(tDate);
        return tYear + "-" + tMonth + "-" + tDate;
    }
    function doHandleMonth(month) {
        var m = month;
        if (month.toString().length == 1) {
            m = "0" + month;
        }
        return m;
    }
    laydate.render({
        elem: '#startTime'
                , type: 'date'
                , value: getRecentDay(-30)
    });
    laydate.render({
        elem: '#endTime'
                , type: 'date'
                , value: new Date()
    });
    var index;
    var ifm = document.getElementById("conFrame");
    ifm.height = document.documentElement.clientHeight - 118;
    var obj = {
        init: function () {
            this.queryReg();//初始化列表数据
        },
        queryReg: function () {
            $("#searchBtn").click(function () {
                index = layer.msg('报表生成中,请稍后...', { icon: 16, time: false, shade: 0.3 });
                var url = "CompanyReportShow.aspx?jsonData=";   // 指定报表生成的入口文件
                var parms = form.val("lay-admin");
                console.log(parms);
                url += JSON.stringify(parms);    // 构建了数据请求条件参数
                $("#conFrame").attr("src", url);
            });
        }
    }

    window.loadClose = function () {
        layer.close(index);
    }
    exports('CompanyReportMod', obj);
})

3.3 ReportShow.aspx 清单配置 + 数据请求

(1)主要用于DevExpress报表样式文件,完成DevExpress报表的一些基本配置,如报表按钮/保存等一些属性配置,类似清单文件;

(2)关键的地方在于这个文件ReportShow.aspx.cs下完成了向后端数据发起请求的操作,得到报表数据,用于第四个文件的数据绑定.

清单配置代码,这个基本可以复制,没有特别额外要注意的:

<%@ Register Assembly="DevExpress.XtraReports.v14.1.Web, Version=14.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.XtraReports.Web" TagPrefix="dx" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" style="height:100%">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="/UIAdmin/layui/layui.js"></script>
    <script>
        layui.config({
            base: '/UIAdmin/' //静态资源所在路径
             , version: true
        }).extend({
            index: 'lib/index'//主入口模块
        }).use(['index', 'jquery'], function () {
            var $ = layui.jquery;
            $("#btnClose", parent.document).click();
        });
    </script>
</head>
<body style="height:100%;margin:0px;padding:0px">
    <form id="form1" runat="server" style="height:100%">
        <div style="width:100%;height:100%">
            <dx:ASPxDocumentViewer ID="ASPxDocumentViewer1" runat="server" Theme="DevEx" Height="100%">
                <SettingsReportViewer PageByPage="true" />
                          <ToolbarItems>
                    <dx:ReportToolbarButton ItemKind="PrintReport" ToolTip="打印" />
                    <dx:ReportToolbarSeparator />
                    <dx:ReportToolbarButton Enabled="False" ItemKind="FirstPage" ToolTip="第一页"/>
                    <dx:ReportToolbarButton Enabled="False" ItemKind="PreviousPage" ToolTip="上一页" />
                    <dx:ReportToolbarLabel ItemKind="PageLabel" Text="第:" />
                    <dx:ReportToolbarComboBox ItemKind="PageNumber" Width="65px">
                    </dx:ReportToolbarComboBox>
                    <dx:ReportToolbarLabel ItemKind="OfLabel" Text="页  共:" />
                    <dx:ReportToolbarTextBox ItemKind="PageCount" />
                    <dx:ReportToolbarButton ItemKind="NextPage" ToolTip="下一页" />
                    <dx:ReportToolbarButton ItemKind="LastPage" ToolTip="最后一页" />
                    <dx:ReportToolbarSeparator />
                    <dx:ReportToolbarButton ItemKind="SaveToDisk" ToolTip="保存"  />
                    <dx:ReportToolbarComboBox ItemKind="SaveFormat" Width="70px">
                        <Elements>
                            <dx:ListElement Value="xls" Text="EXCEL" />
                            <dx:ListElement Value="xlsx" Text="EXCEL 2010" />
                            <dx:ListElement Value="rtf" Text="WORD" />
                            <dx:ListElement Value="pdf" Text="PDF" />
                            <dx:ListElement Value="png" Text="图片" />
                        </Elements>
                    </dx:ReportToolbarComboBox>
                </ToolbarItems>
            </dx:ASPxDocumentViewer>
        </div>
    </form>
</body>
</html>

ReportShow.aspx.cs 完成向后端数据请求,并且指定了对应devexpress报表渲染文件,这样第四步中的报表就有相应的数据进行绑定了.

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ViewState["dt"] = getData();
            }
            ReportShow p = new ReportShow (); // 绑定的报表对象的数据
            JObject jobj = JObject.Parse(Request["jsonData"]);

            p.DataSource = ViewState["dt"] as DataTable;
            this.ASPxDocumentViewer1.Report = p;
        }

        private DataTable getData()
        {
            DataTable dt = new DataTable();
            JObject jobj = JObject.Parse(Request["jsonData"]);
            string strsql = "exec companyOrderReport @timeStart,@timeEnd";
            SqlCommand cmd = new SqlCommand(strsql);
            string startTime = "";
            string endTime = "";
            if (!string.IsNullOrEmpty(jobj.Value<string>("startTime")))
            {
                startTime = jobj.Value<string>("startTime");
            }
            else
            {
                startTime = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");
            }
            if (!string.IsNullOrEmpty(jobj.Value<string>("endTime")))
            {
                endTime = jobj.Value<string>("endTime");
            }
            else
            {
                endTime = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
            }
            cmd.Parameters.AddWithValue("@timeStart", startTime);
            cmd.Parameters.AddWithValue("@timeEnd", endTime);
            dt = King.DataBase.SqlServer.GetDataSet(cmd).Tables[0];
            dt.Columns.Add("日期");
            foreach (DataRow dr in dt.Rows)
            {
                dr["日期"] = startTime + "至" + endTime;
            }
            return dt;
        }

3.4 ReportShow.cs 报表设计和数据渲染

这个文件新建和其他文件新建不一样,我们需要新建DevExpress报表文件,然后在这个文件中设计报表和绑定数据,具体操作如下:

DevExpress EXCEL导入 devexpress如何使用_DevExpress EXCEL导入_05

DevExpress EXCEL导入 devexpress如何使用_html_06

DevExpress EXCEL导入 devexpress如何使用_Text_07

DevExpress EXCEL导入 devexpress如何使用_DevExpress EXCEL导入_08

然后,就是做表格了,点开左边的工具,选择XRLabel或者XRTable

DevExpress EXCEL导入 devexpress如何使用_Text_09

DevExpress EXCEL导入 devexpress如何使用_Text_10

如果表格列不够,可以右键insert左右添加列item

DevExpress EXCEL导入 devexpress如何使用_Text_11

表格一般还需要矩形居中对齐,边框设计等,

DevExpress EXCEL导入 devexpress如何使用_Text_12

DevExpress EXCEL导入 devexpress如何使用_html_13

3.5 数据绑定和渲染

DevExpress EXCEL导入 devexpress如何使用_Text_14

如果完成3.4报表的设计,就要给列绑定数据()数据的来源其实在之前那个页面就就已经请求好了,并且里面有一个绑定了一个对应的report)

DevExpress EXCEL导入 devexpress如何使用_Text_15

(1) 设计绑定数据的item

这里需要根据3.3 向后端发请求后获取的数据字段名设计,有多少需要字段就添加多少参数就行.

DevExpress EXCEL导入 devexpress如何使用_数据_16

DevExpress EXCEL导入 devexpress如何使用_DevExpress EXCEL导入_17

DevExpress EXCEL导入 devexpress如何使用_DevExpress EXCEL导入_18

DevExpress EXCEL导入 devexpress如何使用_数据_19

DevExpress EXCEL导入 devexpress如何使用_html_20

最后 这就是 报表显示的样子: