如何利用MFC自动化Excel,并创建和格式化新的工作簿
使用(MFC)库实现自动化优秀(excel).
介绍了利用OLE自动化创建/格式化``优秀工作簿的技术;它介绍了多种方法/属性(来自优秀类型库),来向工作表添加数据和格式化工作表.
自动化Excel2000和2002的注意
本文示例代码使用了从Excel97``对象库(Excel8.olb)生成的类封装器.
稍微修改,该代码可针对使用Excel2000(Excel9.olb)或Excel2002(Excel.olb)类封装器的自动化客户.
概述
可在MFC.cpp文件中定义事件的处理消息函数中,复制本文中的代码.然而,该代码的目的是展示使用Excel8.olb类型库中定义的IDispatch接口和成员函数的过程.
创建项目步骤
请按以下微软知识库文章中的第1步到12步骤,创建一个使用IDispatch接口和Excel8.olb类型库中定义的成员函数的示例项目:
如何使用MFC和类型库创建自动化项目.
在AutoProjectDlg.cpp文件顶部添加以下行:
cpp
#include "excel8.h"
在AutoProjectDLG.cpp文件中添加以下代码到CAutoProjectDlg::OnRun()中:
示例代码
cpp
//常用的`OLE`变量.
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
Font font;
Range cols;
//启动`Excel`,取应用助手对象.
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Couldn't start Excel and get Application object.");
return;
}
//取一本新的工作薄.
books = app.GetWorkbooks();
book = books.Add (covOptional);
//取第一张表.
sheets =book.GetSheets();
sheet = sheets.GetItem(COleVariant((short)1));
//用"`头`"一次填充`单元格``A1,B1,C1`和`D1`.
range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));
range.SetValue(COleVariant("First Name"));
range = sheet.GetRange(COleVariant("B1"),COleVariant("B1"));
range.SetValue(COleVariant("Last Name"));
range = sheet.GetRange(COleVariant("C1"),COleVariant("C1"));
range.SetValue(COleVariant("Full Name"));
range = sheet.GetRange(COleVariant("D1"),COleVariant("D1"));
range.SetValue(COleVariant("Salary"));
//加粗格式化`A1:D1`,`垂直对齐`=中心.
range = sheet.GetRange(COleVariant("A1"), COleVariant("D1"));
font = range.GetFont();
font.SetBold(covTrue);
range.SetVerticalAlignment(
COleVariant((short)-4108));
//`xlVAlignCenter=-4108`
//用(名字和姓氏)数组填充`A2:B6`.
{
COleSafeArray saRet;
DWORD numElements[]={5,2};
//`5x2`元素数组
saRet.Create(VT_BSTR, 2, numElements);
//请用以下数据填充`5x2`安全数组:约翰.史密斯汤姆.布朗苏.托马斯简.琼斯亚当.约翰逊
FillSafeArray(L"John", 0, 0, &saRet);
FillSafeArray(L"Smith", 0, 1, &saRet);
FillSafeArray(L"Tom", 1, 0, &saRet);
FillSafeArray(L"Brown", 1, 1, &saRet);
FillSafeArray(L"Sue", 2, 0, &saRet);
FillSafeArray(L"Thomas", 2, 1, &saRet);
FillSafeArray(L"Jane", 3, 0, &saRet);
FillSafeArray(L"Jones", 3, 1, &saRet);
FillSafeArray(L"Adam", 4, 0, &saRet);
FillSafeArray(L"Johnson", 4, 1, &saRet);
range = sheet.GetRange(COleVariant("A2"), COleVariant("B6"));
range.SetValue(COleVariant(saRet));
saRet.Detach();
}
//用相对公式`(=A2&" "和B2)`填充`C2:C6`.
range = sheet.GetRange(COleVariant("C2"), COleVariant("C6"));
range.SetFormula(COleVariant("=A2 & \" \" & B2"));
//用公式`(=RAND()*100000)`填充`D2:D6`,
//并应用数字格式.
range = sheet.GetRange(COleVariant("D2"), COleVariant("D6"));
range.SetFormula(COleVariant("=RAND()*100000"));
range.SetNumberFormat(COleVariant("$0.00"));
//自动填充`A:D`列.
range = sheet.GetRange(COleVariant("A1"), COleVariant("D1"));
cols = range.GetEntireColumn();
cols.AutoFit();
//调整季度销售数据的可变量量列.
{
short NumQtrs;
CString msg;
Range resizedrange;
Interior interior;
Borders borders;
//确定显示多少季度的数据.
for(NumQtrs=1;NumQtrs<=3;NumQtrs++)
{
msg.Format("Enter sales data for %d quarter(s) ", NumQtrs);
if(AfxMessageBox(msg,MB_YESNO)==IDYES)
{
break;
}
}
msg.Format("Displaying data for %d quarters.", NumQtrs);
AfxMessageBox(msg);
//从`E1`开始,填充所选列数的`头`.
range = sheet.GetRange(COleVariant("E1"), COleVariant("E1"));
resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));
resizedrange.SetFormula(
COleVariant("=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\""));
//更改`头`的`方向`和`WrapText`属性.
resizedrange.SetOrientation(COleVariant((short)38));
resizedrange.SetWrapText(covTrue);
//填充`头`内部`颜色`.
interior = resizedrange.GetInterior();
interior.SetColorIndex(COleVariant((short)36));
//用公式填充列,并应用数字格式.
range = sheet.GetRange(COleVariant("E2"), COleVariant("E6"));
resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));
resizedrange.SetFormula(COleVariant("=RAND()*100"));
resizedrange.SetNumberFormat(COleVariant("$0.00"));
//给销售数据和`头`加边框.
range = sheet.GetRange(COleVariant("E1"), COleVariant("E6"));
resizedrange= range.GetResize(covOptional, COleVariant(NumQtrs));
borders = resizedrange.GetBorders();
borders.SetWeight(COleVariant((short)2));
//`xlThin=2`
//添加季度销售数据的总计公式,并应用边框.
range = sheet.GetRange(COleVariant("E8"), COleVariant("E8"));
resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));
resizedrange.SetFormula(COleVariant("=SUM(E2:E6)"));
borders = resizedrange.GetBorders();
{
Border bottomborder;
bottomborder = borders.GetItem((long)9);
bottomborder.SetLineStyle( COleVariant((short)-4119));
//`xlDouble=-4119`
bottomborder.SetWeight( COleVariant((short)4));
//`xlThick=4`
}
}
//让应用助手可见,并让用户控制`优秀`.
app.SetVisible(TRUE);
app.SetUserControl(TRUE);
在AutoProjectDLG.cpp中加函数,确保在CAutoProjectDlg::OnRun()前:
cpp
//示例代码
void FillSafeArray(OLECHAR FAR* sz, int iRow, int iCol, COleSafeArray* sa)
{
VARIANT v;
long index[2];
index[0] = iRow;
index[1] = iCol;
VariantInit(&v);
v.vt = VT_BSTR;
v.bstrVal = SysAllocString(sz);
sa->PutElement(index, v.bstrVal);
SysFreeString(v.bstrVal);
VariantClear(&v);
}
在IDE里运行该应用.当对话框出现时(示例创建了一个基于对话框的应用助手),点击"运行"按钮.