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

相关推荐
测试修炼手册29 分钟前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
掌心向暖RPA自动化4 小时前
桌面端RPA自动化,鼠标移动点击太机械怎么破?随机取点、贝塞尔移动、光标检测三步走
自动化·影刀rpa·rpa机器人·rpa入门·掌心向暖rpa自动化·rpa定制·rpa教程
码点滴8 小时前
K8s配置与存储运维自动化:从隐形杀手到 AI Agent 安全闭环
运维·人工智能·自动化
写了20年代码的老程序员9 小时前
Excel 导入导出为什么总是把后端逼成字段搬运工
java·excel
Cloud_Shy61810 小时前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十一章 Python 包跟踪器 中篇)
数据库·python·sql·数据分析·excel·web
xG8XPvV5d11 小时前
GitHub Actions自动化部署全攻略
运维·自动化·github
申耀的科技观察11 小时前
【观察】戴尔科技:以“解耦化+自动化”重塑私有云,定义“云智能”进化新范式
运维·科技·自动化
Metaphor69211 小时前
使用 Python 将 Excel 转换为 PDF
python·pdf·excel
Agent产品评测局11 小时前
标准化产品vs定制开发,制造业自动化方案选型横评:2026工业智能体落地深度指南
运维·人工智能·ai·chatgpt·自动化
Wpa.wk12 小时前
APP自动化-Appium原理
运维·appium·自动化