Crystal Reports (水晶報表) 是功能強大的報表設計工具,但官方範例多為完全動態生成,程式碼冗長。本文提供在 VC++ 6.0 + Windows 2000 環境下,使用預先設計好的 .rpt 模板檔案,透過 COM 介面快速顯示報表的最簡單流程。
在 stdafx.h 或對話框標頭檔頂部加入:
#import "C:\\Program Files\\Common Files\\Crystal Decisions\\2.5\\bin\\craxdrt9.dll" no_namespace
路徑請依實際安裝位置調整。no_namespace 讓介面指標 (如 IApplicationPtr) 直接可用,無需 craxdrt:: 前綴。
// 報表引擎介面
IApplicationPtr m_Application;
IReportPtr m_Report;
// 報表檢視器 ActiveX 控件
// 在對話框編輯器右鍵 → Insert ActiveX Control → Crystal Report Viewer Control 9
CCrystalReportViewer9 m_CRViewer1;
try
{
// 1. 建立應用程式物件
m_Application.CreateInstance(__uuidof(Application));
// 2. 開啟預先設計的 .rpt 檔
m_Report = m_Application->OpenReport(_bstr_t("C:\\Reports\\staff.rpt"));
// 3. 設定報表屬性
m_Report->put_ReportTitle(_bstr_t("員工名冊"));
m_Report->PutReportAuthor(_bstr_t("xiaojin"));
// 4. 設定資料庫登入 (SQL Server)
// 參數: Server, Database, User, Password
m_Report->Database->Tables->Item[1]->SetLogOnInfo(
_bstr_t("(local)"), _bstr_t("staff"), _bstr_t("sa"), _bstr_t("sa"));
// 5. 指定 SQL 查詢 (覆蓋報表內建查詢)
m_Report->put_SQLQueryString(_bstr_t("SELECT * FROM person WHERE id < '4' ORDER BY id"));
// 6. 進階篩選 (Crystal 語法,功能同 SQL)
m_Report->PutRecordSelectionFormula(_bstr_t("{person.id}='1'"));
// 7. 不顯示重複記錄
m_Report->PutEnableSelectDistinctRecords(TRUE);
// 8. 綁定至檢視器控件
m_CRViewer1.SetReportSource(m_Report);
// 9. 介面微調
m_CRViewer1.SetDisplayToolbar(TRUE); // 顯示工具列
m_CRViewer1.SetDisplayGroupTree(FALSE); // 隱藏群組樹
m_CRViewer1.SetDisplayBorder(FALSE); // 無邊框
// 10. 重新整理並顯示
m_CRViewer1.Refresh();
m_CRViewer1.ViewReport();
}
catch (_com_error& e)
{
AfxMessageBox(_T("報表載入失敗: ") + CString(e.ErrorMessage()));
}
| 方法/屬性 | 用途 |
|---|---|
SetLogOnInfo | 設定資料庫連線,必須在 OpenReport 之後、ViewReport 之前呼叫。 |
put_SQLQueryString | 動態覆蓋 SQL 查詢,彈性極高,適合參數化報表。 |
PutRecordSelectionFormula | 使用 Crystal 語法篩選,如 {table.field}='value',不需修改 SQL。 |
Refresh() + ViewReport() | 雙雙呼叫才能確保資料重抓並顯示。 |
craxdrt9.dll 路徑正確,或將 DLL 複製至專案目錄並用相對路徑匯入。本範例省略例外處理細節,實務上請務必包裹 try/catch(_com_error) 並記錄錯誤日誌。