Crystal Reports 是企業級報表標準。本文提供 VC++ 透過 COM 介面 (#import) 整合 Crystal Reports 9 ActiveX 控件 (CCrystalReportViewer9) 的完整步驟:載入 .rpt 模板、設定資料庫連線、動態 SQL 查詢、篩選公式、報表屬性、工具列顯示控制、繫結 Viewer 控件並刷新顯示。
crviewer9.dll、設計時元件 craxdrt9.dll)。CCrystalReportViewer9 (成員變數 m_CRViewer1)。// 1. 匯入型別庫 (路徑依安裝位置調整)
#import "C:\\Program Files\\Common Files\\Crystal Decisions\\2.5\\bin\\craxdrt9.dll" no_namespace
// 2. 成員變數宣告 (對話框 .h)
IApplicationPtr m_Application; // Crystal 應用程式物件
IReportPtr m_Report; // 報表物件
CCrystalReportViewer9 m_CRViewer1; // Viewer 控件
// 3. 具體生成報表流程 (如按鈕事件中)
void CMyDlg::OnGenerateReport() {
HRESULT hr;
// 實例化 Crystal 應用程式
hr = m_Application.CreateInstance(__uuidof(Application));
if (FAILED(hr)) { AfxMessageBox(_T("Crystal Runtime 未安裝")); return; }
// 載入 .rpt 模板檔
_bstr_t rptPath(_T("C:\\Reports\\staff.rpt"));
m_Report = m_Application->OpenReport(rptPath);
if (m_Report == NULL) { AfxMessageBox(_T("載入報表模板失敗")); return; }
// 設定報表標題/作者
m_Report->put_ReportTitle(_bstr_t("員工統計報表"));
m_Report->PutReportAuthor(_bstr_t("Admin"));
// 設定資料庫登入 (Server, Database, User, Password)
// Tables 集合索引從 1 開始
m_Report->Database->Tables->Item[1]->SetLogOnInfo(_bstr_t("(local)"), _bstr_t("staffDB"), _bstr_t("sa"), _bstr_t("sa"));
// 動態指定 SQL 查詢 (覆蓋模板內預設查詢)
m_Report->put_SQLQueryString(_bstr_t("SELECT * FROM Person WHERE ID < '4' ORDER BY ID"));
// 可選:篩選公式 (Crystal 語法),功能類似 WHERE
m_Report->PutRecordSelectionFormula(_bstr_t("{Person.ID}='1'"));
// 去除重複記錄
m_Report->PutEnableSelectDistinctRecords(VARIANT_TRUE);
// 繫結報表到 Viewer 控件
m_CRViewer1.SetReportSource(m_Report);
// Viewer 介面設定
m_CRViewer1.SetDisplayToolbar(TRUE); // 顯示工具列 (列印、匯出、縮放...)
m_CRViewer1.SetDisplayGroupTree(FALSE); // 隱藏左側群組樹
m_CRViewer1.SetDisplayBorder(FALSE); // 無邊框
// 刷新並顯示
m_CRViewer1.Refresh();
m_CRViewer1.ViewReport();
}
| 介面 | 用途 |
|---|---|
IApplication | Crystal 引擎進入點,負責開啟/建立報表 |
IReport | 單一報表文件操作:資料源、SQL、公式、區段格式 |
IDatabase/Tables | 資料表集合,逐一設定登入資訊 |
CCrystalReportViewer9 | ActiveX 控件,提供預覽、列印、匯出、縮放、分頁 UI |
craxdrt9.dll、crviewer9.dll 已註冊 (regsvr32),且位元數匹配 (32位專案需32位 Runtime)。_bstr_t 或 COleVariant。CRRedist2005_x86.msi 等),不可僅複製 DLL。此整合方式適用於 Crystal Reports 9~11 版本 (型別庫 GUID 不同需調整 #import 路徑),是 VC++ 報表開發的經典方案。