在VS2010中利用MFC读取word、ppt、excel格式文件

本文源码的应用环境说明:Windows 7,Microsoft Visual Studio 2010,Microsoft Office Excel 2013

最近自己在做一个利用OLE/COM的实现MFC读取word、excel和ppt格式里面的内容,虽然有关这方面的介绍很多,但是感觉比较杂,比较乱,因此将自己整理加修改的结果写出来,希望能够对以后做这方面格式读取的有帮助。

1、安装office软件。

由于利用的是Office的OLE/COM控件来读取,所以Office是要预先装好

2.导入并封装Word、Excel和PPT中的接口

 

VS2010导入OLE/COM组件的接口的步骤为:Project->Class Wizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,然后再选择要导入的类型库中的接口。在完成接口导入后,VS2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。

 

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

 

Word接口

导入类

头文件

_Application

CApplication

CApplication

Documents

CDocuments

CDocuments

_Document

CDocument0

CDocument0

Worksheets

CRange

CRange

Excel接口

导入类

头文件

_Application

CApplication0

CApplication0

Workbooks

CWorkbooks

CWorkbooks

_Workbook

CWorkbook

CWorkbook

Worksheets

CWorksheets

CWorksheets

_Worksheet

CWorksheet

CWorksheet

Range

CRange0

CRange0

ppt接口

导入类

头文件

_Application

CApplication1

CApplication1

Presentations

CPresentations

CPresentations

_Presentation

CPresentation

CPresentation

Slides

CSlides

CSlides

_Slide

CSlide

CSlide

Shapes

CShapes

CShapes

_Shape

CShape

CShape

TextFrame

CTextFrame

CTextFrame

TextRange

CTextRange

CTextRange

 

 

3.导入类型库

对每个导入的word头文件中的#import "E:\\Program Files\\Microsoft Office\\Office15\\MSWORD.OLB" no_namespace、excel头文件中的#import "E:\\Program Files\\Microsoft Office\\Office15\\EXCEL.EXE" no_namespace、ppt中的头文件中的#import "E:\\Program Files\\Microsoft Office\\Office15\\MSPPT.OLB" no_namespace注释掉,目的是防止重复导入,引起编译错误。

对于Excel中的CRange中的DialogBox报错的问题,在前面加下划线即可,即_DialogBox

4.包含对应的头文件,在一个文件中定义变量:

//word
CApplication  wordApp;  
     CDocuments  docs;  
     CDocument0  doc;  
     CRange  wordRange;  
//excel
CApplication0 excelApp;
    CWorkbooks books;
    CWorkbook book;
    CWorksheets sheets;
    CWorksheet sheet;
    CRange0 excelRange;
//ppt
CApplication1  pptApp; 
CPresentations presentations;
CPresentation presentation;
CSlides        slides; 
CSlide        slide;
CShapes shapes;
CShape shape;
CTextFrame textFrame;
CTextRange textRange;
5.操作步骤

这里以excel为例:

 

操作Excel的主要步骤如下:

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

(2)得到Workbook的容器。

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

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

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

(6)通过Range对WorkSheet中的单元格进行读写操作。

(7)保存Excel。

(8)释放资源。

这里用一个函数来实现读取excel表:

void ReadExcel(CString filename)
{
LPDISPATCH lpDisp = NULL;
//
COleVariant vResult;
COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        vtMissing((long)DISP_E_PARAMNOTFOUND, VT_ERROR);    
 
//打开指定路径文件
CString FileName=filename;
if (!excelApp.CreateDispatch(_T("Excel.Application"),NULL)) {
AfxMessageBox(_T("Excel failed to start!"));
return ;
}
//设置excel表不可见
excelApp.put_Visible(FALSE);

//创建一个文本文件
CFile   file;
file.Open(_T("tmp.txt"),CFile::modeCreate|CFile::modeWrite);
WORD unicode = 0xFEFF;
file.Write(&unicode,2);


try
    {

        //打开一个工作簿
books.AttachDispatch(excelApp.get_Workbooks());

        lpDisp = books.Open(FileName, 
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 
            vtMissing, vtMissing, vtMissing, vtMissing);


        book.AttachDispatch(lpDisp);


//得到Worksheets  
sheets.AttachDispatch(book.get_Worksheets());


//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待  
lpDisp=book.get_ActiveSheet();  
sheet.AttachDispatch(lpDisp); 

//得到工作簿中的Sheet的容器
// sheets.AttachDispatch(book.get_Sheets());
 
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
CRange0 usedRange;
usedRange.AttachDispatch(sheet.get_UsedRange());
excelRange.AttachDispatch(usedRange.get_Rows());
long iRowNum=excelRange.get_Count();                   //已经使用的行数
 
excelRange.AttachDispatch(usedRange.get_Columns());
long iColNum=excelRange.get_Count();                   //已经使用的列数
  
long iStartRow=usedRange.get_Row();               //已使用区域的起始行,从1开始
long iStartCol=usedRange.get_Column();            //已使用区域的起始列,从1开始
//
long i,j;
for(i=iStartRow;i<=iRowNum;i++)
for(j=iStartCol;j<=iColNum;j++)
{
//读取第一个单元格的值
excelRange.AttachDispatch(sheet.get_Cells()); 
excelRange.AttachDispatch(excelRange.get_Item(COleVariant((long)i),COleVariant((long)j)).pdispVal );
COleVariant vResult =excelRange.get_Value2();
CString str;
if(vResult.vt == VT_BSTR)       //字符串
{
 str=vResult.bstrVal;
}
else if (vResult.vt==VT_R8)     //8字节的数字 
{
 str.Format(_T("%f"),vResult.dblVal);
}
else 
str="";
//AfxMessageBox(str);
file.Write(str,wcslen(str)*sizeof(wchar_t));
}
}
    catch(...)
    {
       AfxMessageBox(_T("打开文件失败!"));
    }



//关闭文档
file.Flush();
file.Close();
    /*释放资源*/
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    excelApp.Quit();
    excelApp.ReleaseDispatch();


//AfxMessageBox(aRange.get_Text());
}

至于word和ppt,操作过程类似,就这只给出操作代码,对于操作步骤的解释,就不赘述了。

void ReadWord(CString filename)
{
try{
//打开指定路径文件
CString FileName=filename;
if (!wordApp.CreateDispatch(_T("Word.Application"),NULL)) {
AfxMessageBox(_T("Word failed to start!"));
return ;
}
wordApp.put_Visible(FALSE);
docs = wordApp.get_Documents();
COleVariant vTrue((short)TRUE);    
COleVariant vFalse((short)FALSE);
COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//COleVariant vFileName(FileName + ".docx");
COleVariant vFileName(FileName);
doc = docs.Open(vFileName,vTrue,vTrue,vTrue,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,vOptional);
wordRange = doc.Range(vOptional,vOptional);


//创建一个记事本文件
CFile   file;
file.Open(_T("tmp.txt"),CFile::modeCreate|CFile::modeWrite);
WORD unicode = 0xFEFF;
file.Write(&unicode,2);
//AfxMessageBox(wordRange.get_Text());
//将提取的word内容写入文件
CString str=wordRange.get_Text();
file.Write(str,wcslen(str)*sizeof(wchar_t));
//关闭文档
file.Flush();
file.Close();  
  //释放资源
doc.ReleaseDispatch();


docs.ReleaseDispatch();
wordApp.ReleaseDispatch();
}catch(...)
{
AfxMessageBox(_T("打开文件失败!"));
}
}

PPT的操作代码:

void ReadPowerPoint(CString filename)
{
CString strText;
//
if (!pptApp.CreateDispatch(_T("Powerpoint.Application"),NULL)) {
AfxMessageBox(_T("ppt failed to start!"));
return ;
}
//设置不可见
//pptApp.put_Visible(FALSE);
pptApp.put_Visible((long)TRUE);

try
{
//打开文件
presentations = pptApp.get_Presentations();
        presentation = presentations.Open(filename,0,0,1);


// 获取幻灯片数目
int i,j;
slides=presentation.get_Slides();
//
//创建一个文本文件,用来存储提取的结果
CFile   file;
file.Open(_T("tmp.txt"),CFile::modeCreate|CFile::modeWrite);
WORD unicode = 0xFEFF;
file.Write(&unicode,2);
//提取每一页上的文本
for(i = 1; i <=slides.get_Count(); i++) {
slide = slides.Range(COleVariant((long)(i)));
shapes=slide.get_Shapes();
for(j = 0; j < shapes.get_Count(); j ++) {
shape=shapes.Item(COleVariant((long)(j + 1)));
if(shape.get_HasTextFrame()) {
textFrame = shape.get_TextFrame();
textRange = textFrame.get_TextRange();
CString txt = textRange.get_Text();
if(txt.GetLength() > 0) {
//strText += txt;
//写入文本
file.Write(txt,wcslen(txt)*sizeof(wchar_t));
}
}
}
}


//关闭文档
file.Flush();
file.Close();
//AfxMessageBox(strText);
//释放资源
presentation.Close();
pptApp.Quit();


}catch(...)
{
AfxMessageBox(_T("ppt文件打开失败!"));
}
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用VS2019 MFC可以通过以下步骤读取Excel文件: 1. 首先,需要在项目添加Microsoft Excel Object Library的引用。在Visual Studio,选择“项目”菜单,然后选择“添加引用”。在“COM”选项卡,找到“Microsoft Excel Object Library”并选它,然后点击“确定”按钮。 2. 在代码添加头文件“<afxdisp.h>”。 3. 创建一个Excel应用程序对象,如下所示: ```cpp _Application excelApp; ``` 4. 打开Excel文件,如下所示: ```cpp if (!excelApp.CreateDispatch(_T("Excel.Application"))) { AfxMessageBox(_T("无法创建Excel应用程序对象")); return; } _Workbook workbook; if (!workbook.Open(_T("文件路径"))) { AfxMessageBox(_T("无法打开Excel文件")); return; } ``` 5. 获取工作表对象,如下所示: ```cpp _Worksheet worksheet; worksheet.AttachDispatch(workbook.Worksheets(L"Sheet1")); ``` 6. 读取单元格的值,如下所示: ```cpp _variant_t var; Range range = worksheet.GetRange(_T("A1")); var = range.GetValue(); CString strValue = var.bstrVal; ``` 7. 关闭Excel文件和应用程序对象,如下所示: ```cpp workbook.Close(); excelApp.Quit(); ``` 以上就是使用VS2019 MFC读取Excel文件的基本步骤。 ### 回答2: VS2019提供了一种简便的方法来读取Excel文件,需要使用MFC(Microsoft Foundation Class)。首先,打开VS2019并创建一个MFC应用程序。创建的应用程序将包含一个默认的对话框。现在,需要添加以下文件: 1. stdafx.h 2. stdafx.cpp 3. CExcelReader.h 4. CExcelReader.cpp 其,CExcelReader.h和CExcelReader.cpp文件是核心文件,用于读取Excel文件。 现在需要将以下头文件和库添加到MFC应用程序: 1. #include <afxdb.h> 2. #include <afxwin.h> 3. #include <afxdao.h> 4. #pragma comment(lib,"odbc32.lib") 5. #pragma comment(lib,"odbccp32.lib") 这些文件和库将帮助应用程序读取Excel文件。现在,编写CExcelReader.h和CExcelReader.cpp文件,以下是示例代码: CExcelReader.h文件: #pragma once class CExcelReader { public: CExcelReader(); virtual ~CExcelReader(); bool open(CString fileName); void close(); bool isOpen(); bool read(int column, CString& value); bool nextRow(); protected: bool m_opened; CString m_fileName; CDatabase m_database; CRecordset m_recordset; }; CExcelReader.cpp文件: CExcelReader::CExcelReader() { m_opened = false; } CExcelReader::~CExcelReader() { close(); } bool CExcelReader::open(CString fileName) { close(); m_fileName = fileName; CString connectionString; connectionString.Format(_T("ODBC;DSN=Excel Files;DBQ=%s;DriverId=790;MaxBufferSize=2048;PageTimeout=5;"), m_fileName); try { m_database.Open(NULL, FALSE, FALSE, connectionString); m_recordset.Open(AFX_DB_DEFAULT_TYPE, connectionString); m_opened = true; return true; } catch(exception ex) { return false; } } void CExcelReader::close() { if(m_opened) { m_opened = false; m_recordset.Close(); m_database.Close(); } } bool CExcelReader::isOpen() { return m_opened; } bool CExcelReader::read(int column, CString& value) { try { m_recordset.GetFieldValue(column, value); return true; } catch(exception ex) { return false; } } bool CExcelReader::nextRow() { try { return !m_recordset.IsEOF() && !m_recordset.IsBOF() && m_recordset.MoveNext(); } catch(exception ex) { return false; } } 现在使用这些文件和库来读取Excel文件。在对话框创建一个按钮,单击此按钮时将会触发打开Excel文件的事件。以下是示例代码: void CMyDlg::OnOpenExcelFile() { CString fileName; CExcelReader excelReader; CFileDialog openFileDialog(TRUE, _T("*.xls"), _T(""), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("Excel Files (*.xls)|*.xls||"), this); if (openFileDialog.DoModal() == IDOK) { fileName = openFileDialog.GetPathName(); if(excelReader.open(fileName)) { CString value; while(excelReader.nextRow()) { excelReader.read(1, value); // do something with the value } excelReader.close(); } } } 现在,按钮单击事件将读取Excel文件每一行的第一个值,然后可以使用所读取的值执行任何操作。大功告成! ### 回答3: Visual Studio 2019 ,使用 MFC 库来读取 Excel 文件可以分为两步进行,分别是建立 COM 对象和读取数据。 第一步:建立 COM 对象 在 MFC 应用程序,需要将 Microsoft Excel 应用程序作为 COM 对象进行引用。具体步骤如下: 1. 在工具栏选择“项目”-“添加新项”-“MFC 类”; 2. 在“向导”选项,选择“ActiveX 控件”; 3. 在“ActiveX 控件模板”勾选“Automation”; 4. 在“其他选项”指定名称和位置; 5. 完成向导并进行生成。 生成后,在您的 Visual Studio 的项目,您可以看到一个名为“您指定的名称.cpp”的新文件。 打开此文件以查看 COM 组件的声明和实现。 第二步:读取数据 在您成功建立了 COM 对象之后,您就可以使用 COM 对象的方法来读取 Excel 文件数据。具体步骤如下: 1. 使用 GetWorkbooks() 方法打开指定 Excel 文件; 2. 使用 GetWorksheets() 方法打开指定的工作表; 3. 使用 GetRange() 方法从工作表获取数据范围; 4. 使用 GetValue() 方法读取单元格的值或者使用 GetVariantArray() 方法获取连续区域的内容; 5. 关闭 Excel 应用程序并释放资源。 通过以上的步骤,您可以成功的读取 Excel 文件的数据内容。但需要注意的是,在使用 COM 对象时,需要确保 Excel 应用程序正在运行,并且您需要具有访问 Excel 文件的权限。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值