首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 整合 Crystal Reports 9 (水晶報表) 完整實戰代碼

     編輯:VC 教學

Crystal Reports 是企業級報表標準。本文提供 VC++ 透過 COM 介面 (#import) 整合 Crystal Reports 9 ActiveX 控件 (CCrystalReportViewer9) 的完整步驟:載入 .rpt 模板、設定資料庫連線、動態 SQL 查詢、篩選公式、報表屬性、工具列顯示控制、繫結 Viewer 控件並刷新顯示。

前置準備

  1. 安裝 Crystal Reports 9 (含 ActiveX 控件 crviewer9.dll、設計時元件 craxdrt9.dll)。
  2. VC 專案對話框資源編輯器:右鍵 -> Insert ActiveX Control -> Crystal Report Viewer Control 9,產生類別 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();
}

關鍵 COM 介面說明

介面用途
IApplicationCrystal 引擎進入點,負責開啟/建立報表
IReport單一報表文件操作:資料源、SQL、公式、區段格式
IDatabase/Tables資料表集合,逐一設定登入資訊
CCrystalReportViewer9ActiveX 控件,提供預覽、列印、匯出、縮放、分頁 UI

常見問題排查

  • 「類別未註冊」/CreateInstance 失敗: 確認 craxdrt9.dll、crviewer9.dll 已註冊 (regsvr32),且位元數匹配 (32位專案需32位 Runtime)。
  • 資料庫登入失敗: 檢查 DSN/伺服器名稱、帳號密碼、用戶端驅動程式 (SQL Native Client/ODBC) 是否安裝。
  • 中文亂碼: 確保專案為 Unicode (VS 默認),傳遞字串用 _bstr_t 或 COleVariant。
  • 部署: 目標機需安裝 Crystal Reports Runtime (合併模組 CRRedist2005_x86.msi 等),不可僅複製 DLL。

此整合方式適用於 Crystal Reports 9~11 版本 (型別庫 GUID 不同需調整 #import 路徑),是 VC++ 報表開發的經典方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved