为了方便操作Excel表格, 写了这个Excel读写类。
部分头文件:
//
ExcelSheet.h: interface for the CExcelSheet class.
// Excel 读写类 Copyright 2007
// programmed by shenhai, email: heatonshen@163.com
/**/ //
#if !defined(AFX_EXCELSHEET_H__84984803_14F7_4F6E_AB65_A429CA01D4E5__INCLUDED_)
#define AFX_EXCELSHEET_H__84984803_14F7_4F6E_AB65_A429CA01D4E5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include < odbcinst.h >
#include < afxdb.h >
#include < afxcoll.h >
#ifndef EXCELSHEET_API
#define EXCELSHEET_API __declspec(dllexport)
#endif
class EXCELSHEET_API CExcelSheet
... {
public:
//构造函数
CExcelSheet();
virtual ~CExcelSheet();
bool OpenExcel(CString File, CString SheetOrSeparator, bool Backup = false);
inline bool CloseExcel()...{ return true;}
//删除excel中的所有表格
bool DeleteSheet();
//删除excel中指定的表格
bool DeleteSheet(CString SheetName);
bool RollBack();
//取总行数
inline long GetTotalRows() ...{return m_dTotalRows;}
//取总列数
inline short GetTotalColumns() ...{return m_dTotalColumns;}
//取当前所在行数
inline long GetCurrentRow() ...{return m_dCurrentRow;}
//初始化excel缓存
void InitBuffer();
//添加数据方式一
int AddStr(LPCTSTR newElement);
int AddStr(const CString& newElement);
int AddChar(char newElement);
int AddDouble(double newElement);
int AddLong(long newElement);
//添加一行, 缺省尾部添加
bool AppendRecord(long row = 0);
//替换目的行
bool ReplaceRecord(long row);
//添加excel表头
bool AppendHeaders();
//替换excel表头
bool ReplaceHeaders();
//添加数据方式二 , 先要InitBuffer(), add完后再AppendRecord或者ReplaceRecord
//以char*添加
int AddStr(char *fieldname, char *destValue);
//以CString添加
int AddStr(char *fieldname, CString &destValue);
//以char添加
int AddChar(char *fieldname, char destValue);
//以长整型添加
int AddLong(char *fieldname, long destValue);
//以整型添加
int AddInt(char *fieldname, int destValue);
//以double型添加
int AddDouble(char *fieldname, double destValue);
// 返回值为字段的类型
// 读取一行excel数据,缺省读取当前下一行
bool ReadRecord(long row = 0);
// 以char * 返回字段的值
void GetStr(char *fieldname, char *destValue);
// 以CString返回字段的值
void GetStr(char *fieldname, CString &destValue);
// 将字段内容以单字节返回
void GetChar(char *fieldname, char &destValue);
// 以长整型返回
long GetLong(char *fieldname);
// 以整型返回(在windows中和上边一样)
int GetInt(char *fieldname);
// 以double返回字段的值
double GetDouble(char *fieldname);
void BeginTransaction();
inline CString GetLastError()
private:
bool m_bAppend;
bool m_bBackup;
bool m_bExcel;
bool m_bTransaction;
long m_dCurrentRow;
long m_dTotalRows;
short m_dTotalColumns;
CString m_sSql;
CString m_sDsn;
CString m_stempSql;
CString m_stempString;
CString m_sSheetName;
CString m_sExcelDriver;
CString m_sFile;
CString m_sSeparator;
CString m_sLastError;
CStringArray m_ExcelRow;
CStringArray m_ExcelRowforOut;
CStringArray m_atempArray;
CStringArray m_aFieldNames;
CStringArray m_aRows;
CDatabase *m_Database;
CRecordset *m_rSheet;
} ;
#endif
// Excel 读写类 Copyright 2007
// programmed by shenhai, email: heatonshen@163.com
/**/ //
#if !defined(AFX_EXCELSHEET_H__84984803_14F7_4F6E_AB65_A429CA01D4E5__INCLUDED_)
#define AFX_EXCELSHEET_H__84984803_14F7_4F6E_AB65_A429CA01D4E5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include < odbcinst.h >
#include < afxdb.h >
#include < afxcoll.h >
#ifndef EXCELSHEET_API
#define EXCELSHEET_API __declspec(dllexport)
#endif
class EXCELSHEET_API CExcelSheet
... {
public:
//构造函数
CExcelSheet();
virtual ~CExcelSheet();
bool OpenExcel(CString File, CString SheetOrSeparator, bool Backup = false);
inline bool CloseExcel()...{ return true;}
//删除excel中的所有表格
bool DeleteSheet();
//删除excel中指定的表格
bool DeleteSheet(CString SheetName);
bool RollBack();
//取总行数
inline long GetTotalRows() ...{return m_dTotalRows;}
//取总列数
inline short GetTotalColumns() ...{return m_dTotalColumns;}
//取当前所在行数
inline long GetCurrentRow() ...{return m_dCurrentRow;}
//初始化excel缓存
void InitBuffer();
//添加数据方式一
int AddStr(LPCTSTR newElement);
int AddStr(const CString& newElement);
int AddChar(char newElement);
int AddDouble(double newElement);
int AddLong(long newElement);
//添加一行, 缺省尾部添加
bool AppendRecord(long row = 0);
//替换目的行
bool ReplaceRecord(long row);
//添加excel表头
bool AppendHeaders();
//替换excel表头
bool ReplaceHeaders();
//添加数据方式二 , 先要InitBuffer(), add完后再AppendRecord或者ReplaceRecord
//以char*添加
int AddStr(char *fieldname, char *destValue);
//以CString添加
int AddStr(char *fieldname, CString &destValue);
//以char添加
int AddChar(char *fieldname, char destValue);
//以长整型添加
int AddLong(char *fieldname, long destValue);
//以整型添加
int AddInt(char *fieldname, int destValue);
//以double型添加
int AddDouble(char *fieldname, double destValue);
// 返回值为字段的类型
// 读取一行excel数据,缺省读取当前下一行
bool ReadRecord(long row = 0);
// 以char * 返回字段的值
void GetStr(char *fieldname, char *destValue);
// 以CString返回字段的值
void GetStr(char *fieldname, CString &destValue);
// 将字段内容以单字节返回
void GetChar(char *fieldname, char &destValue);
// 以长整型返回
long GetLong(char *fieldname);
// 以整型返回(在windows中和上边一样)
int GetInt(char *fieldname);
// 以double返回字段的值
double GetDouble(char *fieldname);
void BeginTransaction();
inline CString GetLastError()
private:
bool m_bAppend;
bool m_bBackup;
bool m_bExcel;
bool m_bTransaction;
long m_dCurrentRow;
long m_dTotalRows;
short m_dTotalColumns;
CString m_sSql;
CString m_sDsn;
CString m_stempSql;
CString m_stempString;
CString m_sSheetName;
CString m_sExcelDriver;
CString m_sFile;
CString m_sSeparator;
CString m_sLastError;
CStringArray m_ExcelRow;
CStringArray m_ExcelRowforOut;
CStringArray m_atempArray;
CStringArray m_aFieldNames;
CStringArray m_aRows;
CDatabase *m_Database;
CRecordset *m_rSheet;
} ;
#endif
使用示例:
一,添加数据:
//
新建Excel文件名及路径,SheetTable为内部表名
CExcelSheet ExcelSheet;
ExcelSheet.OpenExcel( " c:/ExcelSheet.xls " , " SheetTable " );
ExcelSheet.BeginTransaction();
// 加入标题
// 添加数据前需要先InitBuffer(),创建输入缓存
ExcelSheet.InitBuffer();
ExcelSheet.AddStr( " 姓名 " );
ExcelSheet.AddStr( " 年龄 " );
ExcelSheet.AddStr( " 身高 " );
ExcelSheet.AddStr( " 收入 " );
ExcelSheet.AddStr( " ab1 " );
// 调用ReplaceHeaders()将输入缓存写入Excel
ExcelSheet.ReplaceHeaders();
// 加入数据
// 方法一,按照数据字段顺序添加
ExcelSheet.InitBuffer();
ExcelSheet.AddStr( " 张三 " );
ExcelSheet.AddStr( " 16 " );
ExcelSheet.AddLong( 12345 );
ExcelSheet.AddDouble( 12.345 );
ExcelSheet.AddChar( ' s ' );
ExcelSheet.AppendRecord();
// 方法二,按照数据字段名称添加
ExcelSheet.InitBuffer();
ExcelSheet.AddLong( " 身高 " , 12345 );
ExcelSheet.AddDouble( " 收入 " , 12.345 );
ExcelSheet.AddChar( " ab1 " , ' s ' );
ExcelSheet.AddStr( " 姓名 " , " 张三 " );
ExcelSheet.AddStr( " 年龄 " , " 16 " );
ExcelSheet.AppendRecord();
CExcelSheet ExcelSheet;
ExcelSheet.OpenExcel( " c:/ExcelSheet.xls " , " SheetTable " );
ExcelSheet.BeginTransaction();
// 加入标题
// 添加数据前需要先InitBuffer(),创建输入缓存
ExcelSheet.InitBuffer();
ExcelSheet.AddStr( " 姓名 " );
ExcelSheet.AddStr( " 年龄 " );
ExcelSheet.AddStr( " 身高 " );
ExcelSheet.AddStr( " 收入 " );
ExcelSheet.AddStr( " ab1 " );
// 调用ReplaceHeaders()将输入缓存写入Excel
ExcelSheet.ReplaceHeaders();
// 加入数据
// 方法一,按照数据字段顺序添加
ExcelSheet.InitBuffer();
ExcelSheet.AddStr( " 张三 " );
ExcelSheet.AddStr( " 16 " );
ExcelSheet.AddLong( 12345 );
ExcelSheet.AddDouble( 12.345 );
ExcelSheet.AddChar( ' s ' );
ExcelSheet.AppendRecord();
// 方法二,按照数据字段名称添加
ExcelSheet.InitBuffer();
ExcelSheet.AddLong( " 身高 " , 12345 );
ExcelSheet.AddDouble( " 收入 " , 12.345 );
ExcelSheet.AddChar( " ab1 " , ' s ' );
ExcelSheet.AddStr( " 姓名 " , " 张三 " );
ExcelSheet.AddStr( " 年龄 " , " 16 " );
ExcelSheet.AppendRecord();
二,读取数据
CExcelSheet ExcelSheet;
ExcelSheet.OpenExcel( " c:/ExcelSheet.xls " , " SheetTable " );
// 将当前数据行读入输出buffer
ExcelSheet.ReadRecord(i);
CString strContents = "" ;
char abc[ 1024 ];
ExcelSheet.GetStr( " 姓名 " , abc);
CString strTemp = "" ;
int age = ExcelSheet.GetLong( " 年龄 " ));
int tall = ExcelSheet.GetInt( " 身高 " ));
double income = ExcelSheet.GetDouble( " 收入 " ));
char aaa;
ExcelSheet.GetChar( " ab1 " , aaa);
ExcelSheet.OpenExcel( " c:/ExcelSheet.xls " , " SheetTable " );
// 将当前数据行读入输出buffer
ExcelSheet.ReadRecord(i);
CString strContents = "" ;
char abc[ 1024 ];
ExcelSheet.GetStr( " 姓名 " , abc);
CString strTemp = "" ;
int age = ExcelSheet.GetLong( " 年龄 " ));
int tall = ExcelSheet.GetInt( " 身高 " ));
double income = ExcelSheet.GetDouble( " 收入 " ));
char aaa;
ExcelSheet.GetChar( " ab1 " , aaa);
有需要的xdjms可以给我发email索取最新版本的release,当然
有臭虫或者有什么建议也要积极报告:)