2601Mfc,自动化excel

如何利用MFC自动化Excel,并创建和格式化新的工作簿

使用(MFC)库实现自动化优秀(excel).

介绍了利用OLE自动化创建/格式化``优秀工作簿的技术;它介绍了多种方法/属性(来自优秀类型库),来向工作表添加数据格式化工作表.

自动化Excel20002002的注意

本文示例代码使用了从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运行该应用.当对话框出现时(示例创建了一个基于对话框应用助手),点击"运行"按钮.

相关推荐
tlwlmy2 小时前
python excel图片批量导出
开发语言·python·excel
fqbqrr3 小时前
2601Mfc,自动化excel2
自动化·mfc
0思必得011 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
小小管写大大码12 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
TM1Club13 小时前
AI驱动的预测:新的竞争优势
大数据·人工智能·经验分享·金融·数据分析·自动化
zhang1338308907513 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
GAOJ_K13 小时前
滚珠花键的无预压、间隙调整与过盈配合“场景适配型”
人工智能·科技·机器人·自动化·制造
老百姓懂点AI16 小时前
[测试工程] 告别“玄学”评测:智能体来了(西南总部)基于AI agent指挥官的自动化Eval框架与AI调度官的回归测试
运维·人工智能·自动化
朗宇芯工控17 小时前
注塑机械手控制系统的性能要求有哪些?
科技·自动化·制造·工业·运动控制系统