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

相关推荐
博客18008 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
Non-existent98714 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
shushangyun_14 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉14 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
dayuOK630714 天前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
志栋智能14 天前
超自动化巡检:如何选择适合你的起点?
运维·自动化
HackTwoHub14 天前
Sqli-Scanner SQL注入SKILL自动化挖掘SQL注入,零依赖自动化SQL注入挖掘,赏金猎人
数据库·人工智能·sql·web安全·网络安全·自动化·系统安全
Channing Lewis14 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
csdndeyeye14 天前
拆解AI投简历插件:塔塔网申的技术逻辑和实测数据
人工智能·自动化·秋招·ai投简历插件·ai找工作·求职助手·应届生就业
小白学大数据14 天前
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
开发语言·python·自动化