如何快速自動生成並定製報表

2021-04-13 08:22:35 字數 3597 閱讀 4560

在 各種管理資訊系統應用中,需要產生大量的報表,通常的做法是由程式設計人員乙個個手工製作,工作效率較低;另外,使用者希望能夠將在應用程式裡查詢得到的結果生 成報表以便列印。為了解決以上兩種問題,本文利用動態生成技術實現了快速自動產生報表,允許使用者手工對報表進行修飾,並將實現過程封裝成乙個類。

1.設計思路

使用過c++ builder或delphi的程式設計人員知道,有乙個tdbgrid控制項,它能以**的形式顯示和操作使用者查詢的資料記錄;而要製作乙個可供列印的報表, 則需要使用tquickrep控制項,在它上面增加tqrlabel、tqrdbtext、tqrshape等控制項,設定它們對應的資料集、資料字段等屬 性,然後編排它們的位置,以**或其它格式顯示出來供預覽和列印,這是乙個很繁瑣的過程。有時,使用者希望能將查詢出來的顯示在tdbgrid控制項的資料打 印出來,按照以往的做法,就需要由程式設計人員按照tdbgrid的顯示內容手工設計報表。在這裡,本文利用動態生成技術,讀出tdbgrid的有關顯示信 息,在tquickrep控制項裡動態生成相應的tqrlabel、    tqrdbtext、tqrshape等控制項,設定各字段的標題和資料以及**分割條。 這是完全可行的,因為在c++ builder裡所有的控制項都可以由程式動態生成,不僅僅是在設計階段才產生的。另外,如果使用者對產生的報表**布局不太滿意,本文提供了介面使使用者可對 報表進行手工調整,調整**的高度、寬度等布局,實現使用者對報表的一定程度的定製。

利用c++的封裝性特點,將自動產生並定製報表的實現封裝成乙個新類tgridprint,對外提供程式設計人員關心的公用介面,遮蔽了內部資訊和具體實現, 體現了物件導向的設計思想,為程式設計人員帶來方便。程式設計人員還可以在它基礎上進一步擴充功能。這樣設計的新類減輕了程式設計人員的工作量,同時為使用者提供了定製 報表的介面,提高了報表的質量和使用者參與的積極性。

2.實現過程

自動產生並定製報表的實現過程包括自動產生和定製兩部分。新類的定義和實現分別在gridprint.h gridprint.cpp檔案裡,另包含3個檔案reprst.h、reprst.cpp、reprst.dfm,它們是已產生的乙個視窗 frmreprst,在它裡面已增加乙個tquickrep控制項,它的屬性bands的各子屬性的值全為true。

2.1 自動產生報表

先定義乙個表示**某一列資訊的結構,在報表裡一列有固定標題和顯示的資料文字兩種資訊,為了能畫出**,每一列固定標題欄和資料欄右邊分別增加乙個分隔 條。在類tgridprint的建構函式裡,先根據傳入的tquickrep *psrcquickrep(報表指標),tdbgrid * psrcdbgrid(資料**指標),tqrband *srctitleband1(報表中的總標題欄指標), tqrband *srccolumnheaderband1(報表中的字段標題欄指標),tqrband * srcdetailband1(報表中的資料欄指標)引數設定類的私有變數。再動態生成並設定總標題文字、字段標題欄矩形框、資料欄矩形框的屬性。然後通 過乙個迴圈,讀出tdbgrid中各字段的標題和資料資訊,動態生成報表中各字段的標題標籤控制項、資料文字控制項以及對應的**分割豎條控制項。在類的析構函 數里,刪除所有由建構函式動態生成的物件。類的列印預覽函式實現報表的列印預覽功能。其它的函式說明略。

自動生成報表類的定義(gridprint.h)

#include //包含的相關標頭檔案

#include

#include

#include

#include

typedef struct tagfieldtype newfieldtype;

class tgridprint;

類的主要公用方法的實現(gridprint.cpp)

tgridprint::tgridprint(tquickrep * psrcquickrep,tdbgrid * psrcdbgrid,tqrband *srctitleband1, tqrband *srccolumnheaderband1,tqrband * srcdetailband1) //建構函式

if(_itotalwidth > titleband1->width)

preleft= ( titleband1->width - _itotalwidth)/2; //使整個**居中

pheadrect= new tqrshape(psrcquickrep); //生成並設定字段標題欄的矩形框

pheadrect->parent= columnheaderband1;

pheadrect->left = preleft; pheadrect->top = 0;

pheadrect->width = _itotalwidth; pheadrect->height= pheadrect->parent->height;

pdetailrect= new tqrshape(psrcquickrep); //生成設定資料行的矩形框

pdetailrect->parent= detailband1;

pdetailrect->left = preleft; pdetailrect->top = -1;

pdetailrect->width = _itotalwidth; pdetailrect->height= pdetailrect->parent->height+1 ;

_iintclearance= 1;

_ifieldcount= pdbgrid->fieldcount; //設定**總列數

for(i=0; i< _ifieldcount;i++) //動態生成各欄位

}tgridprint::~tgridprint() //析構函式

}void tgridprint::dopreview() //列印預覽函式

2.2 定製報表

類的公共介面提供有4個函式setprnttitle、setcolumnswidth、setheadrectheight、 setdetailrectheight,分別是手工設定**的總標題、**各列寬度、字段標題行的高度和資料行的高度。程式設計人員可自己設計相關介面,供 使用者來對報表的布局做進一步的修正,滿足使用者的要求,提高了報表的質量和使用者參與的積極性。實際上,這樣做將程式設計人員在報表設計階段的工作轉交給使用者來 做,避免了原來設計好不能改變的問題。

2.3 呼叫方法

完成類tgridprint的設計後,程式設計人員可以在需要的地方很方便地呼叫它。呼叫前注意包含兩個標頭檔案。呼叫時,需將下面建構函式裡的dbgrid1換成程式介面上實際使用的tdbgrid控制項名字,其它不用改動。

#include "gridprint.h"

#include "reprst.h"

tfrmreprst *pfrmreprst= new tfrmreprst(null);

tgridprint *pgridprint= new tgridprint(pfrmreprst->quickrep1, dbgrid1, pfrmreprst->titleband1, pfrmreprst->columnheaderband1, pfrmreprst->detailband1);

pgridprint->dopreview();

delete pgridprint; delete pfrmreprst;

3.結束語

在前人設計的基礎上,根據任務的需要,採用物件導向的設計方法,可設計出實現目標的新類,並能被繼承和擴充。本文只針對資料**tdbgrid控制項設計的,起拋磚引玉的作用,讀者可在上述思路的基礎上,針對其它格式的報表,進行自動生成報表的設計。

快速生成Excel表並儲存到桌面

使用的是poi 最新的版本 org.apache.poi poi4.1.0 org.apache.poi poi ooxml 4.1.0 下面是我封裝的乙個工具類 ssbfenqi 快速生成excel表並儲存到桌面 date 2019 7 20 timme 14 06 author libangle...

如何快速生成企業Web應用

隨著網際網路的發展,企業認識到 電子化 和 無紙化 辦公是一種必然趨勢,但是企業在資訊化建設中經常望而卻步,主要原因是高昂的建設成本與不可以預估的結果風險。另外軟體服務商經常會面對客戶不斷調整的需求變化,遲遲不能交付,客戶不滿意遲遲不在驗收報告簽字,導致軟體服務商投入的成本無法及時 由於上述的原因,...

如何不讓DataGridView自動生成列

如果不想讓datagridview自動生成與資料來源對應的列,只需要把屬性autogeneratecolumns設為false即可。需要注意 在介面設計的屬性視窗中是看不到autogeneratecolumns屬性的,需要在 中設定,比如在視窗的建構函式中設定 datagridview1.autog...