EXCEL9.OLB (Office 2000) 或 EXCEL.EXE、MSWORD.OLB。_Application, _Workbook, _Worksheet, Range) 產生包裝類別。Word 與 Excel 包裝類別有同名類別 (如 Range, Font),導致連結錯誤。解決:將其中一個 (如 Excel) 包裝標頭檔整體包入命名空間:
// Excel9.h 修改
namespace Excel9 {
// 原始產生的所有類別定義...
}
// 使用時
using namespace Excel9;
_Application app; // Word 用全域
Excel9::_Application excelApp; // 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();
}
_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();
CoInitialize(NULL) / CoUninitialize() (AfxOleInit 已處理)。HRESULT,善用 COleDispatchException 捕獲。SafeArray 批次寫入 Range。IDispatch 或 #import 配合 auto_ptr。