以下函数是将数据写入到EXCEL文件.可是只是个试例.我想将我的数据.逐行逐行写入
到EXCEL文件中.不知道如果改写下列代码.
里面的类型看了好晕啊.请指导.
void CTestDoc::OnExportExcel()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 初始化COM库
CoInitialize(NULL); // 获得EXCEL的CLSID
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); if(FAILED(hr)) {
AfxMessageBox(_T("CLSIDFromProgID() 函数调用失败!"));
return;
} // 创建实例
IDispatch *pXlApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
if(FAILED(hr)) {
AfxMessageBox(_T("请检查是否已经安装EXCEL!"));
return ;
}
// 显示,将Application.Visible属性置0
VARIANT x;
x.vt = VT_I4;
x.lVal = 0;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x); // 获取Workbooks集合
IDispatch *pXlBooks;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
pXlBooks = result.pdispVal;
}
// 调用Workbooks.Add()方法,创建一个新的Workbook
IDispatch *pXlBook;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
pXlBook = result.pdispVal;
}
// 创建一个15x15的数组,用于填充表格
VARIANT arr;
WCHAR szTmp[32];
arr.vt = VT_ARRAY | VT_VARIANT;
SAFEARRAYBOUND sab[2];
sab[0].lLbound = 1; sab[0].cElements = 15;
sab[1].lLbound = 1; sab[1].cElements = 15;
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab); // 初始化数组内容
for(int i=1; i<=15; i++) {
for(int j=1; j<=15; j++) {
VARIANT tmp;
tmp.vt = VT_BSTR;
wsprintfW(szTmp,L"%i,%i",i,j);
tmp.bstrVal = SysAllocString(szTmp);
// 添加数据到数组中
long indices[] = {i,j};
SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
}
}
// 从Application.ActiveSheet属性获得Worksheet对象
IDispatch *pXlSheet;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
pXlSheet = result.pdispVal;
} // 选择一个15x15大小的Range
IDispatch *pXlRange;
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = ::SysAllocString(L"A1:O15"); VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm); pXlRange = result.pdispVal;
} //AfxMessageBox(_T("我要填充数据了哈!")); // 用我们的数组填充这个Range
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
pXlRange->Release(); // 另外再选择一个Range
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = ::SysAllocString(L"A11:O25");
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm);
pXlRange = result.pdispVal;
}
//AfxMessageBox(_T( "我还要填充一次哈!")); // 用我们的数组再次填充这个Range
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);//AfxMessageBox(_T("好了,我们该保存文件了!")); // 接下来我们该保存文件了,利用Worksheet.SaveAs()方法(我这里忽略了其他所有参数,除了文件名)
{
VARIANT filename;
filename.vt = VT_BSTR;
CString strPath;
TCHAR szFull[_MAX_PATH];
TCHAR szDrive[_MAX_DRIVE];
TCHAR szDir[_MAX_DIR];
::GetModuleFileName(NULL, szFull, sizeof(szFull)/sizeof(TCHAR));
_tsplitpath(szFull, szDrive, szDir, NULL, NULL);
_tcscpy(szFull, szDrive);
_tcscat(szFull, szDir);
strPath = CString(szFull); strPath+="test.xls";
USES_CONVERSION; filename.bstrVal = SysAllocString(T2COLE(strPath));
AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L"SaveAs", 1, filename);
}// AfxMessageBox(_T( "哈哈,收工了!")); // 退出,调用Application.Quit()方法
AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
// 释放所有的接口以及变量
pXlRange->Release();
pXlSheet->Release();
pXlBook->Release();
pXlBooks->Release();
pXlApp->Release();
VariantClear(&arr);
// 注销COM库
CoUninitialize();
}
到EXCEL文件中.不知道如果改写下列代码.
里面的类型看了好晕啊.请指导.
void CTestDoc::OnExportExcel()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 初始化COM库
CoInitialize(NULL); // 获得EXCEL的CLSID
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); if(FAILED(hr)) {
AfxMessageBox(_T("CLSIDFromProgID() 函数调用失败!"));
return;
} // 创建实例
IDispatch *pXlApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
if(FAILED(hr)) {
AfxMessageBox(_T("请检查是否已经安装EXCEL!"));
return ;
}
// 显示,将Application.Visible属性置0
VARIANT x;
x.vt = VT_I4;
x.lVal = 0;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x); // 获取Workbooks集合
IDispatch *pXlBooks;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
pXlBooks = result.pdispVal;
}
// 调用Workbooks.Add()方法,创建一个新的Workbook
IDispatch *pXlBook;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
pXlBook = result.pdispVal;
}
// 创建一个15x15的数组,用于填充表格
VARIANT arr;
WCHAR szTmp[32];
arr.vt = VT_ARRAY | VT_VARIANT;
SAFEARRAYBOUND sab[2];
sab[0].lLbound = 1; sab[0].cElements = 15;
sab[1].lLbound = 1; sab[1].cElements = 15;
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab); // 初始化数组内容
for(int i=1; i<=15; i++) {
for(int j=1; j<=15; j++) {
VARIANT tmp;
tmp.vt = VT_BSTR;
wsprintfW(szTmp,L"%i,%i",i,j);
tmp.bstrVal = SysAllocString(szTmp);
// 添加数据到数组中
long indices[] = {i,j};
SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
}
}
// 从Application.ActiveSheet属性获得Worksheet对象
IDispatch *pXlSheet;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
pXlSheet = result.pdispVal;
} // 选择一个15x15大小的Range
IDispatch *pXlRange;
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = ::SysAllocString(L"A1:O15"); VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm); pXlRange = result.pdispVal;
} //AfxMessageBox(_T("我要填充数据了哈!")); // 用我们的数组填充这个Range
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
pXlRange->Release(); // 另外再选择一个Range
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = ::SysAllocString(L"A11:O25");
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm);
pXlRange = result.pdispVal;
}
//AfxMessageBox(_T( "我还要填充一次哈!")); // 用我们的数组再次填充这个Range
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);//AfxMessageBox(_T("好了,我们该保存文件了!")); // 接下来我们该保存文件了,利用Worksheet.SaveAs()方法(我这里忽略了其他所有参数,除了文件名)
{
VARIANT filename;
filename.vt = VT_BSTR;
CString strPath;
TCHAR szFull[_MAX_PATH];
TCHAR szDrive[_MAX_DRIVE];
TCHAR szDir[_MAX_DIR];
::GetModuleFileName(NULL, szFull, sizeof(szFull)/sizeof(TCHAR));
_tsplitpath(szFull, szDrive, szDir, NULL, NULL);
_tcscpy(szFull, szDrive);
_tcscat(szFull, szDir);
strPath = CString(szFull); strPath+="test.xls";
USES_CONVERSION; filename.bstrVal = SysAllocString(T2COLE(strPath));
AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L"SaveAs", 1, filename);
}// AfxMessageBox(_T( "哈哈,收工了!")); // 退出,调用Application.Quit()方法
AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
// 释放所有的接口以及变量
pXlRange->Release();
pXlSheet->Release();
pXlBook->Release();
pXlBooks->Release();
pXlApp->Release();
VariantClear(&arr);
// 注销COM库
CoUninitialize();
}
如何处理??
还有如何输出到WORD。
能否给个实例代码参考下。
多谢!
1 COM
2 ODBC
3 TEXT如果你对所操作的EXCEL文件没有格式和样式要求,也不是多SHEET的,那么建议你直接使用文本操作的方式,即按照每行由回车分割,每格由'\t'分割,最后将文件存成*.xls即可。
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0','Extended Properties=Excel 8.0;Data source=d:\2010分单明细.xls')...[测试]
select top 10 UserID, UserName, PassWord, EmployeeID, PassWordType, PassWordTerm, PassWordLeastLengh, convert(varchar(20),PWDLastUpdateTime,120), PhotoURL,
Status, LonginStatus, convert(varchar(20),LastLonginActive,120), SysFlag, UserType, convert(varchar(20),LastFlushTime,120), SessionID, LoginCode, LoginIp, RegTime, Reg_AipPower, UserPy, LastLonginIP
from users
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0','Extended Properties=Excel 8.0;Data source=d:\2010分单明细.xls')...[测试]
select top 10 UserID, UserName, PassWord, EmployeeID, PassWordType, PassWordTerm, PassWordLeastLengh, convert(varchar(20),PWDLastUpdateTime,120), PhotoURL,
Status, LonginStatus, convert(varchar(20),LastLonginActive,120), SysFlag, UserType, convert(varchar(20),LastFlushTime,120), SessionID, LoginCode, LoginIp, RegTime, Reg_AipPower, UserPy, LastLonginIP
from users