CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

如何把SQL转换成EXCEL,大家帮帮忙,给个例子最好!

楼主crazyCSDNx(疯叉)2003-10-02 13:50:23 在 VC/MFC / 数据库 提问

如何把SQL转换成EXCEL,大家帮帮忙,给个例子最好! 问题点数:0、回复次数:4Top

1 楼Onega(www.fruitfruit.com)回复于 2003-10-02 17:56:34 得分 0

//   Savexls.cpp   :   create   a   new   excel   file   to   store   a   recordset.  
  //test   program   written   by   masterz,   environment:VS.NET2003,ExcelXP,   Windows2003  
   
  #include   "stdafx.h"  
  #include   "afxdisp.h"  
  #include   "CRange.h"  
  #include   "Oleauto.h"  
   
  typedef   IDispatch   _IMsoDispObj;  
  typedef   int   MsoRGBType   ;  
  #import   "G:\Program   Files\Microsoft   Office\Office10\excel.exe"     named_guids   raw_interfaces_only   rename("RGB","ExcelRGB")   rename("DialogBox","ExcelDialogBox")  
  using   namespace   Excel;  
  #import   "G:\Program   Files\Common   Files\System\ado\msado15.dll"     rename("EOF",   "EndOfFile")  
   
  void   ExportRsToExcel()  
  {  
  _variant_t   covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);  
  _ApplicationPtr   app("Excel.Application");  
  WorkbooksPtr   books;  
  _WorkbookPtr   book;  
  long   lcid   =LOCALE_USER_DEFAULT;  
  //app->put_Visible(lcid,VARIANT_TRUE);  
  SheetsPtr   sheets;  
  RangePtr   rangetmp;  
  IRangePtr   range;  
  Excel::FontPtr   font;  
  RangePtr   cols;  
  IDispatchPtr   pDisp;  
  //Get   a   new   workbook.  
  app->get_Workbooks(&books);  
  books->Add(covOptional,lcid,&book);  
  book->get_Worksheets(&sheets);  
  sheets->get_Item(_variant_t((short)1),&pDisp);  
  _WorksheetPtr   sheet(pDisp);  
  HRESULT   hr=S_OK;  
  hr=sheet->get_Range(_variant_t("A1"),_variant_t("A1"),(Range**)&rangetmp);  
  _variant_t   varval("test");  
  CRange   rg;  
  rg.AttachDispatch(rangetmp);  
  //rg.put_Value2(varval);  
  //rg.DetachDispatch();  
   
   
  TCHAR   conn_str_buf[1024];  
  LPCTSTR   db_path=_T("C:\\temp\\guestbook.mdb");  
  wsprintf(conn_str_buf,"PROVIDER=MSDASQL;DRIVER="  
  "{Microsoft   Access   Driver   (*.mdb)};DBQ=%s;UID=;PWD=;",db_path);  
  ADODB::_ConnectionPtr   pConn("ADODB.Connection");  
  ADODB::_RecordsetPtr     pRst("ADODB.Recordset");  
  pConn->Open(conn_str_buf,"","",ADODB::adConnectUnspecified);  
  pRst->Open("guestbook",   _variant_t((IDispatch   *)   pConn,   true),  
  ADODB::adOpenStatic,   ADODB::adLockReadOnly,   ADODB::adCmdTable);  
  ADODB::FieldsPtr   fds=pRst->GetFields();  
   
  long   m_iNumRows   =   1;  
  long   m_iNumCols   =   0;  
  fds->get_Count(&m_iNumCols);  
  COleSafeArray   saRet;  
  DWORD   numElements[2];  
  numElements[0]=   m_iNumRows;       //Number   of   rows   in   the   range.  
  numElements[1]=   m_iNumCols;       //Number   of   columns   in   the   range.  
  saRet.Create(VT_BSTR,   2,   numElements);  
  //Fill   the   SAFEARRAY.  
  long   index[2];  
  long   iRow;  
  long   iCol;  
  rg   =   rg.get_Resize(COleVariant(m_iNumRows),  
  COleVariant(m_iNumCols));  
   
  for(iRow=0;iRow<=m_iNumRows-1;iRow++)  
  {  
  for(iCol=0;iCol<=m_iNumCols-1;iCol++)  
  {  
  index[0]   =   iRow;  
  index[1]   =   iCol;  
  VARIANT   v;  
  VariantInit(&v);  
  BSTR   bstrFieldName;  
  fds->Item[(short)iCol]->get_Name(&bstrFieldName);  
  v.vt   =   VT_BSTR;  
  v.bstrVal   =   bstrFieldName;//.Detach();  
  saRet.PutElement(index,   v.bstrVal);  
  SysFreeString(v.bstrVal);  
  VariantClear(&v);  
  }  
  }  
  rg.put_Value2(COleVariant(saRet));  
  rg.DetachDispatch();  
  saRet.Detach();  
   
  pRst->MoveLast();  
  long   lrec_count=pRst->RecordCount;  
  printf("field   column   count   %d   ,   rows   %d   \n",m_iNumCols,lrec_count);  
   
  pRst->MoveFirst();  
  if(lrec_count>0)  
  {  
  m_iNumRows   =   lrec_count;  
  numElements[0]=   m_iNumRows;       //Number   of   rows   in   the   range.  
  numElements[1]=   m_iNumCols;       //Number   of   columns   in   the   range.  
  RangePtr   rang2;  
  hr=sheet->get_Range(_variant_t("A2"),_variant_t("A2"),(Range**)&rang2);  
  rg.AttachDispatch(rang2);  
  rg   =   rg.get_Resize(COleVariant(m_iNumRows),  
  COleVariant(m_iNumCols));  
  saRet.Create(VT_VARIANT,   2,   numElements);  
  for(iRow=0;iRow<=m_iNumRows-1;iRow++)  
  {  
  for(iCol=0;iCol<=m_iNumCols-1;iCol++)  
  {  
  index[0]   =   iRow;  
  index[1]   =   iCol;  
  printf("iRow   =   %d,iCol=%d\n",iRow,iCol);  
  _variant_t   varfieldvalue   =   pRst->GetFields()->GetItem(_variant_t((long)iCol))->GetValue();  
  saRet.PutElement(index,&varfieldvalue   );  
  }  
  pRst->MoveNext();  
  }  
  rg.put_Value2(COleVariant(saRet));  
  saRet.Detach();  
  }  
  pRst->Close();  
  pConn->Close();  
  app->put_DisplayAlerts(0,VARIANT_FALSE);  
  _variant_t   varfilename("c:\\aaa.xls");  
  book->SaveAs(varfilename,covOptional,covOptional,covOptional,covOptional,covOptional,xlNoChange);  
  VARIANT_BOOL   var;  
  app->Wait(_variant_t((short)20),0,&var);  
  book->put_Saved(0,VARIANT_TRUE);  
  app->Quit();  
  }  
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
  CoInitialize(NULL);  
  try  
  {  
  ExportRsToExcel();  
  }  
  catch(_com_error   &e)  
  {  
  _bstr_t   bstrSource(e.Source());  
  _bstr_t   bstrDescription(e.Description());  
  printf("\nCOM   error   occurred,   Source   :   %s   \n   Description   :   %s   \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);  
  }  
  CoUninitialize();  
  return   0;  
  }  
   
  Top

2 楼Skt32(荒城之月)回复于 2003-10-03 12:13:42 得分 0

针对Excel表格文件操作的编程实现  
  http://vchelp.net/vchelp/file2003_2/excelaccess.asp?type_id=50&class_id=1&cata_id=10&article_id=1004&search_term=Top

3 楼Skt32(荒城之月)回复于 2003-10-03 12:14:49 得分 0

针对Excel表格文件操作的编程实现  
   
  编译:徐景周  
   
  下载代码    
   
     
   
  简介  
   
                通过本文及配套示例源码你可以更加灵活的控制Excel表格文件,其中包括创建新Excel文件、写入表格数据、读取表格数据(包括对原建Excel文件自已手工添加的行、列数据的准确读取),删除已有Excel表格,对表格中指定行、列、单元格进行查询、插入、替换等操作,同时还可以将生成的Excel文件转换为按指定分隔符分隔的其它文本格式的文件。下面是把此方法用VC6编写的示例程序运行效果:  
   
     
   
   
   
   
  基本思路  
   
                基础实现方法同上篇文章<直接通过ODBC读、写Excel表格文件>相同,都是通过ODBC来把Excel表格文件当成数据库文件来进行读、写等操作,所以在Excel表格文件中写入的行头名必须是唯一的(不要重名,相当于数据库中的ID值)。本文中对Excel文件的操作都被封装进一个类CSpreadSheet中,通过它我们可以非常简便的实现各种Excel表格数据操作,并且可以对该类进行扩充来满足自己的需求。  
   
     
   
  具体实现  
   
  包含Excel文件操作类头文件  
   
  #include   "CSpreadSheet.h"  
   
     
   
  新建Excel文件,并写入默认数据  
   
  //   新建Excel文件名及路径,TestSheet为内部表名  
   
                CSpreadSheet   SS("c:\\Test.xls",   "TestSheet");  
   
     
   
                CStringArray   sampleArray,   testRow;  
   
                 
   
                SS.BeginTransaction();  
   
                 
   
                //   加入标题  
   
                sampleArray.RemoveAll();  
   
                sampleArray.Add("姓名");  
   
                sampleArray.Add("年龄");  
   
                SS.AddHeaders(sampleArray);  
   
                 
   
                //   加入数据  
   
                CString   strName[]   =   {"徐景周","徐志慧","郭徽","牛英俊","朱小鹏"};  
   
                CString   strAge[]     =   {"27","23","28","27","26"};  
   
                for(int   i   =   0;   i   <   sizeof(strName)/sizeof(CString);   i++)  
   
                {  
   
                              sampleArray.RemoveAll();  
   
                              sampleArray.Add(strName[i]);  
   
                              sampleArray.Add(strAge[i]);  
   
                              SS.AddRow(sampleArray);  
   
                }  
   
                 
   
                SS.Commit();  
   
     
   
  读取Excel文件数据  
   
  CSpreadSheet   SS("c:\\Test.xls",   "TestSheet");  
   
     
   
                CStringArray   Rows,   Column;  
   
     
   
                //清空列表框  
   
                m_AccessList.ResetContent();  
   
                for   (int   i   =   1;   i   <=   SS.GetTotalRows();   i++)  
   
                {  
   
                              //   读取一行  
   
                              SS.ReadRow(Rows,   i);  
   
                              CString   strContents   =   "";  
   
                              for   (int   j   =   1;   j   <=   Rows.GetSize();   j++)  
   
                              {  
   
                                            if(j   ==   1)  
   
                                                          strContents   =   Rows.GetAt(j-1);  
   
                                            else  
   
                                                          strContents   =   strContents   +     "   -->   "   +   Rows.GetAt(j-1);  
   
                              }  
   
     
   
                              m_AccessList.AddString(strContents);  
   
                }  
   
     
   
  对已存在Excel表格数据进行添加、插入、替换操作  
   
  //   初始化测试行数据,进行添加、插入及替换数据操作演示  
   
                for   (int   k   =   1;   k   <=   2;   k++)  
   
                {  
   
                              testRow.Add("Test");  
   
                }  
   
                 
   
                SS.AddRow(testRow);                                               //   添加到尾部  
   
                SS.AddRow(testRow,   2);                                         //   插入新行到第二行  
   
                SS.AddRow(testRow,   6,   true);                         //   替换原第四行来新的内容  
   
                SS.AddCell(“徐景周”,   1,2);                   //   添加(不存在)或替换(存在)第二行,第一列单元格内容  
   
     
   
                SS.Commit();    
   
                 
   
     
   
  对已存在Excel表格数据进行行、列、单元格查询  
   
  void   CExcelAccessDlg::OnQuery()    
   
  {  
   
                CSpreadSheet   SS("c:\\Test.xls",   "TestSheet");  
   
     
   
                CStringArray   Rows,   Column;  
   
                CString   tempString   =   "";  
   
     
   
                UpdateData();  
   
     
   
                if(m_strRow   ==   ""   &&   m_strColumn   ==   "")                   //   查询为空  
   
                {  
   
                              AfxMessageBox("行号、列号不能同时为空!");  
   
                              return;  
   
                }          
   
                else   if(m_strRow   ==   ""   &&   m_strColumn   !=   "")         //   查询指定列数据  
   
                {  
   
                              int   iColumn   =   atoi(m_strColumn);  
   
                              int   iCols   =   SS.GetTotalColumns();  
   
                              if(iColumn   >   iCols)                                                                                       //   超出表范围查询时  
   
                              {  
   
                                            CString   str;  
   
                                            str.Format("表中总列数为:   %d,   ",   iCols);  
   
                                            AfxMessageBox(str   +   "   查询列数大于Excel表中总列数,请重新输入!");  
   
                                            return;  
   
                              }  
   
     
   
                              //   读取一列数据,并按行读出  
   
                              if(!SS.ReadColumn(Column,   iColumn))  
   
                              {  
   
                                            AfxMessageBox(SS.GetLastError());  
   
                                            return;  
   
                              }  
   
     
   
                              CString   tmpStr;  
   
                              for   (int   i   =   0;   i   <   Column.GetSize();   i++)  
   
                              {  
   
                                            tmpStr.Format("行号:   %d,   列号:   %d   ,内容:   %s\n",   i+1,iColumn,Column.GetAt(i));  
   
                                            tempString   +=   tmpStr;  
   
                              }  
   
                               
   
                              AfxMessageBox(tempString);  
   
                }  
   
                else   if(m_strRow   !=   ""   &&   m_strColumn   ==   "")           //   查询指定行数数据  
   
                {  
   
                              int   iRow   =   atoi(m_strRow);  
   
                              int   iRows   =   SS.GetTotalRows();  
   
                               
   
                              if(iRow   >   iRows)                                                                                           //   超出表范围查询时  
   
                              {  
   
                                            CString   str;  
   
                                            str.Format("表中总行数为:   %d,   ",   iRows);  
   
                                            AfxMessageBox(str   +   "   查询行数大于Excel表中总行数,请重新输入!");  
   
                                            return;  
   
                              }  
   
     
   
                              //   读取指定行数据  
   
                              if(!SS.ReadRow(Rows,   iRow))  
   
                              {  
   
                                            AfxMessageBox(SS.GetLastError());  
   
                                            return;  
   
                              }  
   
     
   
                              CString   tmpStr;  
   
                              for   (int   i   =   0;   i   <   Rows.GetSize();   i++)  
   
                              {  
   
                                            tmpStr.Format("行号:   %d,   列号:   %d   ,内容:   %s\n",   iRow,   i+1,   Rows.GetAt(i));  
   
                                            tempString   +=   tmpStr;  
   
                              }  
   
     
   
                              AfxMessageBox(tempString);  
   
                }  
  Top

4 楼Skt32(荒城之月)回复于 2003-10-03 12:14:55 得分 0

 
                else   if(m_strRow   !=   ""   &&   m_strColumn   !=   "")           //   查询指定单元格数据  
   
                {  
   
                              int   iRow   =   atoi(m_strRow),   iColumn   =   atoi(m_strColumn);  
   
                              int   iRows   =   SS.GetTotalRows(),   iCols   =   SS.GetTotalColumns();    
   
                               
   
                              if(iColumn   >   iCols)                                                     //   超出表范围查询时  
   
                              {  
   
                                            CString   str;  
   
                                            str.Format("表中总列数为:   %d,   ",   iCols);  
   
                                            AfxMessageBox(str   +   "   查询列数大于Excel表中总列数,请重新输入!");  
   
                                            return;  
   
                              }  
   
                              else   if(iRow   >   iRows)  
   
                              {  
   
                                            CString   str;  
   
                                            str.Format("表中总行数为:   %d,   ",   iRows);  
   
                                            AfxMessageBox(str   +   "   查询行数大于Excel表中总行数,请重新输入!");  
   
                                            return;  
   
                              }  
   
     
   
                              //   读取指定行、列单元格数据  
   
                              if(!SS.ReadCell(tempString,   iColumn,   iRow))  
   
                              {  
   
                                            AfxMessageBox(SS.GetLastError());  
   
                                            return;  
   
                              }  
   
     
   
                              CString   str;  
   
                              str.Format("行号:   %d,   列号:   %d   ,内容:   %s",   iRow,iColumn,tempString);  
   
                              AfxMessageBox(str);  
   
                }  
   
                 
   
  }  
   
     
   
  将存在的Excel转换另存为指定分隔的文本文件  
   
  SS.Convert(";");                         //   将原Excel文件转换为用分号分隔的文本,并另存为同名文本文件  
   
     
   
  删除Excel中表格  
   
  SS.   DeleteSheet();                         //   删除Excel文件中所有表格  
   
  SS.   DeleteSheet("   TestSheet   ");     //   删除Excel中TextSheet表格  
   
     
   
  获取Excel中总行数、总列数、当前行  
   
  int   iCols   =   SS.GetTotalColumns();       //   总列数  
   
  int   iRows   =   SS.GetTotalRows();         //   总行数  
   
  int   iCurRow   =   SS.GetCurrentRow();   //   当前所在行号  
   
     
   
  获取行头数据  
   
  CStringArray   rowHeader;  
   
  SS.GetFieldNames(rowHeader);  
   
  CString   tmpStr;  
   
                for   (int   i   =   0;   i   <   rowHeader.GetSize();   i++)  
   
                {  
   
                              tmpStr.Format("行号:   %d,   列号:   %d   ,内容:   %s\n",   1,   i+1,   rowHeader.GetAt(i));  
   
                              tempString   +=   tmpStr;  
   
                }  
   
                AfxMessageBox(tempString);  
   
     
   
  最后,如果想知道详细实现细节的话,可以在下载示例源码后,仔细查看源码既可(内有详细注释)。  
   
     
   
  参考文献:  
   
  直接通过ODBC读、写Excel表格文件   –   徐景周(译)  
   
  A   Class   to   Read   and   Write   to   Excel   and   Text   Delimited   Spreadsheet   –   Yap   Chun   Wei  
   
     
  http://vchelp.net/vchelp/file2003_2/excelaccess.zip  
  Top

相关问题

  • 高分求救!!!Excel 转换例子
  • SQL数据库转换excel问题,急!!!
  • DTS问题(SQL与EXCEL之间转换)
  • 从Excel转换到SQL Server的问题
  • 您好,请问 excel 表 怎样转换为sql server2000 中的表?
  • 把SQL Server中的表转换成Excel表
  • 关于EXCEL与SQL SERVER字段类型的转换问题
  • 求,从Excel导入SQL,数据类型转换出错,求助!!!
  • 【分享】SQL SERVER 与ACCESS、EXCEL的数据转换
  • excel文件转换到SQL SERVER时,数据乱了的问题.

关键词

  • 表格
  • excel
  • 文件
  • 数据
  • 查询
  • 转换
  • saret
  • prst
  • irows
  • inumcols

得分解答快速导航

  • 帖主:crazyCSDNx

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo