有时,我们打印报表是要打印的数据是好几页的。当然打印时会自动分页打印的,但是这种分页是有很多问题的,比如无法把表格线加上,另外无法把表头自动添加上。

学TdS网m9K页ij28网(http://www.xwangye.com)

那实现一个可打出这种效果的页该如何设计呢?且看下面的分析。

学TdS网m9K页ij28网(http://www.xwangye.com)

大家应该知道css可以控制分页。那我们今天来讲一下如何通过css来分页。

学TdS网m9K页ij28网(http://www.xwangye.com)

假若我们要打一个报表,要求如下:

学TdS网m9K页ij28网(http://www.xwangye.com)

1.带表头

学TdS网m9K页ij28网(http://www.xwangye.com)

2.分页数据格式

学TdS网m9K页ij28网(http://www.xwangye.com)

说明:关于表头,我们要设计到网页中,而不是页眉中。分页我们使用Css的

学TdS网m9K页ij28网(http://www.xwangye.com)

 

学TdS网m9K页ij28网(http://www.xwangye.com)

样式定义如下

以下是代码片段:
<style type="text/css" media=print> 
    .noPrint{display:none} 
    .pageBreak{page-break-before:always}
</style>

学TdS网m9K页ij28网(http://www.xwangye.com)

实现思路就是,我们要用网页做出一个符合条件的网页内容。

学TdS网m9K页ij28网(http://www.xwangye.com)

 

学TdS网m9K页ij28网(http://www.xwangye.com)

Asp实现代码:

学TdS网m9K页ij28网(http://www.xwangye.com)

以下是代码片段:
pageSize=20
rs.open sql,conn,1,1
if rs.eof or rs.bof then
 
else
    i=0
    recordCount=rs.recordcount
    do while not rs.eof
          if i mod pageSize=0 then
              response.write "<center>表头</center>"
              response.write "<table cellspacing=0 cellpadding=2 style='border-collapse:collapse' border=1>"
              Response.Write "<th><td>列名1</td><td>列名2</td><td>列名3</td><td>列名4</td></th>"
          end if
          Response.Write "<tr><td>" & rs(0) & "</td><td>" & rs(1) & "</td><td>" & rs(2) & "</td><td>" & rs(3) & "</td></tr>"
          i=i+1
          if rs.eof or ( i mod pageSize=0) then
               response.write "</table>"
               if i<>recordCount then Response.Write "<div class='pageBreak'></div>" 
          end if
    loop
end if
rs.close
set rs=nothing

学TdS网m9K页ij28网(http://www.xwangye.com)

 

学TdS网m9K页ij28网(http://www.xwangye.com)

Asp.net实现代码:如果以控件制作的话,我们要使用两个数据控件,一个用来循环页,一个用来循环页中的数据。

学TdS网m9K页ij28网(http://www.xwangye.com)

我们外侧控件使用repeater,内侧控件使用gridview,当然你内侧控件也可以使用repeater。

学TdS网m9K页ij28网(http://www.xwangye.com)

下面是页面代码:

学TdS网m9K页ij28网(http://www.xwangye.com)

以下是代码片段:
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
    <ItemTemplate>
      <center>表头</center>    
       <!--页面数据表-->
       <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CssClass="normalTbl"
        DataKeyNames="ID"  Width="98%" align="center" PageSize="20" AllowPaging="true" PagerSettings-Visible="false">
           <Columns>
               <asp:TemplateField HeaderText="序号">
                   <ItemTemplate>
                       <asp:Label ID="lblOrder" runat="server"></asp:Label>
                   </ItemTemplate>
               </asp:TemplateField>
               <asp:BoundField HeaderText="姓名" DataField="Name" >
                   <ItemStyle HorizontalAlign="Center" Width="60px" />
               </asp:BoundField>
               <asp:BoundField HeaderText="性别" DataField="Sex" >
                   <ItemStyle HorizontalAlign="Center" />
               </asp:BoundField>
               <asp:TemplateField HeaderText="出生年月">
                   <ItemTemplate>
                       <asp:Label ID="Label2" runat="server" Text='<%# Bind("BirthDay", "{0:yyyy-MM}") %>'></asp:Label>
                   </ItemTemplate>
               </asp:TemplateField>
             </Columns>
       </asp:GridView>         
    </ItemTemplate>
    <SeparatorTemplate><div class="pageBreak"></div></SeparatorTemplate>
</asp:Repeater>

学TdS网m9K页ij28网(http://www.xwangye.com)

后台代码

以下是代码片段:
private IList<DomainObj> list;
private int pageSize=20;
protected void Page_Load(object sender, EventArgs e)
{
      if(!isPostBack)
      {
            list=GetList();     //取得数据
            int pageCount=list.length/pageSize;   //算出页数
            ArrayList pages = new ArrayList();    //构造页集合
            for (int i = 0; i < pageCount + 1; i++)
                  pages.Add(i.ToString());
            Repeater1.DataSource = pages;         //绑定到Repeater
            Repeater1.DataBind();
      }
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
     {
         GridView grid = (GridView)e.Item.FindControl("GridView1");
         grid.PageSize = pageSize;
         grid.DataSource = list;
         grid.PageIndex = e.Item.ItemIndex;
//       grid.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);    如果需要,还可设置Gridview的事件。
         grid.DataBind();
      }
}

学TdS网m9K页ij28网(http://www.xwangye.com)

以上是使用QWPrint打印分页报表的制作技巧。

学TdS网m9K页ij28网(http://www.xwangye.com)

其实这种思路也可以应用在套打票据的时候。比较有时票据项太多(这种情况一般比较少),可能要打到两张票据上,这时你也可以按照上面的思路去制作一个页面来打印。

学TdS网m9K页ij28网(http://www.xwangye.com)