如何把SQL转换成EXCEL,大家帮帮忙,给个例子最好! 如何把SQL转换成EXCEL,大家帮帮忙,给个例子最好! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 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;} 针对Excel表格文件操作的编程实现http://vchelp.net/vchelp/file2003_2/excelaccess.asp?type_id=50&class_id=1&cata_id=10&article_id=1004&search_term= 针对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); } 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 如何是分割窗口后显示对话框 已有两个不同语种的对话框资源(中文、英文),怎么在程序中动态切换显示相应语种的对话框? 小菜鸟问个关于dumpbin的问题,百思不得其解,郁闷 Tcp报文连续发送为何有错 请问我如何才能得到一个RecordSet里有几条record 大送分啦!!!! 困饶很久的问题:在不支持MFC的ATL中,怎么显示.JPG文件 ShellExecute的烦恼! 社区上有多少是技术转销售的 怎样把窗口的样式设成像Netterm等telnet软件那样? 急购 SetViewportExt(100,-100)是什么意思,参数为什么可以为负数?
//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;
}
http://vchelp.net/vchelp/file2003_2/excelaccess.asp?type_id=50&class_id=1&cata_id=10&article_id=1004&search_term=
基本思路 基础实现方法同上篇文章<直接通过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); }
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