请教如何读取 EXCEL 文件中的 Sheet Name (就是页名)?

Aizz 2006-03-16 12:23:38
条件:不用 _Application 对象。

注释: Sheet Name 指工作表的名字。
...全文
869 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aizz 2006-04-08
  • 打赏
  • 举报
回复
好吧,谢谢两位的指教和各位的捧场。
结帖了,虽然有点儿遗憾,呵呵。
Aizz 2006-04-02
  • 打赏
  • 举报
回复
谢谢楼上的帮忙。

期待指教,谢谢。
cai114 2006-03-30
  • 打赏
  • 举报
回复
帮你UP
Aizz 2006-03-28
  • 打赏
  • 举报
回复
又过了两天,再撑起来。

请各位指教,谢谢。
tian_su 2006-03-26
  • 打赏
  • 举报
回复
mark!!
Aizz 2006-03-26
  • 打赏
  • 举报
回复
两天了,来更新一下。

请各位有空指点一下,谢谢。
Aizz 2006-03-24
  • 打赏
  • 举报
回复
感谢楼上两位的回复,抱歉今天才回帖。

To Steven7:
我试过了你的方法,发现这个方法对不同的 Excel 文件有不确定性。测试的时候有些表的 Sheet Name 在 SYSTEM TABLE 中,有些放在 TABLE 中,而且某些表名格式是 'xxx$'(有两个单引号),而有些没有;还有些不是表名却和表名放在同一列中,比如 xxx$Filter_Name ,也许还有其他的情况我没有发现。
所以想请教一下,有没有一个比较通用的方法来得到?


To vcmute:
我也试过了你的方法,在我的机器上非常不错,速度也很好,不过测试时,我试了3台机器,两台正常,有一台出现某些 Excel 文件在 ReadMultiple 时失败,提示无效指针,让我很郁闷。原理上 IStorage 提供的信息是文件相关而不是系统相关的,出现不同机器和系统上结果不同让人很难理解...
所以还请指教,有没有解决办法?

请各位指点,谢谢。
vcmute 2006-03-20
  • 打赏
  • 举报
回复
HRESULT hr = S_OK;
IStorage *pStg = NULL;
IPropertySetStorage *pPropSetStg = NULL;
IPropertyStorage *pPropStg = NULL;
PROPVARIANT propvar;
PROPSPEC propspec;
hr = StgOpenStorageEx( szPath,
STGM_READ | STGM_SHARE_DENY_WRITE,
STGFMT_ANY,
0,
NULL,
NULL,
IID_IStorage,
reinterpret_cast<void**>(&pStg) );
if(FAILED(hr))goto quit;

hr = pStg->QueryInterface( IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) );
if(FAILED(hr))goto quit;

hr = pPropSetStg->Open( FMTID_DocSummaryInformation, STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg );
if(FAILED(hr))goto quit;

PropVariantInit( &propvar );
propspec.ulKind = PRSPEC_PROPID;
propspec.propid = 13;

hr = pPropStg->ReadMultiple( 1, &propspec, &propvar );
if(FAILED(hr))goto quit;

if( propvar.vt== VT_LPSTR | VT_VECTOR )
{
for(int i=0;i<propvar.calpstr.cElems;++i)
printf( " Name = %s", propvar.calpstr.pElems[i] );
}

quit://clean all
Steven7 2006-03-20
  • 打赏
  • 举报
回复
不用automation 可以操作 Excel 文件
用数据库连接方法ADO就可以自由灵活的访问

得到Excel文件的所有sheet页名称:
m_strConnection = "Driver={Microsoft Excel Driver (*.xls)};Dbq=";
m_strConnection+=FileDlg.GetPathName();
m_pRs=m_pConn->OpenSchema(adSchemaTables);
i=1;
while(VARIANT_FALSE==m_pRs->IsEOF)
{
strFieldValue=(char*)_bstr_t(m_pRs->GetCollect("TABLE_TYPE"));
if(strFieldValue=="TABLE")
{
if(m_pRs->GetCollect("TABLE_NAME").vt!=VT_NULL)
strFieldValue=(char*)_bstr_t(m_pRs->GetCollect("TABLE_NAME"));
else
strFieldValue="";
Snow_Ice11111 2006-03-20
  • 打赏
  • 举报
回复
用下面贴中太平洋朋友的代码试试,我也想知道结果:
http://community.csdn.net/Expert/topic/4595/4595043.xml?temp=.8913538
Aizz 2006-03-20
  • 打赏
  • 举报
回复
谢谢各位的关注,看来这个问题有些简单,高手都不愿意出手...

to Workbook:
不用 _Application 可以操作 Excel 文件。


各位前辈,出来透透气吧...
workbook 2006-03-19
  • 打赏
  • 举报
回复
调用Office是不是要用到COM方面的东西?
workbook 2006-03-17
  • 打赏
  • 举报
回复
关注!!
Aizz 2006-03-17
  • 打赏
  • 举报
回复
谢谢楼上的回复。

_WorksheetPtr 是怎么得到的?我想应该和 _Worksheet 一样是智能指针吧,可以不载入 Excel 进程吗?
Excel.OLB 是什么?我没用过,可以简单说明一下吗?

以我现在所知只有解析 .xls 文件一种方法,好像还不是非常可靠。各位如果知道请指教一下,谢谢。
TianChong 2006-03-17
  • 打赏
  • 举报
回复
支持一下,很少研究OFFICE
workbook 2006-03-17
  • 打赏
  • 举报
回复
难道不使用_Application也能操作Excel么?
Aizz 2006-03-17
  • 打赏
  • 举报
回复
自己撑起来...
tian_su 2006-03-16
  • 打赏
  • 举报
回复
得到所有sheet页的名字

Excel::_WorksheetPtr pSheet;
count = m_pWorkbook->Worksheets->Count;
for(i = 1; i <= count;i++)
{
pSheet = m_pWorkbook->Worksheets->Item[(long)i];
if(strSheetName == pSheet->Name)
{
pSheet->Activate();
break;
}
}
tian_su 2006-03-16
  • 打赏
  • 举报
回复
up,我也很想知道,,,

顺便问一下..

OFFICE 2003里已没有了EXCEL.OLB,,怎么办呢...
Aizz 2006-03-16
  • 打赏
  • 举报
回复
不用 _Application 是出于速度的原因, _Application 会打开 Excel 进程,在某些机器上,打开 Excel 速度会很慢。
看过很多的程序,里面都是直接指定 Sheet Name ,而没介绍过如何读取某个工作表的名字,所以希望哪位清楚,指点一下,谢谢。

16,548

社区成员

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

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

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