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

解决方案 »

  1.   

    // 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;
    }
      

  2.   

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

  3.   

    针对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);       }
      

  4.   


           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