Excel读取程序设计(4)

  
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 的某个位置的具体值了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值