大白 VC简单读写EXCEL文件(OLE)

大白 VC简单读写EXCEL文件(OLE)


简介

作为刚毕业的菜鸡入职后,部门老大让做一个小程序,要求能够读写EXCEL文件,赶紧百度搜索VC读写Excel文件,参照了几位大佬的博客后终于完成,于是在此写下大白的一点点收获以便以后复用。并且这也是大白的第一篇博客呀!

1.导入Excel库文件

打开Class Wizard,点击Add class按钮下的From a type Library导入office安装目录下的excel.exe,然后选择_Application,Workbooks,_Workbook,_Worksheet,Worksheets,Range等类,点击OK后可以在源文件和头文件中看到excel.cpp、excel.h两个文件,在excel.h文件中可以看到刚刚选择的类,在需要操作Excel的文件中#include “excel.h”就可以了。

2.初始化COM组件

在程序的入口处(CWinApp派生类的InitInstance()方法中)添加如下代码:

if (!AfxOleInit())
{
    AfxMessageBox("无法初始化COM的动态链接库");
    return FALSE;
}

如果是在其它线程中操作Excel务必在线程中再次初始化COM组件。

3.读取Excel文件数据

定义如下变量:

_Application excel_app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;

选择要读取的Excel文件:

CString excelPathName;
CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
        NULL,
        NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        _T("xlsx Files(*.xlsx)|*.xlsx||"), //打开xlsx文件
        NULL);
    if(dlg.DoModal()==IDOK)
    {
        excelPathName=dlg.GetPathName(); //文件名保存在了excelPathName里
    }

读取Excel文件:

if (!excel_app.CreateDispatch("Excel.Application"))//创建Excel服务器
{
    AfxMessageBox("无法启动EXCEL服务器");
}
else
{
    excel_app.SetVisible(TRUE); //使Excel可见
    excel_app.SetUserControl(TRUE); //允许其他用户控制Excel
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    books.AttachDispatch(excel_app.GetWorkbooks());
    LPDISPATCH lpdis = books.Open(excelPathName, covOptional, covOptional, covOptional, covOptional
                , covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional
                , covOptional, covOptional, covOptional);
    book.AttachDispatch(lpdis);
    sheets.AttachDispatch(book.GetWorksheets());
    sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
    range.AttachDispatch(sheet.GetCells());
    _variant_t var;
    CString tmpStr;//存储每个格子的数据
    int r,c;
    var =range.GetItem(_variant_t((long)r)
            ,_variant_t((long)c));//读取第r行c列的数据,注意行和列都是从1开始
    tmpStr.Format("%s",(char*)(_bstr_t)var);//转换成CString
    book.SetSaved(TRUE);//将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存 ,如果没有这句会导致Excel释放不掉!
    range.ReleaseDispatch();//注意释放顺序
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    excel_app.ReleaseDispatch();
    excel_app.Quit();
}

写入数据到Excel文件:

if (!excel_app.CreateDispatch("Excel.Application"))
{
    AfxMessageBox("无法启动EXCEL服务器");
}
else
{
    excel_app.SetVisible(TRUE);
    excel_app.SetUserControl(TRUE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    books.AttachDispatch(excel_app.GetWorkbooks());
    book.AttachDispatch(books.Add(covOptional));
    sheets.AttachDispatch(book.GetWorksheets());
    sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
    Range range;
    range.AttachDispatch(sheet.GetCells());
    int r,c; //r表示行数,c表示列数
    CString data,savePath;//这里data存储要写入的数据,savePath为要保存的Excel文件路径
    range.SetItem(_variant_t((long)r), _variant_t((long)c), _variant_t(data));//在第r行c列写入数据data,注意行和列都是从1开始
    book.SaveAs(COleVariant(savePath), covOptional, covOptional,
            covOptional, covOptional, covOptional, 0, covOptional,
            covOptional, covOptional, covOptional, covOptional);
    book.SetSaved(TRUE);
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    excel_app.ReleaseDispatch();
    excel_app.Quit();
}

好了,一篇简单读写Excel文件的博客就此结束了,大白的第一篇博客呀!虽然简陋但也是大白第一步,希望自己继续努力。

猜你喜欢

转载自blog.csdn.net/qq_39977941/article/details/81745120
今日推荐