c++ 读写Excel及数据导入SQLServer
c++ 读写Excel及数据导入SQLServer
C++操作Excel ,网上的资料还是比较多的,写这篇文章也是分享给初学者一些经验。
本人 觉得CSpreadSheet.h这个类封装的还不错。下面我就如何使用这个类介绍一下,
////////////////main.cpp///////////////////////////////////////////////////// #include <string>
#include<afxdb.h>
#include<odbcinst.h>
#include "CSpreadSheet.h"
using std::string; #pragma warning(disable:4146)
#pragma warning(disable:4786)
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") //插入到数据库
bool InsertExcel(CString str1,CString str2)
{
try
{
CDatabase m_db;
if (!m_db.IsOpen())
{
m_db.OpenEx("Dsn=MyDatabase;uid=Administrator;trusted_connection=Yes;app=Microsoft? Visual Studio? 2005;wsid=LIYU\SQLEXPRESS;database=MyDdatabase",0);
} CString sql("insert into Students(myname,age) values('"+ str1+"','"+str2+"')");
m_db.ExecuteSQL(sql); if(m_db.IsOpen())
{
m_db.Close();
}
return true;
}
catch(_com_error e)
{
string ErrorMessage("数据库连接关闭失败:"),Description,Source;
Description=e.Description();
Source=e.Source();
ErrorMessage+=e.ErrorMessage();
ErrorMessage=ErrorMessage+"\r\n"+Source+"\r\n"+Description;
::MessageBox(NULL,ErrorMessage.c_str(),"错误",MB_OK);
return false;
} }
//获取路径
CString GetAddr()
{ CString sFile,sPath; //获取主程序所在路径,存在sPath中
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos); sFile = sPath + "\\Demo.xls";
return sFile;
}
//得到驱动
CString GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver; // 获取已安装驱动的名称(涵数在odbcinst.h里)
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return ""; // 检索已安装的驱动是否有Excel...
do
{
if (strstr(pszBuf,"Excel") != 0)
{
//发现 !
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, '\0') + 1;
}
while (pszBuf[1] != '\0'); return sDriver;
}
//读取Excel
void ReadFromExcel()
{
TRY
{
CString str=GetAddr();
if(str.IsEmpty())
::MessageBox(NULL,"无法获取当前路径",NULL,MB_OK);
else
{
CSpreadSheet SS(str,"Students");
CStringArray Rows, Column;
CString strContents = "";
CString sItem[3]={"0"};
for (int i = 2; i < SS.GetTotalRows()+1; i++)
{
// 读取一行
SS.ReadRow(Rows, i);
strContents.Empty();
for (int j = 0; j < Rows.GetSize(); j++)
{
strContents = Rows.GetAt(j);
sItem[j]=strContents;
printf("%s\t",sItem[j]);
}
printf("\n");
if(!InsertExcel(sItem[1],sItem[2]))
{
::MessageBox(NULL,"导入数据出错","错误",MB_OK);
return;
}
}
}
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
} //写Excel
void WriteFromExcel(int num,CString str1,CString str2,CString str3)
{
CString path=GetAddr();
if(path.IsEmpty())
::MessageBox(NULL,"获取路径错误",NULL,MB_OK);
else
{
// 新建Excel文件名及路径,TestSheet为内部表名
CSpreadSheet SS(path,"StudentsOut");
CStringArray sampleArray, testRow;
SS.BeginTransaction(); // 加入标题
sampleArray.RemoveAll();
sampleArray.Add("ID");
sampleArray.Add("myname");
sampleArray.Add("age"); SS.AddHeaders(sampleArray);
testRow.Add(str1);
testRow.Add(str2);
testRow.Add(str3);
SS.AddRow(testRow,num,true);
SS.Commit();
}
} //查询
bool selectExcel()
{
_ConnectionPtr m_pConnection; //connection object's pointer
_CommandPtr m_pCommand; //command object's pointer
_ParameterPtr m_pParameter; //Parameter object's pointer
_RecordsetPtr m_pRecordset; HRESULT hr;
try
{
// 创建连接对象
hr=m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
if(!SUCCEEDED(hr)) return FALSE; // 连接数据库
m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
m_pConnection->ConnectionTimeout=20;//等待连接的时间为20s
hr=m_pConnection->Open("","","",adModeUnknown);
if(!SUCCEEDED(hr)) return FALSE; // 查询数据库
_variant_t RecordsAffected;
std::string sql= "select * from Students";
char * str=(char*)sql.c_str(); m_pRecordset=m_pConnection->Execute(str,&RecordsAffected,adCmdText);
//m_pRecordset-> Open(str, _variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
int i=2;
// 遍历查询结果
while (!m_pRecordset->adoEOF)
{
printf("%s\t",(char*)(_bstr_t)m_pRecordset->GetCollect("ID"));
printf("%s\t",(char*)(_bstr_t)m_pRecordset->GetCollect("myname"));
printf("%s\n",(char*)(_bstr_t)m_pRecordset->GetCollect("age"));
CString str1=(CString)m_pRecordset->GetCollect("ID");
CString str2=(CString)m_pRecordset->GetCollect("myname");
CString str3=(CString)m_pRecordset->GetCollect("age"); WriteFromExcel(i++,str1,str2,str3);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
// 关闭数据库连接
if(m_pConnection!=NULL)
{
m_pConnection->Close();
m_pConnection = NULL ; }
}
catch(_com_error e)
{
string ErrorMessage("数据库连接关闭失败:"),Description,Source;
Description=e.Description();
Source=e.Source();
ErrorMessage+=e.ErrorMessage();
ErrorMessage=ErrorMessage+"\r\n"+Source+"\r\n"+Description;
::MessageBox(NULL,ErrorMessage.c_str(),"错误",MB_OK);
return FALSE;
}
} int main()
{
CoInitialize(NULL);
// ReadFromExcel();//读取Excel到数据库
selectExcel();
CoUninitialize( );
system("pause");
return 0;
}
////////////////mian.cpp////////////////////////////////////////////////
c++ 读写Excel及数据导入SQLServer的更多相关文章
- 将Excel中数据导入数据库(二)
在上篇文章中介绍到将Excel中数据导入到数据库中,但上篇文章例子只出现了nvachar类型,且数据量很小.今天碰到将Excel中数据导入数据库中的Excel有6419行,其中每行均有48个字段,有i ...
- Excel表数据导入Sql Server数据库中
Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nv ...
- Excel的数据导入到PB的DW中
Excel的数据导入到PB的DW中//==================================================================== // Event:cb_ ...
- Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
(注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘 要:DataGridView控件作为数据传输的中介,只 ...
- 将Excel中数据导入数据库(三)
上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...
- 将Excel中数据导入数据库(一)
在工作中经常要将Excel中数据导入数据库,这里介绍一种方法. 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: Excel中数据导入数据库帮助类如下: using System; ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...
- Excel表数据导入数据库表中
***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...
- 把Excel的数据导入到数据库
将Excel作为数据源,将数据导入数据库,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个packag ...
随机推荐
- [实战]MVC5+EF6+MySql企业网盘实战(13)——编辑文件夹
写在前面 上篇文章实现了,新建文件夹以及与之前的上传文件的逻辑做了集成,本篇文章将实现编辑文件夹名称,其实这个也有难点,就是编辑文件夹名称时,要考虑文件夹中存在文件或者子文件夹的情况,因为他们的路径已 ...
- ASP.NET MVC 3和Razor中的@helper
ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通 ...
- CF815C Karen and Supermarket [树形DP]
题目传送门 Karen and Supermarket On the way home, Karen decided to stop by the supermarket to buy some gr ...
- CodeVS1380 没有上司的舞会 [树形DP]
题目传送门 没有上司的舞会 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个 ...
- Python模块-xml
XML的例子 import xml.etree.ElementTree as ET tree = ET.parse("test.xml") root = tree.getroot( ...
- Python之路【第二篇】: 列表、元组、字符串、字典、集合
本文内容: -------------------------------------- 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表(list) 序列是Pyt ...
- 二进制拆位(贪心)【p2114】[NOI2014]起床困难综合症
Description 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了 ...
- 为什么我喜欢Java
我现在的老板使用一个在线测试系统来筛选在线申请职位的求职者.测试的第一个问题很浅显,仅仅是为了让求职者熟悉一下这个系统的提交和测试代码的流程.问题是这样的,写一个将标准输入拷贝到标准输出的流程.求职者 ...
- FastReport.Net使用:[16]图片控件使用
FastReport中,图片(Picture)控件的用法? 支持的图片格式 1.BMP, PNG, JPG, GIF, TIFF, ICO, EMF, WMF 支持的数据源 支持图片,数据列,文件名, ...
- SPOJ1811 && SPOJ1812
SPOJ1811 && SPOJ1812 LCS && LCS2 非常神奇的两道题... 题目大意: 给定n个字符串,求最长公共子串 做法1: 后缀数组: 把字符串连起 ...