MFC中读取Excel中sheet的数量和名称

乖灬小狐 2014-08-27 04:59:49
运行了以下的程序之后,在debug中sheet的名称始终是Sheet1,数目总是1,和我的Excel文件不符。

CApplication app; //Excel程序
CWorkbooks books; //工作簿集合
CWorkbook book; //工作表
CWorksheets sheets; //工作簿集合
CWorksheet sheet; //工作表集合
CRange range; //使用区域
LPDISPATCH lpDisp;
CString sheetname;

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

if(!app.CreateDispatch(_T("Excel.Application"))) //创建IDispatch接口对象
{
MessageBox(_T("Error!"));
return;
}

books.AttachDispatch(app.get_Workbooks());
lpDisp = books.Open(strFilePath,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional,covOptional);
book.AttachDispatch(lpDisp);
sheets.AttachDispatch(book.get_Worksheets());
sheet.AttachDispatch(lpDisp);

long sheetsum = sheets.get_Count();
for(int i=1;i<=sheetsum;i++)
{
sheet.AttachDispatch(sheets.get_Item(COleVariant((long)i)));
sheetname = sheet.get_Name();
……
}
...全文
736 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
乖灬小狐 2014-09-01
  • 打赏
  • 举报
回复
引用 7 楼 jianwen0529 的回复:
[quote=引用 6 楼 qq_17425895 的回复:] 和我Excel是2013版本有关系么?
也许,因为各个版本对应的函数是可能不一样的,用法上有些许区别。 每个版本都需要对应的版本的接口。[/quote] 都是保存为*.xls的,也会有版本问题嘛?
幻夢之葉 2014-08-29
  • 打赏
  • 举报
回复
引用 6 楼 qq_17425895 的回复:
和我Excel是2013版本有关系么?
也许,因为各个版本对应的函数是可能不一样的,用法上有些许区别。 每个版本都需要对应的版本的接口。
乖灬小狐 2014-08-29
  • 打赏
  • 举报
回复
和我Excel是2013版本有关系么?
乖灬小狐 2014-08-29
  • 打赏
  • 举报
回复
引用 3 楼 jianwen0529 的回复:

long sheetsum = sheets.get_Count();
for(int i=1;i<=sheetsum;i++)
{
    sheet.AttachDispatch(sheets.get_Item(COleVariant((long)i)));
    sheetname = sheet.get_Name();
    ……
}
就这段看起来是没有问题的。 sheets.AttachDispatch(book.get_Worksheets()); 改为 sheets = book.get_Worksheets(); 试试
试过了……还是不行……
乖灬小狐 2014-08-29
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
Sheets 集合对象 请参阅 属性 方法 事件 特性 Application Workbooks (Workbook) Sheets 指定工作簿或当前活动工作簿中所有工作表的集合。Sheets 集合可包含 Chart 对象或 Worksheet 对象。 如果希望返回所有类型的工作表,Sheets 集合就非常有用。如果仅需使用某一类型的工作表,请参阅该工作表类型的对象主题。 Sheets 集合对象的的用法 可用 Sheets 属性返回 Sheets 集合。下例打印当前活动工作簿上的所有工作表。 Sheets.PrintOut 可用 Add 方法新建工作表并将其添加到集合中。下例向当前活动工作簿添加了两个图表工作表,并将其置于工作簿中的工作表二之后。 Sheets.Add type:=xlChart, count:=2, after:=Sheets(2) 可用 Sheets(index) 返回单个 Chart 对象或 Worksheet 对象,其中 index 为工作表名称或编号。下例激活工作表 Sheet1。 Sheets("sheet1").Activate 可用 Sheets(array) 指定多个工作表。下例将工作表“Sheet4”和“Sheet5”移到工作簿的前部。 Sheets(Array("Sheet4", "Sheet5")).Move before:=Sheets(1)
我程序运行到一半 打开Excel显示里面只有一个 叫sheet1,和我打开方式是不是有关系?
幻夢之葉 2014-08-27
  • 打赏
  • 举报
回复

long sheetsum = sheets.get_Count();
for(int i=1;i<=sheetsum;i++)
{
    sheet.AttachDispatch(sheets.get_Item(COleVariant((long)i)));
    sheetname = sheet.get_Name();
    ……
}
就这段看起来是没有问题的。 sheets.AttachDispatch(book.get_Worksheets()); 改为 sheets = book.get_Worksheets(); 试试
赵4老师 2014-08-27
  • 打赏
  • 举报
回复
Sheets 集合对象 请参阅 属性 方法 事件 特性 Application Workbooks (Workbook) Sheets 指定工作簿或当前活动工作簿中所有工作表的集合。Sheets 集合可包含 Chart 对象或 Worksheet 对象。 如果希望返回所有类型的工作表,Sheets 集合就非常有用。如果仅需使用某一类型的工作表,请参阅该工作表类型的对象主题。 Sheets 集合对象的的用法 可用 Sheets 属性返回 Sheets 集合。下例打印当前活动工作簿上的所有工作表。 Sheets.PrintOut 可用 Add 方法新建工作表并将其添加到集合中。下例向当前活动工作簿添加了两个图表工作表,并将其置于工作簿中的工作表二之后。 Sheets.Add type:=xlChart, count:=2, after:=Sheets(2) 可用 Sheets(index) 返回单个 Chart 对象或 Worksheet 对象,其中 index 为工作表名称或编号。下例激活工作表 Sheet1。 Sheets("sheet1").Activate 可用 Sheets(array) 指定多个工作表。下例将工作表“Sheet4”和“Sheet5”移到工作簿的前部。 Sheets(Array("Sheet4", "Sheet5")).Move before:=Sheets(1)
赵4老师 2014-08-27
  • 打赏
  • 举报
回复
学习VBA for Excel联机帮助中相关内容。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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