如何把SQL转换成EXCEL,大家帮帮忙,给个例子最好!
如何把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




