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

VC++ 自動化操作 Office (Word/Excel) 導出表格資料實作

     編輯:VC 教學

前置作業:匯入 Type Library

  1. 類向導 → Automation → Add Class → From Type Library。
  2. 瀏覽選擇 EXCEL9.OLB (Office 2000) 或 EXCEL.EXE、MSWORD.OLB。
  3. 選擇需用類別 (如 _Application, _Workbook, _Worksheet, Range) 產生包裝類別。

命名空間衝突解決

Word 與 Excel 包裝類別有同名類別 (如 Range, Font),導致連結錯誤。解決:將其中一個 (如 Excel) 包裝標頭檔整體包入命名空間:

// Excel9.h 修改
namespace Excel9 {
    // 原始產生的所有類別定義...
}
// 使用時
using namespace Excel9;
_Application app; // Word 用全域
Excel9::_Application excelApp; // Excel 用命名空間

核心導出流程 (以 Excel 為例)

void ExportToExcel(CString filePath, CString sheetName, 
                   int rows, int cols, vector>& data)
{
    COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); // 選填參數
    _Application app;
    if (FAILED(app.CreateDispatch(_T("Excel.Application")))) return;

    app.SetVisible(FALSE); // 背景執行
    _Workbook book = app.GetWorkbooks().Add(vOpt);
    _Worksheet sheet = book.GetWorksheets().GetItem(COleVariant((short)1));
    sheet.SetName(sheetName);

    // 批次寫入:建立 Range 陣列一次寫入 (高效)
    CString startCell = _T("A1");
    CString endCell; endCell.Format(_T("%c%d"), 'A' + cols - 1, rows);
    CString rangeAddr = startCell + _T(":") + endCell;
    
    Range range = sheet.GetRange(COleVariant(rangeAddr));
    COleSafeArray sa; // 二維 SAFEARRAY
    sa.Create(VT_BSTR, 2, rows, cols); // 需轉換維度順序
    for (int r = 0; r < rows; ++r)
        for (int c = 0; c < cols; ++c)
            sa.PutElement(&r, &c, COleVariant(data[r][c]).pbstrVal);
    
    range.SetValue(COleVariant(sa)); // 一次寫入全部

    // 設定邊框 (原文片段)
    range.GetBorders().SetLineStyle(COleVariant((short)1)); // 實線
    range.GetBorders().SetWeight(COleVariant((short)2));    // 粗細
    range.GetBorders().SetColorIndex(COleVariant((short)1)); // 黑色

    book.SaveAs(COleVariant(filePath));
    book.Close(COleVariant(FALSE), vOpt, vOpt);
    app.Quit();
}

Word 表格導出要點

_Application wordApp;
wordApp.CreateDispatch(_T("Word.Application"));
_Document doc = wordApp.GetDocuments().Add();
Table table = doc.GetTables().Add(wordApp.GetSelection().GetRange(), rows, cols);
for (int r = 1; r <= rows; ++r)
    for (int c = 1; c <= cols; ++c)
        table.Cell(r, c).GetRange().SetText(data[r-1][c-1]);
doc.SaveAs(filePath);
doc.Close();
wordApp.Quit();

關鍵提醒

  • COM 初始化:執行緒需 CoInitialize(NULL) / CoUninitialize() (AfxOleInit 已處理)。
  • 錯誤處理:所有 Dispatch 呼叫檢查 HRESULT,善用 COleDispatchException 捕獲。
  • 效能:嚴禁逐儲存格寫入 (極慢),務必用 SafeArray 批次寫入 Range。
  • 版本相容:早期繫結 (包裝類別) 綁定特定 Office 版本;跨版本部署建議改用晚期繫結 IDispatch 或 #import 配合 auto_ptr。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved