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

VC++ COM 元件實現靈活報表輸出 (YTReport)

     編輯:關於VC++

前言

報表列印是企業應用核心需求。本文提供一個 COM 元件 YTReport,支援動態加入資料、多種表格樣式 (正表/反表/雙聯表)、標題/尾註/製表人、分頁控制,適合快速整合至 VC++/VB/Delphi 等專案。

部署與初始化

// 1. 註冊 COM
regsvr32 YTReport.dll

// 2. stdafx.h 匯入類型庫
#import ".\YTReport.tlb" \
    rename_namespace("TestYTReportDriver") \
    using namespace TestYTReportDriver;

// 3. App 初始化/釋放 COM 環境
CoInitialize(NULL);
// ...
CoUninitialize();

// 4. 建立介面指標
IYTReportAPtr m_YTPrint;
m_YTPrint.CreateInstance(__uuidof(YTReportA));
if (!m_YTPrint) AfxMessageBox(_T("請先註冊 COM"));

// 5. 程式結束釋放
m_YTPrint.Release();

核心介面方法

方法用途關鍵參數
PrePrint準備列印-
SetTitleA/B主/副標題BSTR 文字
SetReportHeadA正表表頭"欄位名|對齊|寬度|..."
SetReportHeadB反表表頭 (統計項)欄位名串列, 列寬, 列數
SetReportHeadC/D反表表頭 (逐列填入)列名串列, 列寬, 首列寬
AddDetail加入明細列"值1|值2|..."
WriteText寫入自由文字/數字/註腳BSTR
Print輸出列印/預覽-
SetTableNo設定表序號BSTR
NewPage強制分頁-
DrawDoubleTable雙聯表上表名, 下表名
SetTableMaker製表人BSTR

使用範例:建立一份銷售明細表


m_YTPrint->PrePrint();
m_YTPrint->SetTitleA(_T("2024 年度銷售明細表"));
m_YTPrint->SetTitleB(_T("單位:新台幣元"));

// 正表表頭:產品|數量|單價|金額
m_YTPrint->SetReportHeadA(_T("產品名|l|15|數量|r|8|單價|r|10|金額|r|12"));

// 逐筆加入明細
m_YTPrint->AddDetail(_T("筆記型電腦|50|25000|1250000"));
m_YTPrint->AddDetail(_T("滑鼠|200|300|60000"));
// ...

m_YTPrint->SetTableMaker(_T("財務部 張三"));
m_YTPrint->Print(); // 彈出列印預覽/選擇印表機

三種表頭模式示意

圖 1:SetReportHeadA - 正表 (橫向欄位)
圖 2:SetReportHeadB - 反表 (統計項為欄)
圖 3:SetReportHeadC - 反表逐列填入

技術特點

  • 純 COM 介面:語言中立,VB/Delphi/C# 皆可呼叫。
  • 動態資料流:無需預先定義資料集,邊計算邊 AddDetail。
  • 豐富排版:對齊 (l/c/r)、欄寬 (字元單位)、自動換行/分頁。
  • 雙聯表:一頁印兩張結構相同表單 (如存根/正本)。
  • 無授權限制:原始碼開放,可自由修改擴充。

已知限制與改進

  • 目前為 GDI 繪製,解析度受限於印表機 DC;可升級 GDI+ / DirectWrite 提升品質。
  • 不支援複雜跨頁表頭重複、條件式樣式;需自行擴充。
  • 大量資料 (>10000 列) 列印前緩衝時間較長,建議分批 NewPage。

完整原始碼 (COM 伺服器 + VC++ 測試客戶端) 可下載,代碼無限制自由使用。

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