c++ 读写Excel及数据导入SQLServer
     
          C++操作Excel ,网上的资料还是比较多的,写这篇文章也是分享给初学者一些经验。

本人 觉得CSpreadSheet.h这个类封装的还不错。下面我就如何使用这个类介绍一下,

  1. ////////////////main.cpp/////////////////////////////////////////////////////
  2.  
  3. #include <string>
  4. #include<afxdb.h>
  5. #include<odbcinst.h>
  6. #include "CSpreadSheet.h"
  7. using std::string;
  8.  
  9. #pragma warning(disable:4146)
  10. #pragma warning(disable:4786)
  11. #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
  12.  
  13. //插入到数据库
  14. bool InsertExcel(CString str1,CString str2)
  15. {
  16. try
  17. {
  18. CDatabase m_db;
  19. if (!m_db.IsOpen())
  20. {
  21. m_db.OpenEx("Dsn=MyDatabase;uid=Administrator;trusted_connection=Yes;app=Microsoft? Visual Studio? 2005;wsid=LIYU\SQLEXPRESS;database=MyDdatabase",0);
  22. }
  23.  
  24. CString sql("insert into Students(myname,age) values('"+ str1+"','"+str2+"')");
  25. m_db.ExecuteSQL(sql);
  26.  
  27. if(m_db.IsOpen())
  28. {
  29. m_db.Close();
  30. }
  31. return true;
  32. }
  33. catch(_com_error e)
  34. {
  35. string ErrorMessage("数据库连接关闭失败:"),Description,Source;
  36. Description=e.Description();
  37. Source=e.Source();
  38. ErrorMessage+=e.ErrorMessage();
  39. ErrorMessage=ErrorMessage+"\r\n"+Source+"\r\n"+Description;
  40. ::MessageBox(NULL,ErrorMessage.c_str(),"错误",MB_OK);
  41. return false;
  42. }
  43.  
  44. }
  45. //获取路径
  46. CString GetAddr()
  47. {
  48.  
  49. CString sFile,sPath;
  50.  
  51. //获取主程序所在路径,存在sPath中
  52. GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
  53. sPath.ReleaseBuffer ();
  54. int nPos;
  55. nPos=sPath.ReverseFind ('\\');
  56. sPath=sPath.Left (nPos);
  57.  
  58. sFile = sPath + "\\Demo.xls";
  59. return sFile;
  60. }
  1. //得到驱动
  2. CString GetExcelDriver()
  3. {
  4. char szBuf[2001];
  5. WORD cbBufMax = 2000;
  6. WORD cbBufOut;
  7. char *pszBuf = szBuf;
  8. CString sDriver;
  9.  
  10. // 获取已安装驱动的名称(涵数在odbcinst.h里)
  11. if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
  12. return "";
  13.  
  14. // 检索已安装的驱动是否有Excel...
  15. do
  16. {
  17. if (strstr(pszBuf,"Excel") != 0)
  18. {
  19. //发现 !
  20. sDriver = CString(pszBuf);
  21. break;
  22. }
  23. pszBuf = strchr(pszBuf, '\0') + 1;
  24. }
  25. while (pszBuf[1] != '\0');
  26.  
  27. return sDriver;
  28. }
  1. //读取Excel
  2. void ReadFromExcel()
  3. {
  4. TRY
  5. {
  6. CString str=GetAddr();
  7. if(str.IsEmpty())
  8. ::MessageBox(NULL,"无法获取当前路径",NULL,MB_OK);
  9. else
  10. {
  11. CSpreadSheet SS(str,"Students");
  12. CStringArray Rows, Column;
  13. CString strContents = "";
  14. CString sItem[3]={"0"};
  15. for (int i = 2; i < SS.GetTotalRows()+1; i++)
  16. {
  17. // 读取一行
  18. SS.ReadRow(Rows, i);
  19. strContents.Empty();
  20. for (int j = 0; j < Rows.GetSize(); j++)
  21. {
  22. strContents = Rows.GetAt(j);
  23. sItem[j]=strContents;
  24. printf("%s\t",sItem[j]);
  25. }
  26. printf("\n");
  27. if(!InsertExcel(sItem[1],sItem[2]))
  28. {
  29. ::MessageBox(NULL,"导入数据出错","错误",MB_OK);
  30. return;
  31. }
  32. }
  33. }
  34. }
  35. CATCH(CDBException, e)
  36. {
  37. // 数据库操作产生异常时...
  38. AfxMessageBox("数据库错误: " + e->m_strError);
  39. }
  40. END_CATCH;
  41. }
  42.  
  43. //写Excel
  44. void WriteFromExcel(int num,CString str1,CString str2,CString str3)
  45. {
  46. CString path=GetAddr();
  47. if(path.IsEmpty())
  48. ::MessageBox(NULL,"获取路径错误",NULL,MB_OK);
  49. else
  50. {
  51. // 新建Excel文件名及路径,TestSheet为内部表名
  52. CSpreadSheet SS(path,"StudentsOut");
  53. CStringArray sampleArray, testRow;
  54. SS.BeginTransaction();
  55.  
  56. // 加入标题
  57. sampleArray.RemoveAll();
  58. sampleArray.Add("ID");
  59. sampleArray.Add("myname");
  60. sampleArray.Add("age");
  61.  
  62. SS.AddHeaders(sampleArray);
  63. testRow.Add(str1);
  64. testRow.Add(str2);
  65. testRow.Add(str3);
  66. SS.AddRow(testRow,num,true);
  67. SS.Commit();
  68. }
  69. }
  70.  
  71. //查询
  72. bool selectExcel()
  73. {
  74. _ConnectionPtr m_pConnection; //connection object's pointer
  75. _CommandPtr m_pCommand; //command object's pointer
  76. _ParameterPtr m_pParameter; //Parameter object's pointer
  77. _RecordsetPtr m_pRecordset;
  78.  
  79. HRESULT hr;
  80. try
  81. {
  82. // 创建连接对象
  83. hr=m_pConnection.CreateInstance(__uuidof(Connection));
  84. m_pRecordset.CreateInstance(__uuidof(Recordset));
  85. if(!SUCCEEDED(hr)) return FALSE;
  86.  
  87. // 连接数据库
  88. m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
  89. m_pConnection->ConnectionTimeout=20;//等待连接的时间为20s
  90. hr=m_pConnection->Open("","","",adModeUnknown);
  91. if(!SUCCEEDED(hr)) return FALSE;
  92.  
  93. // 查询数据库
  94. _variant_t RecordsAffected;
  95. std::string sql= "select * from Students";
  96. char * str=(char*)sql.c_str();
  97.  
  98. m_pRecordset=m_pConnection->Execute(str,&RecordsAffected,adCmdText);
  99. //m_pRecordset-> Open(str, _variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  100. int i=2;
  101. // 遍历查询结果
  102. while (!m_pRecordset->adoEOF)
  103. {
  104. printf("%s\t",(char*)(_bstr_t)m_pRecordset->GetCollect("ID"));
  105. printf("%s\t",(char*)(_bstr_t)m_pRecordset->GetCollect("myname"));
  106. printf("%s\n",(char*)(_bstr_t)m_pRecordset->GetCollect("age"));
  107. CString str1=(CString)m_pRecordset->GetCollect("ID");
  108. CString str2=(CString)m_pRecordset->GetCollect("myname");
  109. CString str3=(CString)m_pRecordset->GetCollect("age");
  110.  
  111. WriteFromExcel(i++,str1,str2,str3);
  112. m_pRecordset->MoveNext();
  113. }
  114. m_pRecordset->Close();
  115. // 关闭数据库连接
  116. if(m_pConnection!=NULL)
  117. {
  118. m_pConnection->Close();
  119. m_pConnection = NULL ;
  120.  
  121. }
  122. }
  123. catch(_com_error e)
  124. {
  125. string ErrorMessage("数据库连接关闭失败:"),Description,Source;
  126. Description=e.Description();
  127. Source=e.Source();
  128. ErrorMessage+=e.ErrorMessage();
  129. ErrorMessage=ErrorMessage+"\r\n"+Source+"\r\n"+Description;
  130. ::MessageBox(NULL,ErrorMessage.c_str(),"错误",MB_OK);
  131. return FALSE;
  132. }
  133. }
  134.  
  135. int main()
  136. {
  137. CoInitialize(NULL);
  138. // ReadFromExcel();//读取Excel到数据库
  139. selectExcel();
  140. CoUninitialize( );
  141. system("pause");
  142. return 0;
  143. }
  144. ////////////////mian.cpp////////////////////////////////////////////////

c++ 读写Excel及数据导入SQLServer的更多相关文章

  1. 将Excel中数据导入数据库(二)

    在上篇文章中介绍到将Excel中数据导入到数据库中,但上篇文章例子只出现了nvachar类型,且数据量很小.今天碰到将Excel中数据导入数据库中的Excel有6419行,其中每行均有48个字段,有i ...

  2. Excel表数据导入Sql Server数据库中

    Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nv ...

  3. Excel的数据导入到PB的DW中

    Excel的数据导入到PB的DW中//==================================================================== // Event:cb_ ...

  4. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012

    (注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘  要:DataGridView控件作为数据传输的中介,只 ...

  5. 将Excel中数据导入数据库(三)

    上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...

  6. 将Excel中数据导入数据库(一)

    在工作中经常要将Excel中数据导入数据库,这里介绍一种方法. 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: Excel中数据导入数据库帮助类如下: using System; ...

  7. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)      select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...

  8. Excel表数据导入数据库表中

    ***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...

  9. 把Excel的数据导入到数据库

    将Excel作为数据源,将数据导入数据库,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个packag ...

随机推荐

  1. LeetCode 136. Single Number(只出现一次的数字)

    LeetCode 136. Single Number(只出现一次的数字)

  2. 获取 web 项目的绝对路径

    获取 web 项目的绝对路径 <% String path = request.getContextPath(); String basePath = request.getScheme()+& ...

  3. 尝试php命令行脚本多进程并发执行

    php不支持多线程,但是我们可以把问题转换成“多进程”来解决.由于php中的pcntl_fork只有unix平台才可以使用,所以本文尝试使用popen来替代.  下面是一个例子:  被并行调用的子程序 ...

  4. golang中接口interface和struct结构类的分析

    再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...

  5. http request GET 乱码分析

    提交一个GET请求 在浏览器地址栏或搜索框输入地址:http://www.baidu.com/content/衣服?keyword=衬衣 其中的中文会被浏览器进行编码,具体编码情况请参考阮大神:关于U ...

  6. y450 archlinux cuda6.5

    y450 archlinux cuda6.5 January 28, 2018 4:11 PM archlinux是最新更新版本,gcc版本到了7.几,太新了. [qiangge@lqspc ~]$ ...

  7. 【SQL】175. Combine Two Tables

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  8. Yii apache配置站点出现400 Bad Request 的解决方法

    <VirtualHost *:80> ServerName localhost ServerAlias localhost DocumentRoot "/www/frogCms/ ...

  9. 【BZOJ 3235】 3235: [Ahoi2013]好方的蛇 (单调栈+容斥原理)

    3235: [Ahoi2013]好方的蛇 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 187  Solved: 95 Description 有一天, ...

  10. 求n的阶乘 (python实现)

    描述 给定一个数n,范围为0≤n≤100,请你编程精确的求出n的阶乘n!. 输入 输入数据有多行,每行一个整数n,当n<0时输入结束. 输出 输出n的阶乘. 样例输入 1234-1 样例输出 1 ...