UniGui中使用Grid++Report报表控件主要是通过TUniHTMLFrame控件中嵌入HTML代码来进行调用,我们可以直接在delphi中动态修改这个HTML代码来实现不同数据源及报表模板的报表打印与展示。下面是这是TUniHTMLFrame控件中的HTML属性的代码:
<HTML>
<HEAD>
<TITLE>Web报表(B/S报表)演示 - 最简单例子,用插件在网页中展现报表,实际应用采用 simple_UseCreateControl.htm 的方式更简便</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</HEAD>
<BODY style="margin:0" style="margin:0">
<OBJECT classid="CLSID:E060AFE6-5EFF-4830-B7F0-093ECC08EF37"
codebase="../griectl.cab#Version=5.6.12.325" width="100%" height="100%"
id="ReportViewer" VIEWASTEXT>
<param name="ReportURL" value="####"> <!--报表模板标记,在程序代码中替换-->
<param name="DataURL" value="****"> <!--报表数据URL的文件标记,在程序代码中替换-->
</OBJECT>
<script>
document.getElementById('ReportViewer').ResizeColumnToFit();
document.getElementById('ReportViewer').UpdateViewer();
</script>
</BODY>
</HTML>
注意其中的"#####"及"*****"我们在下面的代码中要动态替换掉这两个地方实现报表模板及数据的动态显示:
下面是Main.pas的代码,很简单:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIForm, uniGUIBaseClasses, uniPanel, uniURLFrame,
uniHTMLFrame, uniButton,System.StrUtils;
type
TMainForm = class(TUniForm)
UniPanel1: TUniPanel;
UniHTMLFrame1: TUniHTMLFrame;
procedure UniFormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function MainForm: TMainForm;
implementation
{$R *.dfm}
uses
uniGUIVars, MainModule, UntCommon, ServerModule;
function MainForm: TMainForm;
begin
Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;
procedure TMainForm.UniFormCreate(Sender: TObject);
var
s,f:string;
t:TStringList;
begin
t:=nil;
//创建时修改Html文件中的ReportUrl,和DataURL的参数。
//s为打印的Html模板
s := StringReplace(UniHTMLFrame1.HTML.Text,'####','files/simple.txt',[rfReplaceAll]);
f:= UniServerModule.LocalCacheURL+ 'simple.xml'; //定义报表数据URL的文件路径及文件名
s := StringReplace(s,'****',f,[rfReplaceAll]); //替换报表数据dataUrl为定义的文件名
UniHTMLFrame1.HTML.Text :=s; //重新给UniHTMLFrame的html属性赋值
try
t := TStringList.Create;
s := DataSetToXml(UniMainModule.UniQuery1); //转换DataSet数据到XML
t.Add(s);
t.SaveToFile(f,TEncoding.UTF8); //创建 报表数据文件文件并写入服务器硬盘,供报表调用
finally
t.Free;
end;
end;
initialization
RegisterMainFormClass(TMainForm);
end.
DataSetToXml命令是用于将dataset的数据转化为一个Grid++Report报表插件需求的xml数据格式,Grid++report报表插件的数据xml格式要求可以到Grid++Report的网站查询:http://www.rubylong.cn下面是DataSetToxml函数所有的UntCommon.pas单元的代码:
unit UntCommon;
interface
uses
Data.db,System.SysUtils,System.StrUtils;
function DataSetToXml(ADataset:tdataset):string;
function SetLeftStr(Astring:string ):string;
function SetRightStr(Astring:string ):string;
implementation
//这里生成一个符合Grid++Report约定的xml数据文件。
function DataSetToXml(ADataset: tdataset): string;
var
FieldCount:Integer;
I: Integer;
begin
Result :='<xml>' +#13#10 ;
ADataset.DisableControls;
ADataset.First;
while not ADataset.Eof do
begin
Result := Result +'<row> ';
for I := 0 to ADataset.FieldCount-1 do
begin
with ADataset.Fields[i] do
case DataType of
ftString:
begin
Result := Result + SetLeftStr(FieldName)+AsString+ SetRightStr(FieldName);
end;
ftSmallint,ftInteger,ftWord:
begin
Result := Result+ SetLeftStr(FieldName) +inttostr(AsInteger)+ SetRightStr(FieldName);
end;
ftBoolean:
begin
Result := Result + SetLeftStr(FieldName)+booltostr(asboolean)+ SetRightStr(FieldName);
end;
ftFloat,ftCurrency:
begin
Result := Result+SetLeftStr(FieldName)+FloatTostr(AsFloat)+ SetRightStr(FieldName);
end;
ftDate:
begin
Result := Result+SetLeftStr(FieldName)+DateToStr(AsDateTime)+ SetRightStr(FieldName);
end;
ftDateTime:
begin
Result := Result+SetLeftStr(FieldName)+DateTimeToStr(AsDateTime)+ SetRightStr(FieldName);
end;
ftAutoInc:
begin
Result := Result + SetLeftStr(FieldName)+inttostr(AsInteger)+ SetRightStr(FieldName);
end;
ftMemo:
begin
Result := Result+ SetLeftStr(FieldName)+AsString+ SetRightStr(FieldName);
end;
end;
end;
Result := Result +'</row> '+#13#10 ;
ADataset.Next;
end;
ADataset.EnableControls;
Result :=Result +'</xml>';
end;
function SetLeftStr(Astring: string): string;
begin
Result :='<'+astring+'>';
end;
function SetRightStr(Astring: string): string;
begin
Result :='</'+astring+'>';
end;
end.
下面是在IE浏览器中正常运行时的截图:
目前Grid++Report还不能跨IE\谷歌\firefox浏览器使用,需要跨平台的朋友可以暂时无视。据说Grid++Report目前正在开发firefox的插件,以grid++report的一贯风格来讲,新旧版本的兼容性做的好,如果grid++report from firefox插件能推出来,旧项目的代码应该不会有太多修改,所以grid++report from firefox插件是一个非常值得期待的版本。