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;
rename("DialogBox", "ExcelDialogBox") \
rename("RGB", "ExcelRGB") \
rename("CopyFile", "ExcelCopyFile") \
rename("ReplaceText", "ExcelReplaceText") \
no_auto_exclude
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();

浙公网安备 33010602011771号