通过COM取excel中行数。

harry330 2008-08-20 03:03:23
如题,如果获取行数。在线等。
...全文
137 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
harry330 2008-08-20
  • 打赏
  • 举报
回复
多谢了。问题解决了。开始我的代码是正确的。只是由于少了m_range.AttachDispatch(m_sheet.GetCells());
lake_cx 2008-08-20
  • 打赏
  • 举报
回复
int GetExcelRowCount(LPCOLESTR lpszFileName)
{
CLSID clsid;
LCID lcid = GetThreadLocale();
IDispatch *dispApp, *dispWorkbooks, *dispWorkbook, *dispSheet, *dispUsedRange, *dispRows;
LPOLESTR dispName;
DISPID dispID = 0, dispidNamed = 0;
DISPPARAMS dispParams = { 0 };
VARIANT vResult = { 0 }, vValue = { 0 };
CLSIDFromProgID(L"Excel.Application", &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID *)&dispApp);

//App.Visible = TRUE
/*
dispName = L"Visible";
dispApp->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
dispidNamed = DISPID_PROPERTYPUT;
vValue.vt = VT_BOOL;
vValue.boolVal = TRUE;
dispParams.cArgs = 1;
dispParams.rgvarg = &vValue;
dispParams.cNamedArgs = 1;
dispParams.rgdispidNamedArgs = &dispidNamed;
dispApp->Invoke(dispID, IID_NULL, lcid, DISPATCH_PROPERTYPUT, &dispParams, &vResult, NULL, NULL);
*/

//Workbooks = App.Workbooks
dispName = L"Workbooks";
dispApp->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
dispParams.cArgs = 0;
dispParams.rgvarg = NULL;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;
dispApp->Invoke(dispID, IID_NULL, lcid, DISPATCH_PROPERTYGET, &dispParams, &vResult, NULL, NULL);
dispWorkbooks = vResult.pdispVal;
dispApp->Release();

//Workbook = Workbooks.Open(lpszFileName);
dispName = L"Open";
dispWorkbooks->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
vValue.vt = VT_BSTR;
vValue.bstrVal = SysAllocString(lpszFileName);
dispParams.cArgs = 1;
dispParams.rgvarg = &vValue;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;
dispWorkbooks->Invoke(dispID, IID_NULL, lcid, DISPATCH_METHOD, &dispParams, &vResult, NULL, NULL);
SysFreeString(vValue.bstrVal);
dispWorkbook = vResult.pdispVal;
dispWorkbooks->Release();

//Sheet = Workbook.ActiveSheet
dispName = L"ActiveSheet";
dispWorkbook->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
dispParams.cArgs = 0;
dispParams.rgvarg = NULL;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;
dispWorkbook->Invoke(dispID, IID_NULL, lcid, DISPATCH_PROPERTYGET, &dispParams, &vResult, NULL, NULL);
dispSheet = vResult.pdispVal;
dispWorkbook->Release();

//UsedRange = Sheet.UsedRange
dispName = L"UsedRange";
dispSheet->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
dispParams.cArgs = 0;
dispParams.rgvarg = NULL;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;
dispSheet->Invoke(dispID, IID_NULL, lcid, DISPATCH_PROPERTYGET, &dispParams, &vResult, NULL, NULL);
dispUsedRange = vResult.pdispVal;
dispSheet->Release();

//Rows = UsedRange.Rows
dispName = L"Rows";
dispUsedRange->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
dispParams.cArgs = 0;
dispParams.rgvarg = NULL;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;
dispUsedRange->Invoke(dispID, IID_NULL, lcid, DISPATCH_PROPERTYGET, &dispParams, &vResult, NULL, NULL);
dispRows = vResult.pdispVal;
dispUsedRange->Release();

//return Rows.Count
dispName = L"Count";
dispRows->GetIDsOfNames(IID_NULL, &dispName, 1, lcid, &dispID);
dispParams.cArgs = 0;
dispParams.rgvarg = NULL;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;
dispRows->Invoke(dispID, IID_NULL, lcid, DISPATCH_PROPERTYGET, &dispParams, &vResult, NULL, NULL);
dispRows->Release();
return vResult.intVal;
}
harry330 2008-08-20
  • 打赏
  • 举报
回复
跟我上面有什么区别啊?一样啊。
maomaoxiong 2008-08-20
  • 打赏
  • 举报
回复
利用Range类中的GetCount()方法获取Excel中的行数,下面的代码供参考:

_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;


if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
exit(1);
}
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
char charDirectory[100];
GetCurrentDirectory(100,charDirectory);
CString strTemplateFile(charDirectory);
strTemplateFile = strTemplateFile + "\\MyTest.xls";

wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strTemplateFile)));
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);

rgMyRge.AttachDispatch(wsMysheet.GetUsedRange());
rgMyRge = rgMyRge.GetRows();
CString str;

str.Format("%d",rgMyRge.GetCount());
MessageBox(str);

代码中的rgMyRge.GetCount()),得到当前Excel的行数
harry330 2008-08-20
  • 打赏
  • 举报
回复
有如下代码,可是返回值不对,每次都是相同值,删除N行还是如此。
Range range;
range.AttachDispatch(m_sheet.GetUsedRange());

range = range.GetRows();

return (range.GetCount())

且上边的VBA形式怎么翻成vc形式。
菜牛 2008-08-20
  • 打赏
  • 举报
回复
ActiveSheet.UsedRange.Rows.Count
内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧