VS2010 C++ 操作Excel表格的编程实现(OLE/COM)

转载请注明原文网址:

http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html

通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文主要研究通过OLE/COM实现对Excel表格的操作。

 

本文源码的应用环境说明:

Windows XP SP3

Microsoft Visual Studio 2010

Microsoft Office Excel 2007

 

1、添加OLE/COM支持。

首先,应用程序必须添加对OLE/COM的支持,才能导入OLE/COM组件。

本文使用的是MFC对话框程序,在创建工程的向导中选中Automation选项即可为程序自动添加相应的头文件和OLE库初始化代码。

通过查看源代码,可以知道在stdafx.h的头文件中,添加了OLE/COM很多类所需添加的头文件。

#include <afxdisp.h>        // MFC 自动化类

同时,在应用程序类的InitInstance函数中,添加了OLE/COM的初始化代码,如下所示:

// 初始化 OLE 库

if (!AfxOleInit())

{

AfxMessageBox(IDP_OLE_INIT_FAILED);

return FALSE;

}
 

2、导入并封装Excel中的接口

Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel的操作。

由于本文只关心对Excel表格中的数据的读取,主要关注几个_ApplicationWorkbooks_WorkbookWorksheets_WorksheetRange等几个接口。Excel的各类接口的属性、方法可以通过MSDNOffice Development进行查询。

VS2010导入OLE/COM组件的接口的步骤为:Project->Class Wizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择

要导入的Excel类型库中的接口。

在完成接口导入后,VS2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。由于标准的C++没有属性访问器,只能添加一个两个存取函数来实现对属性的访问,通过在属性名称前加上get_put_前缀分别实现对属性的读写操作。即,由VC自动完成C++类对接口的封装。

 

本文所导入的接口对应的类和头文件的说明如下所示:

 

Excel接口

导入类

头文件

说明

_Application

CApplicaton

Application.h

Excel应用程序。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,里面包括了Excel应用程序打开的所有工作簿

_Workbook

CWorkbook

Workbook.h

单个工作簿。

Worksheets

CWorksheets

Worksheets.h

单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet

_Worksheet

CWorksheet

Worksheet.h

单个Sheet表格。

Range

CRange

Range.h

一定数量的单元格,可对单元格进行单个或多个单元格进行操作

 

3、导入Excel的整个类型库

接口对应类只是对接口的属性和方法进行了封装,而Excel中的数据类型,如枚举类型却并为并不能使用,因此,为了更方便的操作Excel,还需要导入Excel的数据类型。

通过查看导入接口对应的头文件可以发现,在所有导入接口的头文件中,都会有这么行:

#import "D:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace

这行代码的作用是导入Excel整个类型库到工程中。

VS2010自动产生的导入代码存在以下几个问题:

1)如果导入了多个接口,每个头文件都会把类型库导入一次,如果引用多个头文件,会导致类型库重复导入。

2Excel类型库中有些类型会跟MFC类库的某些类型冲突。

3Excel类型库的某些类型跟其他OfficeVB的某些库相关,如果不导入相关库,将导致这些类型无法使用。。

以上三点问题的解决方法如下:

1)仅在_Application接口对应头文件中导入Excel类型库。

2)对冲突的类型进行重命名。

3)在导入Excel类型库之前,先导入OfficeVB的相关库。

更改后的导入类型库的代码如下:

 

/*导入Office的类型库*/

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" \

rename("RGB", "MSORGB") \

rename("DocumentProperties", "MSODocumentProperties")

using namespace Office;

 

/*导入VB的类型库*/

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

using namespace VBIDE;

 

/*导入Excel的类型库*/

#import "D:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" \

rename("DialogBox", "ExcelDialogBox") \

rename("RGB", "ExcelRGB") \

rename("CopyFile", "ExcelCopyFile") \

rename("ReplaceText", "ExcelReplaceText") \

no_auto_exclude

Using namespace Excel;

 

编译程序后,会在DebugRelease目录下生成三个文件mso.tlhvbe6ext.tlhexcel.tlh。通过打开文件可知,该三个文件的命名空间分别是OfficeVBIDEExcel。导入了Excel的整个类型库后,就可以使用Excel中的所有类型了。

 

4、操作Excel步骤

操作Excel的主要步骤如下:

1)创建一个Excel应用程序。

2)得到Workbook的容器。

3)打开一个Workbook或者创建一个Workbook

4)得到Workbook中的Worksheet的容器。

5)打开一个Worksheet或者创建一个WorkSheet

6)通过RangeWorkSheet中的单元格进行读写操作。

7)保存Excel

8)释放资源。

 

5、批量处理Excel表格

VC通过OLE/COM操作Excel,是通过进程间的组件技术。因此,每次读写Excel中的单元格时,都要进行进程间的切换。当数据量大,如果一个单元格一个单元格的读取,主要的时间都花费在进程切换中。因此读取多个单元格,将可有效的提高程序的运行效率。

对多个单元格的读写操作可以通过CRange中以下两个成员函数来完成。

VARIANT get_Value2();

void put_Value2(VARIANT& newValue);

其中,输入参数newValue只要输入一个二维数组,即可实现向Excel中一次写入多个单元格的值。

其中,VARIANT中实现二维数据的方法可参考

http://www.cnblogs.com/xianyunhe/archive/2011/09/13/2174703.html

当然,在对CRange类进行操作之前,要设置CRange类对应的单元格。

 

6Excel表格的保存

1)如果要保存打开的工作簿,使用CWorkbook类的Save函数就可以保存工作簿,原文件将被覆盖。

2)如果是新创建的工作簿,或者是要另存为,可使用CWorkbook类的SaveAs函数。

SaveAs的参数比较多。其中,第1个参数是设置要保存文件的路径;第2个参数是设置文件的格式,可在MSDN中查看枚举类型XlFileFormat来了解Excel的文件格式。经过测试,在本文所用的测试环境中,Excel2003的文件格式是xlExcel8Excel2007的文件格式是xlExcel4

 

7、获取当前Excel的版本

可以通过CApplicationget_Version函数来获得Excel的版本,其中,Excel2007的主版本号是12Excel2003的主版本号是11

 

8、示例源代码

主要代码如下:

 

View Code
复制代码
    m_ListCtrl.SetExtendedStyle(LVS_REPORT | LVS_EX_FULLROWSELECT);

    CApplication ExcelApp;
    CWorkbooks books;
    CWorkbook book;
    CWorksheets sheets;
    CWorksheet sheet;
    CRange range;
    LPDISPATCH lpDisp = NULL;

    //创建Excel 服务器(启动Excel)
    if(!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
    {
        AfxMessageBox(_T("启动Excel服务器失败!"));
        return -1;
    }

    /*判断当前Excel的版本*/
    CString strExcelVersion = ExcelApp.get_Version();
    int iStart = 0;
    strExcelVersion = strExcelVersion.Tokenize(_T("."), iStart);
    if (_T("11") == strExcelVersion)
    {
        AfxMessageBox(_T("当前Excel的版本是2003。"));
    }
    else if (_T("12") == strExcelVersion)
    {
        AfxMessageBox(_T("当前Excel的版本是2007。"));
    }
    else
    {
        AfxMessageBox(_T("当前Excel的版本是其他版本。"));
    }

    ExcelApp.put_Visible(TRUE);
    ExcelApp.put_UserControl(FALSE);

    /*得到工作簿容器*/
    books.AttachDispatch(ExcelApp.get_Workbooks());

    /*打开一个工作簿,如不存在,则新增一个工作簿*/
    CString strBookPath = _T("C:\\tmp.xls");
    try
    {
        /*打开一个工作簿*/
        lpDisp = books.Open(strBookPath, 
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 
            vtMissing, vtMissing, vtMissing, vtMissing);
        book.AttachDispatch(lpDisp);
    }
    catch(...)
    {
        /*增加一个新的工作簿*/
        lpDisp = books.Add(vtMissing);
        book.AttachDispatch(lpDisp);
    }
    

    /*得到工作簿中的Sheet的容器*/
    sheets.AttachDispatch(book.get_Sheets());

    /*打开一个Sheet,如不存在,就新增一个Sheet*/
    CString strSheetName = _T("NewSheet");
    try
    {
        /*打开一个已有的Sheet*/
        lpDisp = sheets.get_Item(_variant_t(strSheetName));
        sheet.AttachDispatch(lpDisp);
    }
    catch(...)
    {
        /*创建一个新的Sheet*/
        lpDisp = sheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);
        sheet.AttachDispatch(lpDisp);
        sheet.put_Name(strSheetName);
    }

    system("pause");

    /*向Sheet中写入多个单元格,规模为10*10 */
    lpDisp = sheet.get_Range(_variant_t("A1"), _variant_t("J10"));
    range.AttachDispatch(lpDisp);

    VARTYPE vt = VT_I4; /*数组元素的类型,long*/
    SAFEARRAYBOUND sabWrite[2]; /*用于定义数组的维数和下标的起始值*/
    sabWrite[0].cElements = 10;
    sabWrite[0].lLbound = 0;
    sabWrite[1].cElements = 10;
    sabWrite[1].lLbound = 0;

    COleSafeArray olesaWrite;
    olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);

    /*通过指向数组的指针来对二维数组的元素进行间接赋值*/
    long (*pArray)[2] = NULL;
    olesaWrite.AccessData((void **)&pArray);
    memset(pArray, 0, sabWrite[0].cElements * sabWrite[1].cElements * sizeof(long));

    /*释放指向数组的指针*/
    olesaWrite.UnaccessData();
    pArray = NULL;

    /*对二维数组的元素进行逐个赋值*/
    long index[2] = {0, 0};
    long lFirstLBound = 0;
    long lFirstUBound = 0;
    long lSecondLBound = 0;
    long lSecondUBound = 0;
    olesaWrite.GetLBound(1, &lFirstLBound);
    olesaWrite.GetUBound(1, &lFirstUBound);
    olesaWrite.GetLBound(2, &lSecondLBound);
    olesaWrite.GetUBound(2, &lSecondUBound);
    for (long i = lFirstLBound; i <= lFirstUBound; i++)
    {
        index[0] = i;
        for (long j = lSecondLBound; j <= lSecondUBound; j++)
        {
            index[1] = j;
            long lElement = i * sabWrite[1].cElements + j; 
            olesaWrite.PutElement(index, &lElement);
        }
    }

    /*把ColesaWritefeArray变量转换为VARIANT,并写入到Excel表格中*/
    VARIANT varWrite = (VARIANT)olesaWrite;
    range.put_Value2(varWrite);

    system("pause");

    /*根据文件的后缀名选择保存文件的格式*/
     CString strSaveAsName = _T("C:\\new.xlsx");
    CString strSuffix = strSaveAsName.Mid(strSaveAsName.ReverseFind(_T('.')));
    XlFileFormat NewFileFormat = xlOpenXMLWorkbook;
    if (0 == strSuffix.CompareNoCase(_T(".xls")))
    {
        NewFileFormat = xlExcel8;
    }
    book.SaveAs(_variant_t(strSaveAsName), _variant_t((long)NewFileFormat), vtMissing, vtMissing, vtMissing, 
        vtMissing, 0, vtMissing, vtMissing, vtMissing, 
        vtMissing, vtMissing);

    system("pause");

    /*读取Excel表中的多个单元格的值,在listctrl中显示*/
    VARIANT varRead = range.get_Value2();
    COleSafeArray olesaRead(varRead);

    VARIANT varItem;
    CString strItem;
    lFirstLBound = 0;
    lFirstUBound = 0;
    lSecondLBound = 0;
    lSecondUBound = 0;
    olesaRead.GetLBound(1, &lFirstLBound);
    olesaRead.GetUBound(1, &lFirstUBound);
    olesaRead.GetLBound(2, &lSecondLBound);
    olesaRead.GetUBound(2, &lSecondUBound);
    memset(index, 0, 2 * sizeof(long));
    m_ListCtrl.InsertColumn(0, _T(""), 0, 100);
    for (long j = lSecondLBound; j<= lSecondUBound; j++)
    {
        CString strColName = _T("");
        strColName.Format(_T("%d"), j);
        m_ListCtrl.InsertColumn(j, strColName, 0, 100);
    }
    for (long i = lFirstLBound; i <= lFirstUBound; i++)
    {
        CString strRowName = _T("");
        strRowName.Format(_T("%d"), i);
        m_ListCtrl.InsertItem(i-1, strRowName);

        index[0] = i;
        for (long j = lSecondLBound; j <= lSecondUBound; j++)
        {
            index[1] = j;
            olesaRead.GetElement(index, &varItem);

            switch (varItem.vt)
            {
            case VT_R8:
                {
                    strItem.Format(_T("%d"), (int)varItem.dblVal);
                }

            case VT_BSTR:
                {
                    strItem = varItem.bstrVal;
                }

            case VT_I4:
                {
                    strItem.Format(_T("%ld"), (int)varItem.lVal);
                }

            default:
                {

                }
            }

            m_ListCtrl.SetItemText(i-1, j, strItem);
        }
    }



    /*释放资源*/
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    ExcelApp.Quit();
    ExcelApp.ReleaseDispatch();
复制代码


示例源代码的工程文件的下载链接如下:

http://files.cnblogs.com/xianyunhe/ReadWriteExcel.rar

 

参考资料

1http://www.cnblogs.com/xianyunhe/archive/2011/09/13/2174703.html

2http://hfp0601.blog.163.com/blog/static/228483522011031104718762/

3http://www.cppblog.com/sleepwom/archive/2009/10/03/97804.html

4http://www.rondebruin.nl/saveas.htm

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++Builder精彩编程实例集锦的源代码(1,2,3部分): 第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代码控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编码和解码 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二)
一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在Excel2002/2003中使用。 OBS.DLL的主要功能是制作和编辑OBS文档,一种类似TreeView控件的文档。换句话说,OBS.DLL将Excel表格变成了一个功能强大的超级TreeView控件!普通TreeView控件只能显示一列数据(仅一个字段),而OBS表格却可以显示更多的列(N个字段),而且每个字段都可以汇总(这一点又要比Excel自身的分类汇总更直观、简单),再配合VBA,可以让您轻松驾驭超灵无比的Excel! 当然,OBS.DLL还具备一些很有特色的功能,对Excel的功能来说,应该是一个很好的补充。如: 1、中文简繁互换:在简体中文和繁体中文之间进行转换。 2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、数字签名:对Excel表格中的内容进行签名保护,主要是防止提供者提供的内容被非法修改。可以用于Excel公文的电子签名,实现真正的无纸办公... 5、保存为图片文件:相当于Excel的照相机功能(有过之而无不及)。可以将Excel中的单元格区域、Shape对象、图片、图表等(甚至是组合形式)以gif、jpg、bmp等各式保存到磁盘中。 6、全功能批注----真正所见即所得的批注编辑器。 7、VB/VBA代码归纳与重写:对VB/VBA代码进行混淆,大大降低代码的可读性,是一种保护VB/VBA代码的很有效的方法。详细的注释说明和一目了然的名称将有助于设计阶段的调试和查错,但是代码一旦发布后,这些优点将会使黑客轻而易举地破解你的成果,呵呵,用这个吧,保证黑客对您的VB/VBA代码一点兴趣和胃口都没有!! 8、解除Excel文档的内部密码。很多时候,我们需要设置Excel表格/工作簿的保护密码,可是随着时间的推移,这些密码很可能遗忘了,怎么办?很着急啊!!!哈哈,用这个保证在2分钟之内解决问题(换个角度:不要再自欺欺人了,Excel的内部密码形同虚设)。 9、信息加密/解密。对Excel文档中的一些敏感信息进行加密处理,即使文档被破解了,里面的信息仍然很安全。可以说这个功能是对Excel安全的一个有力补充。 10、工程代码锁定解锁器。可以撤销Excel的VBA保护密码(对word、Access同样有效) 11、控制和保存功能。这个功能能满足我们不用记一个密码就能非常有效地保护我们的Excel文档,而且可以免除来自微软的威胁。 12、Cookie管理器。在信息时代,没有网络怎么可以?上网时间长了,就会发现在临时文件夹中挤满了cookies,不但占据磁盘空间,而且还可能泄露秘密。用“清理cookie”命令吧,又觉得有些没有必要删,否则下次还得再输一遍;一个一个删吧,东西太多,想都不能想。怎么办??用这个啊!!只要一次性设置要保留的cookie并选中“退出Excel时自动清理”即可。以后只要退出Excel,你的cookies目录中就不会再有其它乱七八糟的cookie了。 13、超级预览。可以根据当前的选择内容自动调整预览对象。如过选中的是单元格区域,就只预览你选中的区域;如果选中的是图表,则仅预览选中的图表;如果只是一个单元格,则自动显示分页符... ... 14、屏幕锁定。当我们需要临时离开电脑而又不想关闭Excel文档时(并不局限于Excel文档,也可以是其它,但前提是要运行Excel),可以启动这个功能,这样其他人就不可能看到您不希望他们看到的东西。 15、尝试打开忘记密码的文件。暴力破解Excel的打开密码,注意:这个仅对拥有密码设计方案的人有效。 16、Excel加载项/宏管理器。对当前Excel环境下的加载宏/加载项/VBA加载项进行列表,并可以查看相关属性、修改运行状态,甚至是一键破解。 17、Excel对象管理器,可以批量转换Excel中的对象(图片、Shape、图表等)到图片文件; 18、在Excel中播放背景音乐、定时执行特定的程序、整点报时,一定很惬意... 19、屏幕录像及捕捉。哦,这个功能很强大啊。可以截取屏幕图像、录制屏幕变化、图片格式转换、批量bmp转成AVI文件、AVI文件转成动画GIF文件、图片标注... ...强大的不行啦,赶快去看看吧。快捷键:Ctrl+Alt+SpaceBar 或者 Shift+WinKey(微软徽标键) 20、DLL神探,DLL的最大威胁就是注入到系统进程中,让人防不胜防... 21、一键恢复Excel的系统菜单。这个功能... ... 22、Excel版简易游戏。只是几个可以在Excel中玩的游戏... ... ... 有兴趣的请访问:http://www.ChinaOBS.com 。本站热诚欢迎您的到来。
第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代码控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编码和解码 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二) 第四部分 图像处理 实例124 如何浏览图像 实例125 如何滚动浏览大图像 实例126 如何拖动图像 实例127 如何动态显示图像 实例128 如何维护多个图像 实例129 如何绘制图形 实例130 如何以不规则方式裁剪图像 实例131 如何以任意角度旋转显示图像 实例132 如何在桌面上显示图像 实例133 如何拷贝当前屏幕 实例134 如何打印图像文件 实例135 如何制作马赛克图像 实例136 如何实现图像中心扩散效果 实例137 如何实现图像百叶窗效果 实例138 如何实现图像底片化效果 实例139 如何实现图像翻页效果 实例140 如何实现图像镜像效果 实例141 如何柔化处理图像 实例142 如何锐化处理图像 实例143 如何雾化处理图像 实例144 如何将彩色图像转换成黑白图像 实例145 如何将BMP图像文件转换为JPG图像文件 实例146 如何全屏播放AVI文件 实例147 如何制作媒体播放器 第五部分 系统编程 实例148 如何获取键盘类型 实例149 如何获取声卡配置 实例150 如何获取处理器信息 实例151 如何获取系统元素颜色 实例152 如何获取显示元素信息 实例153 如何获取系统支持的显示模式 实例154 如何动态设置系统的显示模式 实例155 如何获取内存空间信息 实例156 如何获取磁盘类型 实例157 如何获取磁盘卷信息 实例158 如何获取磁盘空间信息 实例159 如何在我的电脑中隐藏磁盘 实例160 如何隐藏系统任务栏 实例161 如何隐藏桌面图标 实例162 如何在桌面上创建快捷方式 实例163 如何获取和设置桌面墙纸 实例164 如何设置桌面墙纸显示方式 实例165 如何进行系统桌面切换 实例166 如何禁止系统屏幕保护程序 实例167 如何在程序中启动系统屏幕保护程序 实例168 如何在开始右键菜单中添加菜单项 实例169 如何清空系统回收站 实例170 如何删除文件到回收站 实例171 如何启动控制面板程序 实例172 如何在系统控制面板中添加项目 实例173 如何为计算机增加启动日志 实例174 如何获取操作系统的启动模式 实例175 如何变暗屏幕颜色 实例176 如何关闭计算机 实例177 如何禁止关闭Windows操作系统 实例178 如何修改IE浏览器的背景 实例179 如何在程序中控制IE窗口 实例180 如何使用默认浏览器打开指定网页 实例181 如何获取当前正在运行的程序 实例182 如何监视系统剪贴板变化 实例183 如何获取系统剪贴板的数据格式 实例184 如何设置系统日期 实例185 如何获取操作系统的产品序列号和产品名称 实例186 如何获取和设置鼠标双击响应速度 实例187 如何弹出和关闭光驱 实例188 如何检测网络连接 实例189 如何创建拨号网络 第六部分 数据库应用 实例190 如何创建不写代码的数据库程序 实例191 如何添加TDBNavigator组件的按钮功能 实例192 如何对数据库记录求和 实例193 如何对数据库记录求平均值 实例194 如何使用Locate方法查询数据库记录 实例195 如何查询固定范围的数据库记录 实例196 如何提高数据库应用程序查询效果 实例197 如何使用数据集的书签 实例198 如何浏览数据库中的图像 实例199 如何在删除数据库记录前给予提示 实例200 如何取得数据集的当前状态 实例201 如何创建主从关系的数据集 实例202 如何在一个数据集中浏览另一个数据集的数据 实例203 如何在数据库更新过程中增加事务操作 实例204 如何在程序中实现查找字段 实例205 如何在程序中实现自定义字段 实例206 如何使用字段拖放功能 实例207 如何为程序添加报表打印功能 实例208 如何使用向导创建打印报表 实例209 如何设置一对多数据库表 实例210 如何设置一对多报表打印功能 实例211 如何根据一对多数据库表绘制图形 实例212 如何根据数据库表显示饼图 实例213 如何根据数据库表绘制条形图 实例214 如何动态绘制数据库图表 实例215 如何设置多重群组的打印报表 实例216 如何编写商业决策分析程序 实例217 如何导出对象库中的商业决策分析程序 实例218 如何打印含有图像字段的数据库表 实例219 如何实现数据库表整表复制 实例220 如何实现数据库记录的批量删除 实例221 如何实现数据库记录的批量修改 实例222 如何使用SQL Builder工具创建SQL语句 实例223 如何在程序运行时指定SQL语句 实例224 如何在程序中创建并使用数据库 实例225 如何在程序中控制与数据库的连接 实例226 如何在程序中创建Access数据库ODBC数据源 实例227 如何在程序运行时创建数据库BDE别名 实例228 如何在安装程序中设置BDE引擎 实例229 如何消除MS-SQL Server数据库连接的登录框 实例230 如何连接MS-SQL Server数据库 实例231 如何连接MS-Access数据库 实例232 如何连接dBase数据库 实例233 如何使用ODBC连接Excel表 实例234 如何使用ADO操作Access数据库 实例235 如何定制DBGrid组件的列表头 实例236 如何统计DBGrid组件多选单元格 实例237 如何设置DBGrid组件指定单元格的颜色值 实例238 如何在DBGrid组件单元格中增加下拉菜单 实例239 如何定制StringGrid组件指定单元格的颜色 实例240 如何获取StringGrid组件鼠标指定单元格的值 实例241 如何使用StringGrid组件显示数据库查询结果 实例242 如何禁止数据控制组件与数据集组件同步刷新 实例243 如何把数据库表转换成文本文件 实例244 如何把数据库中的数据写入Word文档 实例245 如何设置数据库字段的输入显示格式 实例246 如何管理数据库程序的错误信息 实例247 如何获取数据库BDE别名 实例248 如何获取数据库BDE别名参数信息 实例249 如何获取数据库的工作目录 实例250 如何获取数据库驱动程序名称
第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代码控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编码和解码 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二) 第四部分 图像处理 实例124 如何浏览图像 实例125 如何滚动浏览大图像 实例126 如何拖动图像 实例127 如何动态显示图像 实例128 如何维护多个图像 实例129 如何绘制图形 实例130 如何以不规则方式裁剪图像 实例131 如何以任意角度旋转显示图像 实例132 如何在桌面上显示图像 实例133 如何拷贝当前屏幕 实例134 如何打印图像文件 实例135 如何制作马赛克图像 实例136 如何实现图像中心扩散效果 实例137 如何实现图像百叶窗效果 实例138 如何实现图像底片化效果 实例139 如何实现图像翻页效果 实例140 如何实现图像镜像效果 实例141 如何柔化处理图像 实例142 如何锐化处理图像 实例143 如何雾化处理图像 实例144 如何将彩色图像转换成黑白图像 实例145 如何将BMP图像文件转换为JPG图像文件 实例146 如何全屏播放AVI文件 实例147 如何制作媒体播放器 第五部分 系统编程 实例148 如何获取键盘类型 实例149 如何获取声卡配置 实例150 如何获取处理器信息 实例151 如何获取系统元素颜色 实例152 如何获取显示元素信息 实例153 如何获取系统支持的显示模式 实例154 如何动态设置系统的显示模式 实例155 如何获取内存空间信息 实例156 如何获取磁盘类型 实例157 如何获取磁盘卷信息 实例158 如何获取磁盘空间信息 实例159 如何在我的电脑中隐藏磁盘 实例160 如何隐藏系统任务栏 实例161 如何隐藏桌面图标 实例162 如何在桌面上创建快捷方式 实例163 如何获取和设置桌面墙纸 实例164 如何设置桌面墙纸显示方式 实例165 如何进行系统桌面切换 实例166 如何禁止系统屏幕保护程序 实例167 如何在程序中启动系统屏幕保护程序 实例168 如何在开始右键菜单中添加菜单项 实例169 如何清空系统回收站 实例170 如何删除文件到回收站 实例171 如何启动控制面板程序 实例172 如何在系统控制面板中添加项目 实例173 如何为计算机增加启动日志 实例174 如何获取操作系统的启动模式 实例175 如何变暗屏幕颜色 实例176 如何关闭计算机 实例177 如何禁止关闭Windows操作系统 实例178 如何修改IE浏览器的背景 实例179 如何在程序中控制IE窗口 实例180 如何使用默认浏览器打开指定网页 实例181 如何获取当前正在运行的程序 实例182 如何监视系统剪贴板变化 实例183 如何获取系统剪贴板的数据格式 实例184 如何设置系统日期 实例185 如何获取操作系统的产品序列号和产品名称 实例186 如何获取和设置鼠标双击响应速度 实例187 如何弹出和关闭光驱 实例188 如何检测网络连接 实例189 如何创建拨号网络 第六部分 数据库应用 实例190 如何创建不写代码的数据库程序 实例191 如何添加TDBNavigator组件的按钮功能 实例192 如何对数据库记录求和 实例193 如何对数据库记录求平均值 实例194 如何使用Locate方法查询数据库记录 实例195 如何查询固定范围的数据库记录 实例196 如何提高数据库应用程序查询效果 实例197 如何使用数据集的书签 实例198 如何浏览数据库中的图像 实例199 如何在删除数据库记录前给予提示 实例200 如何取得数据集的当前状态 实例201 如何创建主从关系的数据集 实例202 如何在一个数据集中浏览另一个数据集的数据 实例203 如何在数据库更新过程中增加事务操作 实例204 如何在程序中实现查找字段 实例205 如何在程序中实现自定义字段 实例206 如何使用字段拖放功能 实例207 如何为程序添加报表打印功能 实例208 如何使用向导创建打印报表 实例209 如何设置一对多数据库表 实例210 如何设置一对多报表打印功能 实例211 如何根据一对多数据库表绘制图形 实例212 如何根据数据库表显示饼图 实例213 如何根据数据库表绘制条形图 实例214 如何动态绘制数据库图表 实例215 如何设置多重群组的打印报表 实例216 如何编写商业决策分析程序 实例217 如何导出对象库中的商业决策分析程序 实例218 如何打印含有图像字段的数据库表 实例219 如何实现数据库表整表复制 实例220 如何实现数据库记录的批量删除 实例221 如何实现数据库记录的批量修改 实例222 如何使用SQL Builder工具创建SQL语句 实例223 如何在程序运行时指定SQL语句 实例224 如何在程序中创建并使用数据库 实例225 如何在程序中控制与数据库的连接 实例226 如何在程序中创建Access数据库ODBC数据源 实例227 如何在程序运行时创建数据库BDE别名 实例228 如何在安装程序中设置BDE引擎 实例229 如何消除MS-SQL Server数据库连接的登录框 实例230 如何连接MS-SQL Server数据库 实例231 如何连接MS-Access数据库 实例232 如何连接dBase数据库 实例233 如何使用ODBC连接Excel表 实例234 如何使用ADO操作Access数据库 实例235 如何定制DBGrid组件的列表头 实例236 如何统计DBGrid组件多选单元格 实例237 如何设置DBGrid组件指定单元格的颜色值 实例238 如何在DBGrid组件单元格中增加下拉菜单 实例239 如何定制StringGrid组件指定单元格的颜色 实例240 如何获取StringGrid组件鼠标指定单元格的值 实例241 如何使用StringGrid组件显示数据库查询结果 实例242 如何禁止数据控制组件与数据集组件同步刷新 实例243 如何把数据库表转换成文本文件 实例244 如何把数据库中的数据写入Word文档 实例245 如何设置数据库字段的输入显示格式 实例246 如何管理数据库程序的错误信息 实例247 如何获取数据库BDE别名 实例248 如何获取数据库BDE别名参数信息 实例249 如何获取数据库的工作目录 实例250 如何获取数据库驱动程序名称
C++可以使用COM技术来操作Excel,以下是一个简单的示例代码: ```c++ #include <iostream> #include <windows.h> #include <ole2.h> int main() { // 初始化COM CoInitialize(NULL); // 创建Excel对象 IDispatch* pExcelApp = NULL; CLSID clsid; CLSIDFromProgID(L"Excel.Application", &clsid); HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID*)&pExcelApp); if (FAILED(hr)) { std::cerr << "create Excel object failed" << std::endl; CoUninitialize(); return 1; } // 显示Excel窗口 pExcelApp->PutVisible(VARIANT_TRUE); // 获取工作簿对象 IDispatch* pWorkbook = NULL; hr = pExcelApp->GetActiveWorkbook(&pWorkbook); if (FAILED(hr)) { std::cerr << "get workbook failed" << std::endl; pExcelApp->Release(); CoUninitialize(); return 1; } // 获取工作表对象 IDispatch* pWorksheet = NULL; hr = pWorkbook->GetActiveSheet(&pWorksheet); if (FAILED(hr)) { std::cerr << "get worksheet failed" << std::endl; pWorkbook->Release(); pExcelApp->Release(); CoUninitialize(); return 1; } // 写入数据到单元格 VARIANT var; VariantInit(&var); var.vt = VT_BSTR; var.bstrVal = SysAllocString(L"Hello, World!"); hr = pWorksheet->Invoke(dispidSetValue, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL); if (FAILED(hr)) { std::cerr << "write data failed" << std::endl; pWorksheet->Release(); pWorkbook->Release(); pExcelApp->Release(); CoUninitialize(); return 1; } // 保存工作簿 hr = pWorkbook->Invoke(dispidSave, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL); if (FAILED(hr)) { std::cerr << "save workbook failed" << std::endl; pWorksheet->Release(); pWorkbook->Release(); pExcelApp->Release(); CoUninitialize(); return 1; } // 释放资源 VariantClear(&var); pWorksheet->Release(); pWorkbook->Release(); pExcelApp->Release(); CoUninitialize(); return 0; } ``` 注意:以上代码中的`dispidSetValue`和`dispidSave`需要在调用前获取,以便正确调用Excel对象的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值