1.
将数据从
Excel
中导入到数据库中
:
将数据从
Excel
表中导入到数据中操作的思路比较简单
,
就是通过逐行获取单元格的内容
,
利用
GetItem(
行位置
m,
列位置
n)
来获取
m
行
n
列的值
,
再写个
WriteToDataBase(cstring a,…cstring z)
函数
,
将数据导入到数据库中
.
此外设计关键在于如何判断读取的
Excel
最后一行
,
在这里由于从开头的第一行到最后一行都不为空
.
所以我利用的是从
cstring a=GetItem(m,n);
if(a==””){break;}
来实现
.
但这样有个弊端
,
就是如果从第一行到最后一行中有一行的第一列为空
,
会导致该行后面的数据导入不到
DataBase
中
.
解决的办法暂时没有找到
.
函数如下
:
void
CContentsSubmitDlg::OnBnClickedImporttosql()
{
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
//
创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("
创建Excel服务失败!");
exit(1);
}
ExcelApp.SetVisible(false);
//
利用模板文件建立新文档
CString strPath = strparthTosql;//strparthTosql
为要导入的*.xls路径,它为全局变量
if(strPath=="")
{
AfxMessageBox
("EXCEL
路径不存在",MB_OK);
return;
}
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strPath)));
//
得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//
得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("Sheet1")),true);
//
得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
int j=2;
CString getstr[100][13];
CStdioFile iniConfigFile;
if(iniConfigFile.m_pStream=fopen(strparthTosql,"r+w"))//
打开excel文件
{
COleDateTime idtimeNow;//
编号采用时间可以避免重复
CString idcontent,cyear,cmoth,cday,chour,cmin,csec;
while(!feof(iniConfigFile.m_pStream))
{ //
通过GetItem逐行获取单元格的内容
getstr[j][0]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)1));
if(getstr[j][0]=="") //
如果第一列为空,表示到了最后一行
{ break; }
getstr[j][1]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)2));
getstr[j][2]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)3));
getstr[j][3]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)4));
getstr[j][4]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)5));
getstr[j][5]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)6));
getstr[j][6]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)7));
getstr[j][7]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)8));
getstr[j][8]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)9));
idtimeNow = COleDateTime::GetCurrentTime();
int year = idtimeNow.GetYear();
int month = idtimeNow.GetMonth();
int day = idtimeNow.GetDay();
int hour = idtimeNow.GetHour();
int minute = idtimeNow.GetMinute();
int second = idtimeNow.GetSecond();
cyear.Format("%d",year);
cmoth.Format("%d",month);
cday.Format("%d",day);
chour.Format("%d",hour);
cmin.Format("%d",minute);
csec.Format("%d",second);
idcontent=cyear+cmoth+cday+chour+cmin+csec;
getstr[j][9]=idcontent;//
导入的提报编号
getstr[j][10]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)11));
getstr[j][11]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)12));
getstr[j][12]=rgMyRge.GetItem(_variant_t((long)j),_variant_t((long)13));
bool
TorF=WriteDataToSql(getstr[j][0],getstr[j][1],getstr[j][2],getstr[j][3],getstr[j][4],getstr[j][5],getstr[j][6],getstr[j][7],getstr[j][8],getstr[j][9],getstr[j][10],getstr[j][11],getstr[j][12]);
if (TorF) //
如果该行数据写入成功,则继续写下一行
{ j++; }
else
{
AfxMessageBox("
导入数据库出错,请检查格式是否正确",MB_OK);
j++;
}
}
}
AfxMessageBox("
导入操作成功",MB_OK);
int m=j;
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
}
其中
,
写入数据库的函数
WriteDataToSql(…)
函数代码如下
:
bool
CContentsSubmitDlg::WriteDataToSql(
CString
Team,
CString
Project,
CString
ChildProject,
CString
Contents,
CString
Schedual,
CString
Completedate,
CString
Principals,
CString
Remark,CString Speaker,
CString
Id,
CString
SubmitData,
CString
State,
CString
ProjectTime)
{
ADOconn
m_conn;
_
bstr
_t
vSQL="";
vSQL
="insert into CongressContents(Team, Project,ChildProject,Contents, Schedual, CompleteData,Principal,Remark,Speaker,Id,SubmitTime,State,Term) values('" +Team+"','"+Project+"','"+ChildProject+"','"+Contents+"','"+Schedual+"','"+Completedate+"','"+Principals+"','"+Remark+"','"+Speaker+"','"+Id+"','"+SubmitData+"','"+State+"','"+ProjectTime+"')";
m_conn.OnInitADOConn();
if(m_conn.ExcuteSQL(vSQL))
{ return true; }
else
{ return false; }
m_conn.ExitConnect();
}
2.
总结
其实对于Excel
的操作关键是六个类,
这六个类基本上把Excel
操作都定义到其中了,
我们只需要的是合理的调用写入就可以,
从某种意义上来说Excel
可看成一个数据库表,
它的第一行不凡看成是表的结构字段.
其他行表示表的内容.
只是由行和列就能确定Excel
的某个位置的具体值了.