VS2008具体操作Excel

前一篇博文中转载了有人对VS2008操作Excel的总结,网址见http://blog.sina.com.cn/s/blog_6163bdeb0102dxcy.html

之前做过使用VS2008以OLE方式操作PPT(见http://blog.sina.com.cn/s/blog_6163bdeb0100nn1p.html),所以想尝试一下OLE操作Excel,基本过程时差不多的,但有些地方还是不一样,基本过程参考上面的操作PPT的博文,不一样的地方总结于此。

 

参考了如下两篇博文:

VS2010+MFC解析Excel文件中数据,介绍的有关Excel的设置方面很全

http://www.vcfans.com/2010/08/vs2010-mfc-excel-file-in-the-data-analysis.html

OLE操作Excel编译错误处理,里面有具体操作的函数使用方法

http://www.cppblog.com/greatws/archive/2008/09/21/62423.html

Excel的设置方法及使用如下:

设置上与PPT最大的不同在于,添加如下代码

#pragma region Import the type libraries

//#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \
//    rename("RGB", "MSORGB") \
//    rename("DocumentProperties", "MSODocumentProperties")
//    rename("DialogBox", "ignorethis"),
// [-or-]
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL" \
    rename("RGB", "MSORGB") \
    rename("DocumentProperties", "MSODocumentProperties") \
    rename("DialogBoxW", "ignorethis")

using namespace Office;

//#import "libid:0002E157-0000-0000-C000-000000000046"
// [-or-]
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

using namespace VBIDE;

//#import "libid:00020813-0000-0000-C000-000000000046" \
//    rename("DialogBox", "ExcelDialogBox") \
//    rename("RGB", "ExcelRGB") \
//    rename("CopyFile", "ExcelCopyFile") \
//    rename("ReplaceText", "ExcelReplaceText") \
//    no_auto_exclude
// [-or-]
#import "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" \
    rename("DialogBox", "ExcelDialogBox") \
    rename("RGB", "ExcelRGB") \
    rename("CopyFile", "ExcelCopyFile") \
    rename("ReplaceText", "ExcelReplaceText") \
    no_auto_exclude

#pragma endregion

(PPT添加的代码如下

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll" \
rename_namespace("Office"), named_guids, exclude("Pages")
using namespace Office;

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" \
rename_namespace("VBE6")
using namespace VBE6;

可见上面给的代码更规范)

设置完后(其他设置与PPT的相同),编译会发现如下错误

warning C4003: “DialogBoxW”宏的实参不足

有人说可以升级你的windows SDK,或者在错误处将DialogBox() 改为 _DialogBox() ,就可以编译成功了。

 

具体的实现可以参考OLE操作Excel编译错误处理那边博文,现简单整理了一个Excel的接口,完成了少量功能,代码如下

CExcelInterface.h文件

#pragma once

#pragma region Import the type libraries

//#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \
//    rename("RGB", "MSORGB") \
//    rename("DocumentProperties", "MSODocumentProperties")
//    rename("DialogBox", "ignorethis"),
// [-or-]
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL" \
    rename("RGB", "MSORGB") \
    rename("DocumentProperties", "MSODocumentProperties") \
    rename("DialogBoxW", "ignorethis")

using namespace Office;

//#import "libid:0002E157-0000-0000-C000-000000000046"
// [-or-]
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

using namespace VBIDE;

//#import "libid:00020813-0000-0000-C000-000000000046" \
//    rename("DialogBox", "ExcelDialogBox") \
//    rename("RGB", "ExcelRGB") \
//    rename("CopyFile", "ExcelCopyFile") \
//    rename("ReplaceText", "ExcelReplaceText") \
//    no_auto_exclude
// [-or-]
#import "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" \
    rename("DialogBox", "ExcelDialogBox") \
    rename("RGB", "ExcelRGB") \
    rename("CopyFile", "ExcelCopyFile") \
    rename("ReplaceText", "ExcelReplaceText") \
    no_auto_exclude

#pragma endregion


#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorkbook.h"
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CRange.h"

class CExcelInterface
{
public:
    CExcelInterface(void);
    ~CExcelInterface(void);

public:
    CApplication m_Application;
    CWorkbooks m_WorkBooks;
    CWorkbook m_WorkBook;

public:
    BOOL OpenEngine(); // open engine   

    void NewWorkBooks();
    void OpenExcelFile(CString cstrFileName);
    void InsertData(int iSheetNum, int iRow, int iColumn, CString cstrData);
    void SaveExcel(); // save PPT
    void CloseEngine(); // close PPT engine       

};

 

CExcelInterface.cpp文件

#include "StdAfx.h"
#include "ExcelInterface.h"

CExcelInterface::CExcelInterface(void)
{
}

CExcelInterface::~CExcelInterface(void)
{
    if (m_Application)
    {
        m_WorkBook.DetachDispatch();
        m_WorkBooks.DetachDispatch();
        m_Application.DetachDispatch();
    }
}

// open Excel engine   
BOOL CExcelInterface::OpenEngine()
{
   

    if (m_Application)
    {
        m_WorkBooks.ReleaseDispatch();
        m_Application.Quit();
        m_Application.DetachDispatch();
    }

    if(!m_Application.CreateDispatch(_T("Excel.Application")))
    {
        AfxMessageBox(_T("Couldn't start Excel."));
        ::CoUninitialize();
        return FALSE;
    }
    else
    {
        //Make the application visible.
        m_Application.put_Visible(TRUE);
        m_WorkBooks = m_Application.get_Workbooks();
        return TRUE;
    }
}

// create a Excel
void CExcelInterface::NewWorkBooks()
{
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (m_WorkBooks)
        m_WorkBook = m_WorkBooks.Add(covOptional);
}

// open Excel file
void CExcelInterface::OpenExcelFile(CString cstrFileName)
{
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (m_WorkBooks || !cstrFileName.IsEmpty())
        m_WorkBook = m_WorkBooks.Add(_variant_t(cstrFileName));
}

void CExcelInterface::InsertData(int iSheetNum, int iRow, int iColumn, CString cstrData)
{
    CWorksheets sheets;
    CWorksheet sheet;
    CRange range;

    sheets = m_WorkBook.get_Worksheets();
    sheet = sheets.get_Item(_variant_t(iSheetNum));

    range = sheet.get_Cells();
    range.put_Item(_variant_t(iRow), _variant_t(iColumn), _variant_t(cstrData));
}

// save Excel
void CExcelInterface::SaveExcel()
{
    if (m_WorkBook)
        m_WorkBook.Save();
}

// close Excel engine       
void CExcelInterface::CloseEngine()
{
    if (m_Application)
    {
        m_WorkBook.ReleaseDispatch();
        m_WorkBooks.ReleaseDispatch();
        m_Application.Quit();
        m_Application.DetachDispatch();
    }
}

 

封装成个类,在使用时会很方便,如随便建一个对话框程序,建一个按钮,按钮响应如下

void CExcelTestDlg::OnBnClickedButton1()
{
    // 浏览Excel文件
    static TCHAR BASED_CODE szFilter[] = _T("Excel Files (*.xlsx;*.xls)|*.xlsx;*.xls|All Files (*.*)|*.*||");
    CFileDialog FileDlg(TRUE,_T("Excel"),NULL,OFN_FILEMUSTEXIST|OFN_NONETWORKBUTTON|OFN_PATHMUSTEXIST,szFilter);
    FileDlg.DoModal();

    // 获取文件名
    CString cstrTemplateFile = FileDlg.GetPathName();
    CString cstrFileName = _T("Report.xlsx");
    cstrTemplateFile.MakeReverse();
    CString cstrFilePath = cstrTemplateFile.Right(cstrTemplateFile.GetLength() - cstrTemplateFile.Find( '\\'));
    cstrFilePath.MakeReverse();
    cstrTemplateFile.MakeReverse();

   // 写Excel文件
    m_ExcelInterface.OpenEngine();
    m_ExcelInterface.OpenExcelFile(cstrTemplateFile);

    m_ExcelInterface.InsertData(1, 1, 1, _T("Test"));
    m_ExcelInterface.InsertData(1, 2, 1, _T("Hello"));
    m_ExcelInterface.InsertData(1, 2, 2, _T("Excel"));
    m_ExcelInterface.InsertData(1, 2, 3, _T("!"));

    //m_ExcelInterface.SaveExcel();
    m_ExcelInterface.CloseEngine();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: VS2019 MFC操作Excel是一种常用的开发技术,可以通过使用MFC库中的一些功能和类来实现对Excel文件的读写操作。 首先,需要在工程中引入MFC库和所需的头文件,如afxwin.h、afxdisp.h等。 接下来,使用COleVariant类型的变量来打开Excel应用程序,并创建一个工作簿(Workbook)对象。例如: ```cpp CApplication excelApp; if (!excelApp.CreateDispatch(_T("Excel.Application"))) { AfxMessageBox(_T("Excel应用程序创建失败!")); return; } CWorkbooks workbooks = excelApp.GetWorkbooks(); CWorkbook workbook = workbooks.Add(); ``` 然后,通过获取工作簿中的工作表(Worksheets)对象,可以进对工作簿的操作。例如: ```cpp CWorksheets worksheets = workbook.GetWorksheets(); CWorksheet worksheet = worksheets.GetItem(COleVariant((short)1)); //获取第一个工作表 Range range; //定义一个区域对象 range.AttachDispatch(worksheet.GetRange(COleVariant(L"A1"), COleVariant(L"C3"))); //获取A1到C3的单元格区域 COleVariant data(_T("Hello, Excel!")); //准备要写入的数据 range.put_Value2(data); //将数据写入区域 ``` 当需要读取Excel数据时,可以借助Worksheet对象的Cells属性和Range对象进操作。例如: ```cpp CRange usedRange = worksheet.GetUsedRange(); //获取已使用的单元格范围 int rowCount = usedRange.GetRows().GetCount(); //获取数 int columnCount = usedRange.GetColumns().GetCount(); //获取列数 for (int i = 1; i <= rowCount; i++) { for (int j = 1; j <= columnCount; j++) { CRange cell = worksheet.GetCells().GetItem(COleVariant(i), COleVariant(j)); //获取指定单元格 CString value = cell.GetValue(); //获取单元格的值 //对获取到的数据进处理 } } ``` 最后,记得在不需要使用Excel时,调用相关的关闭和释放函数,以结束Excel应用程序的运。例如: ```cpp workbook.SaveAs(COleVariant(L"test.xlsx")); //保存工作簿到文件 workbook.Close(); excelApp.Quit(); ``` 以上是使用VS2019 MFC操作Excel的基本方法,通过这些方法可以方便地对Excel文件进读写操作,实现各种需求。 ### 回答2: VS2019 MFC操作Excel的基本步骤如下: 首先,我们需要在项目中引入MFC类库。在新建项目时,选择MFC应用程序,并在创建向导中勾选"使用MFC功能"。 接下来,我们需要添加Excel的头文件和库文件。在项目的stdafx.h文件中添加以下代码: ``` #include "afxdb.h" #include "afxdao.h" ``` 然后,在需要操作Excel的代码文件中,包含afxdao.h头文件,并定义以下变量: ``` CDatabase db; CDaoWorkspace workspace; CDaoDatabase* pDaoDB; CDaoRecordset rs; ``` 接着,我们需要创建一个Excel数据源。通过以下代码连接数据库: ``` CString strExcelFile = _T("C:\\path\\to\\excel.xls"); // 替换为实际的Excel文件路径 CString strConnect = _T("Excel 8.0;HDR=YES;IMEX=1;"); // 数据源连接字符串 db.Open(NULL, FALSE, FALSE, strConnect); pDaoDB = db.m_pDaoDatabase; ``` 通过以上代码,我们成功地连接了Excel文件,现在可以开始操作Excel表格了。 例如,我们可以执下列操作来读取Excel文件中的数据: ``` rs.Open(db.OpenRecordset(_T("SELECT * FROM Sheet1")));//替换Sheet1为实际的工作表名称 while (!rs.IsEOF()) { CString strName; rs.GetFieldValue(_T("Name"), strName); // 读取Name列的数据 // 在这里处理读取到的数据 rs.MoveNext(); } rs.Close(); ``` 类似地,我们可以编写代码实现写入数据、修改数据等其他操作。操作完成后,务必关闭数据库连接: ``` db.Close(); ``` 这样,我们就完成了在VS2019 MFC中操作Excel的基本步骤。当然,在实际应用中,还可以根据具体需求进一步扩展功能。 ### 回答3: VS2019 MFC操作Excel的主要步骤如下: 首先,我们需要添加必要的头文件和库文件。在MFC应用程序的代码中,包含<afxdisp.h>和<atlbase.h>这两个头文件。此外,还需要在项目的属性中添加Microsoft.Office.Interop.Excel作为附加依赖项。 接下来,我们可以使用Excel应用程序对象进操作。可以通过以下代码进初始化: ``` _Application excelApp; if (!excelApp.CreateDispatch(L"Excel.Application")) { AfxMessageBox(L"无法启动Excel应用程序。"); return; } excelApp.put_Visible(TRUE); ``` 然后,我们可以打开一个工作簿并选择一个工作表进操作。可以使用以下代码打开工作簿: ``` _Workbook excelWorkbook; excelWorkbook = excelApp.get_Workbooks().Open(L"C:\\Path\\To\\Workbook.xlsx"); ``` 接着,我们可以访问工作表中的单元格数据,并进读取或写入操作。例如,可以使用下面的代码来读取A1单元格的数据并将其显示在MessageBox中: ``` _Range excelRange; excelRange = excelWorkbook.get_Worksheets().get_Item(1).get_Range(COleVariant(L"A1"), COleVariant(L"A1")); CString value = (LPCTSTR)excelRange.get_Value2().bstrVal; AfxMessageBox(value); ``` 最后,在完成操作后,我们应该关闭工作簿和Excel应用程序,释放相关资源。可以使用以下代码来关闭工作簿和Excel应用程序: ``` excelWorkbook.Close(FALSE); excelApp.Quit(); ``` 以上是使用VS2019 MFC操作Excel的基本步骤。在实际开发中,根据具体需求,还可以进更多的操作,如新增工作表、格式化单元格、插入图表等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值