程序对EXCEL做写入操作时值得注意到是数据量多大需要分多个文件写入,因为EXCEL的最大行数为65535行。
//读取EXCEL ,CListCtrl list
// sFile :文件位置
//sSheetName : 操作工作表名称
//items : 读取内容赋值数组(根据需要)
//nNum : 数组有效赋值行数(根据需要)
bool ReadFromExcel(CString sFile, CString sSheetName, Item **items, int *nNum)
{
g_sys_log->writeUDPSysLog("ReadFromExcel",0);
CDatabase database;
CString sSql;
//定义EXCEL读取的字段
CString AllCapital, Ask1, AskVol1, Bid1, BidVol1, FreeCapital, IndustryCode;
CString Is100, IsSuspension, LastPrice, Name, NO, OrderPrice, OrderStatus;
CString OrderVol,Positions,PriceYesterday, Reserved1, Reserved2, Reserved3;
CString Reserved4, Reserved5, Reserved6, Reserved7, Reserved8, Reserved9, Reserved10;
CString sDriver;
CString sDsn;
Item itemOnce;
int i = 0;
//CString sSheetName = "Sheet1";
//CString sFile = "测试读取EXCEL.xls";
//检查时否安装有Excel驱动 “Microsoft Excel Driver (*.xls)”
sDriver = GetExcelDriver();
if(sDriver.IsEmpty())
{
//没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动");
return false;
}
//创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
try
{
//打开数据库
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
//设置读取的查询语句
sSql.Format("SELECT * from [%s$]", sSheetName);
//执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
//得到查询结果
while(!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("AllCapital", itemOnce.AllCapital);
if(itemOnce.AllCapital.GetLength() < 1)
break;
recset.GetFieldValue("Ask1", itemOnce.Ask1);
recset.GetFieldValue("AskVol1", itemOnce.AskVol1);
recset.GetFieldValue("Bid1", itemOnce.Bid1);
recset.GetFieldValue("BidVol1", itemOnce.BidVol1);
recset.GetFieldValue("FreeCapital", itemOnce.FreeCapital);
recset.GetFieldValue("IndustryCode", itemOnce.IndustryCode);//
recset.GetFieldValue("Is100", itemOnce.Is100);//
recset.GetFieldValue("IsSuspension", itemOnce.IsSuspension);//
recset.GetFieldValue("LastPrice", itemOnce.LastPrice);
recset.GetFieldValue("Name", itemOnce.Name);
recset.GetFieldValue("NO", itemOnce.NO);
recset.GetFieldValue("OrderPrice", itemOnce.OrderPrice);
recset.GetFieldValue("OrderStatus", itemOnce.OrderStatus);
recset.GetFieldValue("OrderVol", itemOnce.OrderVol);
recset.GetFieldValue("Positions", itemOnce.Positions);
recset.GetFieldValue("PriceYesterday", itemOnce.PriceYesterday);
recset.GetFieldValue("Reserved1", itemOnce.Reserved1);
recset.GetFieldValue("Reserved2", itemOnce.Reserved2);
recset.GetFieldValue("Reserved3", itemOnce.Reserved3);
recset.GetFieldValue("Reserved4", itemOnce.Reserved4);
recset.GetFieldValue("Reserved5", itemOnce.Reserved5);
recset.GetFieldValue("Reserved6", itemOnce.Reserved6);
recset.GetFieldValue("Reserved7", itemOnce.Reserved7);
recset.GetFieldValue("Reserved8", itemOnce.Reserved8);
recset.GetFieldValue("Reserved9", itemOnce.Reserved9);
recset.GetFieldValue("Reserved10", itemOnce.Reserved10);
//加入到列表中
items[i]->AllCapital = itemOnce.AllCapital;
items[i]->Ask1= itemOnce.Ask1;
items[i]->AskVol1 = itemOnce.AskVol1;
items[i]->Bid1 = itemOnce.Bid1;
items[i]->BidVol1 = itemOnce.BidVol1;
items[i]->FreeCapital = itemOnce.FreeCapital;
items[i]->IndustryCode = itemOnce.IndustryCode;
items[i]->Is100 = itemOnce.Is100;
items[i]->IsSuspension = itemOnce.IsSuspension;
items[i]->LastPrice = itemOnce.LastPrice;
items[i]->Name = itemOnce.Name;
items[i]->NO = itemOnce.NO;
items[i]->OrderPrice = itemOnce.OrderPrice;
items[i]->OrderStatus = itemOnce.OrderStatus;
items[i]->OrderVol = itemOnce.OrderVol;
items[i]->Positions = itemOnce.Positions;
items[i]->PriceYesterday = itemOnce.PriceYesterday;
items[i]->Reserved1 = itemOnce.Reserved1;
items[i]->Reserved2 = itemOnce.Reserved2;
items[i]->Reserved3 = itemOnce.Reserved3;
items[i]->Reserved4 = itemOnce.Reserved4;
items[i]->Reserved5 = itemOnce.Reserved5;
items[i]->Reserved6 = itemOnce.Reserved6;
items[i]->Reserved7 = itemOnce.Reserved7;
items[i]->Reserved8 = itemOnce.Reserved8;
items[i]->Reserved9 = itemOnce.Reserved9;
items[i]->Reserved10 = itemOnce.Reserved10;
i ++;
//移动下一行
recset.MoveNext();
}
*nNum = i;
//关闭数据库
database.Close();
}
catch(CDBException e)
{
AfxMessageBox("数据库错误:" + e.m_strError);
return false;
}
return true;
}
///////////////////////////////////////////////////////华丽分割线////////////////////////////////////////////////////////////////////
//创建并写入Excel文件
void WriteToExcel()
{
g_sys_log->writeUDPSysLog("WriteToExcel",0);
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件,可以放在函数参中
CString sSql;
TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
sDriver, sExcelFile, sExcelFile);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 创建表结构(姓名、年龄)
sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
database.ExecuteSQL(sSql);
// 插入数值
sSql = "INSERT INTO demo (Name,Age) VALUES ('徐景周',26)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES ('徐志慧',22)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES ('郭徽',27)";
database.ExecuteSQL(sSql);
}
// 关闭数据库
database.Close();
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
}
END_CATCH_ALL;
}