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

VC++ 整合 Crystal Reports 實現報表顯示與列印:從靜態到動態建立完整範例

     編輯:關於VC++

前言:為什麼選擇 Crystal Reports

VC++ 無內建報表工具,但搭配 Seagate Crystal Reports 可輕鬆實現專業報表功能。Crystal Reports 4.6 免費隨 VB5/NT BackOffice 附贈,含設計工具與列印控制項;發行時僅需部署控制項相關檔案。最新版 8.0 功能更強但免費版無設計器,建議 4.6 設計報表、8.0 控制項顯示列印,兩版相容。

環境建置與控制項整合

  1. 安裝 Crystal Reports 4.6
  2. 設計報表檔 sample.rpt (參考官方說明)
  3. VC 專案中:Project → Add To Project → Components and Controls
  4. 選取 Registered ActiveX Controls → Crystal Report Control 4.6 → Insert
  5. 類別設定採預設,完成控制項封裝 (產生 CCrystalReport 包裝類別)

情境一:對話方塊中靜態建立控制項列印報表

資源編輯器操作

  • 開啟 IDD_ABOUTBOX 對話方塊
  • 從 Controls 工具列拖入 Crystal Report Control
  • 右鍵屬性 → Control 分頁 → ReportFileName 設為 sample.rpt
  • Print Window 分頁調整位置大小
  • Ctrl+雙擊控制項加入成員變數 m_CrystalReport

程式碼實作

BOOL CAboutDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    
    // 設定父視窗控制代碼 (關鍵步驟)
    m_CrystalReport.SetWindowParentHandle((long)(this->m_hWnd));
    
    // 列印報表到視窗
    m_CrystalReport.PrintReport();
    
    return TRUE;
}

常見問題排查

  • 控制項位置/大小不當 → 調整 Print Window 設定
  • 報表檔案錯誤 (資料源不可用等) → 驗證 .rpt 檔獨立開啟正常
  • 工具列提供縮放、列印等功能,可直接測試列印輸出

情境二:主視窗動態建立控制項開啟/列印報表

ClassWizard 加入命令處理

  • ID_FILE_OPEN → OnFileOpen()
  • ID_FILE_PRINT → OnFilePrint()

完整實作代碼

void CMyReportView::OnFileOpen() {
    char Filter[] = "Crystal Report files (*.rpt)|*.rpt|All files (*.*)|*.*||";
    CRect rect;
    GetClientRect(&rect);
    
    CFileDialog OpenDlg(TRUE, 0, 0, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, Filter, NULL);
    if (OpenDlg.DoModal() != IDOK) return;
    
    CString m_fName = OpenDlg.GetPathName();
    
    // 銷毀舊控制項
    if (m_CrystalReport) m_CrystalReport.DestroyWindow();
    
    // 動態建立控制項
    if (!m_CrystalReport.Create(
            AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
            WS_CHILD | WS_VISIBLE, rect, this, IDC_CRYSTALREPORT1)) {
        AfxMessageBox("控制項建立失敗!");
        return;
    }
    
    // 設定控制項屬性
    m_CrystalReport.SetWindowParentHandle((long)(this->m_hWnd));
    m_CrystalReport.SetWindowBorderStyle(0);       // 無邊框
    m_CrystalReport.SetWindowLeft(0);
    m_CrystalReport.SetWindowTop(0);
    m_CrystalReport.SetWindowControls(FALSE);      // 隱藏工具列
    m_CrystalReport.SetReportFileName(m_fName);    // 設定報表檔
    m_CrystalReport.SetWindowWidth(rect.Width());
    m_CrystalReport.SetWindowHeight(rect.Height());
    
    // 設定報表公式參數 (範例: 公司名稱)
    m_CrystalReport.SetFormulas(0, "Company=\"VC知識庫\"");
    
    // 顯示到螢幕
    m_CrystalReport.SetDestination(0);  // 0=螢幕, 1=印表機
    m_CrystalReport.PrintReport();
}

void CMyReportView::OnFilePrint() {
    if (m_CrystalReport && m_CrystalReport.GetReportFileName() != "") {
        m_CrystalReport.SetDestination(1);  // 輸出到印表機
        m_CrystalReport.PrintReport();
    }
}

關鍵方法速查表

方法用途參數說明
SetWindowParentHandle設定父視窗HWND 控制代碼
SetReportFileName指定 .rpt 檔案完整路徑
SetFormulas設定報表公式索引, "FormulaName=Value"
SetDestination設定輸出目標0=螢幕, 1=印表機, 2=匯出檔案
PrintReport執行列印/顯示無
SetWindowControls顯示/隱藏工具列TRUE/FALSE

版本選擇策略總結

版本設計器控制項建議用途
4.6✅ 免費舊版報表設計
8.0❌ 付費✅ 強大、相容 4.6 格式部署顯示/列印

掌握此整合技術,即可為 MFC 應用程式快速加入專業級報表功能。

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