C++ 读取/写入EXCEL


程序对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;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM