EXCEL操作

 一、COM方式,看似最复杂,实际很简单方便的   

//在InitInstance中加入如下代码
   if(!AfxOleInit())
    {
        AfxMessageBox(_T( "Cannot initialize COM dll" ));
        return FALSE;
    }

//导入类型库查找excel.exe
#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorkbook.h"
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CRanges.h"
#include "CRange.h"
//以上加入到 stdafx.h中

将以上头文件的#import "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace
替换成以下:
#pragma region Import the type libraries
//#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" 
#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" \
    rename("RGB", "MSORGB") \
    rename("DocumentProperties", "MSODocumentProperties")
using namespace Office;

//#import "libid:0002E157-0000-0000-C000-000000000046" 
#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"
using namespace VBIDE;

//#import "libid:00020813-0000-0000-C000-000000000046"
#import "C:\\Program Files (x86)\\Microsoft Office\\Office11\\EXCEL.EXE" \
    rename("DialogBox", "ExcelDialogBox") \
    rename("RGB", "ExcelRGB") \
    rename("CopyFile", "ExcelCopyFile") \
    rename("ReplaceText", "ExcelReplaceText") \
    no_auto_exclude  
#pragma endregion
编译,出现error C2059,将VARIANT DialogBox()改成VARIANT _DialogBox()
再次编译,通过!!
以下为excel操作
CApplication ExcelApp;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
        LPDISPATCH lpDisp = NULL;
COleVariant varItem;
COleVariant File;
        //创建Excel 服务器(启动Excel)
                if(!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
                {
                    AfxMessageBox(_T("启动Excel服务器失败!"));
                    return;
                }
                ExcelApp.put_Visible(FALSE);
        ExcelApp.put_UserControl(TRUE);
        books.AttachDispatch(ExcelApp.get_Workbooks());
                lpDisp = books.Open(FilePathname, 
                vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
                vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 
                vtMissing, vtMissing, vtMissing, vtMissing);
        if(lpDisp != NULL)
            book.AttachDispatch(lpDisp);
                sheets.AttachDispatch(book.get_Sheets());
        lpDisp = sheets.get_Item(_variant_t(strSheetName));
        if(lpDisp != NULL)
         sheet.AttachDispatch(lpDisp);
        //以上为关联sheet,book等,,以下为读操作
range.AttachDispatch(sheet.get_Cells());//一定要,不知道为何
range.AttachDispatch(range.get_Item(COleVariant((long)20), COleVariant((long)2)).pdispVal, TRUE);//关联(20,2)单元格
varItem = range.get_Value2();
strItem1.Format(_T("%.lf"), varItem.dblVal);//知道是double类型,直接使用,若不知道得做类型判断
PointSum = _ttoi(strItem1);
m_PIC.m_pointSum = PointSum;
range.ReleaseDispatch();
        //以下为写excel
        range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)2)).pdispVal, TRUE);
//varItem.dblVal = m_PIC.m_Len[i - 2];
//range.put_Item(COleVariant((long)i), COleVariant((long)2), COleVariant(m_PIC.m_Len[i - 2]));
range.put_Value2(COleVariant(m_PIC.m_Len[i - 2]));
range.ReleaseDispatch();
        //最后保存
                book.Save();
        //释放对象
        sheet.ReleaseDispatch();
        sheets.ReleaseDispatch();
        book.ReleaseDispatch();
        books.ReleaseDispatch();
        ExcelApp.Quit();
        ExcelApp.ReleaseDispatch();
posted @ 2016-11-10 10:57  fyk1Ex  阅读(284)  评论(0)    收藏  举报