http://blog.csdn.net/rekrad/article/details/7666196
http://blog.csdn.net/fullsail/article/details/8449448
http://club.topsage.com/thread-2338554-1-1.html
网上都说C++读写EXCEL文件方法很多,如:ODBC、CSpreadsheet、OLE、Sourceforge 上的几个EXCEL库...
我试用了ODBC、CSpreadsheet二个方法,都是通过odbc数据库的方式存取excel,前者简单,几个函数解决,后者功能强大,有一个完整的类实现不同的功能,先存后取肯定没问题。但是仅读取excel文件时总是出错,我选择了放弃。
然后又试用了OLE方法,经试验成功,就是比较繁琐一点, 其他的就没使用了。下面是OLE的使用步骤:
1. 先确保安装了microsoft的excel软件,wps是不行的哦 ~ 因为只有ms的excel软件才提供了有关的类库;
2. 选中工程,添加类→MFC→Typelib中的MFC类。
新建一个MFC项目(ExportExcel), 建立完后点击右键,添加--类--MFC--TypeLib中的MFC类,分别从【接口】添加:_Application、_Workbook、_Worksheet、Workbooks、Worksheets到【生成的类】中,到该页面点添加如下:
3. 点添加完后,注意下,找到相关头文件,注释红色那行
//#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace不删除则会有莫名其妙编译错误
4. 再次编译还是会有编译错误:
1>d:\work\yuanxx\exportexcel\exportexcel\crange.h(336) : warning C4003: “DialogBoxA”宏的实参不足
1>d:\work\yuanxx\exportexcel\exportexcel\crange.h(336) : error C2059: 语法错误 : “,”
将DialogBox()改成_DialogBox(),则编译成功!
5. 重要的一步添加源码:
.h文件: IllusionExcelFile.h
#pragma once
//OLE的头文件
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "CApplication.h"
///
///用于OLE的方式的EXCEL读写,
class IllusionExcelFile
{
public:
//构造函数和析构函数
IllusionExcelFile();
virtual ~IllusionExcelFile();
protected:
///打开的EXCEL文件名称
CString open_excel_file_;
///EXCEL BOOK集合,(多个文件时)
CWorkbooks excel_books_;
///当前使用的BOOK,当前处理的文件
CWorkbook excel_work_book_;
///EXCEL的sheets集合
CWorksheets excel_sheets_;
///当前使用sheet
CWorksheet excel_work_sheet_;
///当前的操作区域
CRange excel_current_range_;
///是否已经预加载了某个sheet的数据
BOOL already_preload_;
///Create the SAFEARRAY from the VARIANT ret.
COleSafeArray ole_safe_array_;
protected:
///EXCEL的进程实例
static CApplication excel_application_;
public:
///
void ShowInExcel(BOOL bShow);
///检查一个CELL是否是字符串
BOOL IsCellString(long iRow, long iColumn);
///检查一个CELL是否是数值
BOOL IsCellInt(long iRow, long iColumn);
///得到一个CELL的String
CString GetCellString(long iRow, long iColumn);
///得到整数
int GetCellInt(long iRow, long iColumn);
///得到double的数据
double GetCellDouble(long iRow, long iColumn);
///取得行的总数
int GetRowCount();
///取得列的总数
int GetColumnCount();
///使用某个shet,shit,shit
BOOL LoadSheet(long table_index,BOOL pre_load = FALSE);
///通过名称使用某个sheet,
BOOL LoadSheet(const char* sheet,BOOL pre_load = FALSE);