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

相关推荐
2601_960567966 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化
HiDev_7 小时前
【非标自动化】2、认识元器件(确定目标)
运维·自动化
一次旅行8 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化
我送炭你添花9 小时前
工业现场疑难软故障实录:09 老旧产线,稳定裕量已经被吃光了
机器人·自动化·智能工厂
噢,我明白了9 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
AOwhisky9 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
Urbano10 小时前
夹克与商务单西口袋工序自动化技改研究报告
运维·自动化
MXsoft61816 小时前
成熟的自动化运维平台是什么样的?
运维·数据库·自动化
江边风声16 小时前
PCB自动化收放板机 在薄板制程中的特殊取放策略——0.05mm芯板怎么稳抓不掉
人工智能·科技·自动化·制造·pcb工艺
AI行业说17 小时前
美国布艺市场全品类生产解析——誉财YC-18-M8045四轴模板机的多品种柔性制造方案
大数据·人工智能·自动化·智能家居·自动化缝纫