报表是信息管理系统中的重要组成部分,其设计与开发方法一般都受到广泛的重视。基于报表模板的思想所编制的报表能很好地满足一些突发的临时报表及用户自定制报表的需求,减轻了报表编程的繁琐,提高了开发的效率。原理在许多信息系统中, 往往需要生成各种各样的报表。制作报表有多种方式,其中直接利用API打印或预览报表程序复杂,且只适用于结构简单的报表打印;如果利用第三方报表控件,能实现复杂的报表打印或预览,但报表模板的设计工具操作繁琐,专业性强,难以满足用户要求。
本文主要介绍基于Word模板的数据库报表的设计。首先按照用户要求利用word制作报表模板,再将数据库中的数据按一定格式填充报表的数据项,应用程序自动生成文档形式的报表,最后调用word的预览和打印功能。用户可以利用Word灵活的文档编辑功能进行修改,使调整后的内容符合打印要求,并保存调整后的状态以备下一次使用,而不需对应用程序的源代码进行修改。将Word 与数据库管理系统有效结合,可以为用户提供较大空间和灵活性。报表模板的创建报表的格式采用功能强大的专业编辑工具来建立与维护。报表的数据项由应用程序负责产生或利用现有的数据填充,从而实现应用程序与报表格式之间的独立性。在程序运行过程中,用户可以任意调整报表中各数据元素的位置、字体、大小、颜色等,或隐藏某些数据元素。Word 是目前最流行的优秀办公软件,功能强大,操作简洁,加上Word 文档能方便地转换成Web 网页等其它格式,因此选择Word 作为报表模板的编辑工具。根据实际要求创建Word文档,然后保存为网页格式。生成报表本例利用ADO对象实现与数据库的连接,根据数据库中的数据按照一定格式填充报表中的数据项。
下面是VC++ .net环境下的部分源代码。
1 连接数据库#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF","adoEOF")
if (!AfxOleInit())
AfxMessageBox("初始化 OLE 库失败");
HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");
if (!SUCCEEDED(hr))
AfxMessageBox("创建 Connection 对象失败");
hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (!SUCCEEDED(hr))
AfxMessageBox("创建 Recordset 对象失败");
CString strConnection;
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Test.mdb;";
m_pConnection->Open(_bstr_t(strConnection), "", "", adModeUnknown);
2 生成报表
CString sSqlCommand;
CString sLineString, sReportString, sTempString;
sSqlCommand = "SELECT * FROM TestTable WHERE RecordID=1";
m_pRecordset->Open((_bstr_t) sSqlCommand, m_pConnection.GetInteRFacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
if (m_pRecordset->RecordCount > 0)
{
// 读取报表数据sReportString
CStdioFile sfFileRead;
if (sfFileRead.Open("reportdata.dat", CFile::modeRead, NULL))
{
while (sfFileRead.ReadString(sLineString))
{
sReportString = sReportString + "\r\n" + sLineString;
}
sfFileRead.Close();
}
// 填充报表的数据项
sTempString.Format("%ld", (short) m_pRecordset->GetCollect("RecordID"));
sReportString.Replace("_RecordID_", sTempString);
sTempString = ((COleDateTime) m_pRecordset->GetCollect("Time")).Format("%Y-%m-%d %H:%M:%S");
sReportString.Replace("_Time_", sTempString);
……
// 将sReportString保存为报表文档
CStdioFile sfFileWrite;
if (sfFileWrite.Open("report.doc", CFile::modeWrite | CFile::modeCreate, NULL))
{
sfFileWrite.WriteString(sReportString);
sfFileWrite.Close();
}
}
3 用Word预览报表
ShellExecute(NULL, "open", "WINWORD.EXE", "report.doc", "", SW_SHOW);
4 打印报表
ShellExecute(this->m_hWnd, "print", "report.doc", "", "", SW_HIDE);
结语
报表作为一般信息系统的通用需求,在信息系统的开发过程中占据着重要的地位。由于没有采用OLE 自动化技术,所以内存开销很小。用报表模板来实现报表的生成和打印,既可以节省开发的工作量,又可以简化程序的维护量,从而大大提高了系统开发的效率。