#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll" rename("RGB", "MSRGB")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, rename("Reference", "ignorethis"), rename("VBE", "testVBE") 
#import "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" exclude("IFont", "IPicture") rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis"), rename("VBE", "testVBE"), rename("ReplaceText", "EReplaceText"), rename("CopyFile","ECopyFile"), rename("FindText", "EFindText"), rename("NoPrompt", "ENoPrompt")using namespace Office;
using namespace Excel ;class  COperateExcel2003
{
public:
COperateExcel2003();
~ COperateExcel2003();
public:
_ApplicationPtr pApplication  ; WorkbooksPtr pWorkbooks;
_WorkbookPtr pThisWorkbook   ; WorksheetsPtr pWorksheets;
_WorksheetPtr pThisWorksheet   ;
 /*SheetsPtr*/
RangePtr pThisRange   ;
_variant_t vt ;public:
//int ExportExcelFile();
BOOL OpenExcelFile(int &nRows);
//int GetRowS();
private:
BOOL CreateExcelInstance();
};#include "stdafx.h"
#include "OperateExcel2003.h"
COperateExcel2003::COperateExcel2003()
{
CoInitialize(NULL); pApplication = NULL ; pWorkbooks = NULL;
pThisWorkbook = NULL ; pWorksheets = NULL;
pThisWorksheet = NULL ; pThisRange = NULL ;
}
COperateExcel2003::~COperateExcel2003()
{
if(pThisRange)
pThisRange.Release(); if(pThisWorksheet)
pThisWorksheet.Release();
if(pWorkbooks)
pWorkbooks.Release(); if(pThisWorkbook)
pThisWorkbook.Release();
if(pWorkbooks)
pWorkbooks.Release(); if(pApplication)
{
pApplication->Quit();
pApplication.Release();
} CoUninitialize();
}
BOOL COperateExcel2003::OpenExcelFile(int &nRows)
{
BOOL bIsRet = FALSE; if(!CreateExcelInstance())
return bIsRet; pApplication->PutVisible (0,VARIANT_TRUE); pWorkbooks = pApplication->Workbooks;
pThisWorkbook = pWorkbooks->Open("H:\\My VC++ Proj\\HelpFile.xls"); pWorksheets = pThisWorkbook->GetWorksheets();/*走到这里报错,说ExcelToIni.exe 中的 0x7c812afb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f9d8 处的 _com_error。*/
pThisWorksheet = pWorksheets->GetItem(1); pThisRange = pThisWorksheet->GetCells();
nRows = pThisRange->GetRow();//这里我想得到此excel的row数 bIsRet = TRUE; return bIsRet;
}
BOOL  COperateExcel2003::CreateExcelInstance()
{
BOOL  bIsRet = TRUE;
if(S_OK != pApplication.CreateInstance("Excel.Application"))
bIsRet = FALSE;  return bIsRet;
}没操作过excel,上面的流程对不?
我主要是想打开一份excel然后两列两列的存入ini文件中。列数为偶数。

解决方案 »

  1.   

    http://topic.csdn.net/u/20091122/09/f06c23a8-6c09-4223-87c4-29402b76e4a2.html
      

  2.   

    主要是excel2003的细节不清楚,只知道大概流程。 网上找了些参考的例子大都是vc6+2000的。 还没找到一个用2003的。另外很多都是mfc的。
      

  3.   

    下了个office03, 调了一下你的代码, 不幸的是我那里程序都能运行下去,没报错误。
    不过你抱的错误是一个_com_error类型的异常,你可以看一下异常的原因BOOL COperateExcel2003::OpenExcelFile(int &nRows) 

    CString strError;
    BOOL bIsRet = FALSE; 
    if(!CreateExcelInstance()) 
    return bIsRet; 
    try
    {
    pApplication->PutVisible (0,VARIANT_TRUE); 
    pWorkbooks = pApplication->Workbooks; 
    pThisWorkbook = pWorkbooks->Open("H:\\My VC++ Proj\\HelpFile.xls"); 
    pWorksheets = pThisWorkbook->GetWorksheets();/*走到这里报错,说ExcelToIni.exe 中的 0x7c812afb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f9d8 处的 _com_error。*/  
    pThisWorksheet = pWorksheets->GetItem( _variant_t((long)1)); 
    pThisRange = pThisWorksheet->GetCells(); 
    nRows = pThisRange->GetRow();//这里我想得到此excel的row数  
    bIsRet = TRUE; 
    }
    catch(_com_error &e )
    {
    strError = (LPCTSTR)e.Description(); // 这里能得到异常的原因,你看一下

    }
    return bIsRet; 
      

  4.   

    pWorksheets = pThisWorkbook->GetWorksheets();  --------> pWorksheets = pThisWorkbook->GetSheets();
      

  5.   

    在这里strError为空。错误指示在如下代码中:
        // Also provides simple error checking.
        //
        Interface* operator->() const 
        { 
            if (m_pInterface == NULL) {
                _com_issue_error(E_POINTER);
            }        return m_pInterface; 
        }