VC中如何获得excel文件中的sheet表名?

时间:2021-11-02 09:31:03
rt,还有下面这个问题,一并谢谢了!!
http://topic.csdn.net/u/20080702/22/0043e632-2602-45db-9bb7-64e9af3a0856.html?seed=656438849&t=fi77kqph

7 个解决方案

#1


VC+Excel2K!   
  在程序中打开一Excel文件,初始化时,取得该Excel的所有表名,如有三个表   
  sheet1,sheet2,sheet3!,把它显示在CListBox中!   
  当用户点CListBox中的表,则在CListCtrl中显示给表内容,即选择sheet1,则在CListCtrl中显示sheet1的内容。   
    
  现在的问题是:当打开Excel时,显示表名后,用户不选择CListBox中的内容,直接退出程序,则系统中的Excel进程结束,如用户选择了CListBox中的表,显示内容后在退出,则Excel进程不能一起结束??   
  //代码如下:   
  _Application     m_Application;   
  Workbooks           m_Books;   
  _Workbook           m_Book;   
  Worksheets         m_Sheets;//全局变量   
    
  void   CRollDlg::Init_Excel()//显示Excel文件所有的表名   
  {   
  COleVariant   VOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);   
    
  m_Application.CreateDispatch("Excel.Application");//创建一个Excel服务程序   
    
  m_Books.AttachDispatch(m_Application.GetWorkbooks(),TRUE);//工作薄   
  m_Book.AttachDispatch(m_Books.Open(m_strPath,//Excel文件                         
                                  VOptional,   VOptional,   VOptional,   VOptional,   
                                  VOptional,   VOptional,   VOptional,   VOptional,   
                                  VOptional,   VOptional,   VOptional,   VOptional),TRUE);   
    
  m_Sheets.AttachDispatch(m_Book.GetSheets(),TRUE);   
    
  _Worksheet         sheet;   
  for(int   i=0;i<m_Sheets.GetCount();i++)   
  {   
  sheet=m_Sheets.GetItem(COleVariant((long)(i+1)));   
  m_ListSheet.AddString(sheet.GetName());//取得该Excel文件所有表名   
  }   
  sheet.ReleaseDispatch();   
  }   
  //程序退出时释放   
  void   CRollDlg::OnClose()     
  {   
  m_Sheets.ReleaseDispatch();   
  m_Book.ReleaseDispatch();   
  m_Books.Close();   
  m_Books.ReleaseDispatch();   
  m_Application.ReleaseDispatch();   
  m_Application.Quit();   
  CDialog::OnClose();   
  }   
  //显示某一个表的所有内容   
  void   CRollDlg::Show_Excel(int   nSheet)   
  {   
  _Worksheet     sheet;   
  Range               Range;   
  _variant_t     var;     
  CString           tmpStr;   
    
  sheet=m_Sheets.GetItem(COleVariant(long(nSheet)));   
  Range.AttachDispatch(sheet.GetCells(),TRUE);   
    
  long   nRow=GetExcel_Rows(nSheet);   
  m_ListContext.DeleteAllItems();   
  m_ListContext.SetRedraw(FALSE);   
    
  AfxGetApp()->BeginWaitCursor();   
  for(int   i=4;i<nRow+4;i++)   
  {   
  int   nCur=m_ListContext.GetItemCount();   
  tmpStr.Format("%d",nCur+1);   
  m_ListContext.InsertItem(nCur,tmpStr);   
  for(int   j=2;j<11;j++)   
  {   
  var=Range.GetItem(_variant_t(long(i)),_variant_t((long)j));   
  tmpStr=(BSTR)var.pbstrVal;   
  tmpStr.TrimLeft();   
  tmpStr.TrimRight();   
  m_ListContext.SetItemText(nCur,j-1,(_bstr_t)var);   
  }   
  }   
  m_ListContext.SetRedraw(TRUE);   
  m_ListContext.Invalidate();   
  Range.ReleaseDispatch();   
  sheet.ReleaseDispatch();   
  AfxGetApp()->EndWaitCursor();   
  }   
  //显示某一个表有多行!   
  long   CRollDlg::GetExcel_Rows(int   nSheet)   
  {   
  _Worksheet   sheet;   
  Range             Range;   
  sheet=m_Sheets.GetItem(COleVariant((long)nSheet));//取得当前工作表   
  Range.AttachDispatch(sheet.GetUsedRange(),TRUE);   
  Range.AttachDispatch(Range.GetRows(),TRUE);   
  long     nRows=Range.GetCount();   
  Range.ReleaseDispatch();   
  sheet.ReleaseDispatch();   
  return   nRows;   
  }

http://www.tcfco.cn/tech/2007119/J11914640.shtml

#2


好的,我试试
呵呵,顺便帮我看看我上面的那个帖子,谢谢了!!

#3


for(long sheet_page = 1; sheet_page < Excel_Sheets.GetCount(); sheet_page++)
{
  _Worksheet sheet;
  sheet.AttachDispatch(Excel_sheets.GetItem(_variant_t(sheet_page)));
  CString sname = sheet.GetName();
}

#4


Range range;
range.AttachDispatch(Excel_sheet.GetRange(_variant_t("A1"),_variant_t("A1")));
val = range.GetValue();
switch(val.vt)
{
  case(VT_BSTR)://字符串
  {
    CString str = val.bstrVal;
    break;
  }
  case(VT_R8)://数字
  {
    double dblVal = val.dblVal;
    break;
  }
  case(VT_CY)://货币
  {
    CY cyVal = val.cyVal;
    break;
  }
  case(VT_DATE)://日期
  {
    SYSTEMTIME systime;
    VariantTimeToSystemTime(val.date,&systime);
    break;
  }
  default://空
  {
   break;
  }
}
*/

#5


to:wqvbjhc

_Application     m_Application;   
  Workbooks           m_Books;   
  _Workbook           m_Book;   
  Worksheets         m_Sheets;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
需要哪个头文件呀?好像直接编译不能过啊
to:zgl7903
_Worksheet及Range类也存在这个问题,有什么头文件呀?

#6


zgl7903,你获得SHEET名的方法很好,可是我只知道excel文件的路径,无法打开它呀
我是用http://www.vckbase.com/document/viewdoc/?id=693的方法打开excel的

#7


kankan

#1


VC+Excel2K!   
  在程序中打开一Excel文件,初始化时,取得该Excel的所有表名,如有三个表   
  sheet1,sheet2,sheet3!,把它显示在CListBox中!   
  当用户点CListBox中的表,则在CListCtrl中显示给表内容,即选择sheet1,则在CListCtrl中显示sheet1的内容。   
    
  现在的问题是:当打开Excel时,显示表名后,用户不选择CListBox中的内容,直接退出程序,则系统中的Excel进程结束,如用户选择了CListBox中的表,显示内容后在退出,则Excel进程不能一起结束??   
  //代码如下:   
  _Application     m_Application;   
  Workbooks           m_Books;   
  _Workbook           m_Book;   
  Worksheets         m_Sheets;//全局变量   
    
  void   CRollDlg::Init_Excel()//显示Excel文件所有的表名   
  {   
  COleVariant   VOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);   
    
  m_Application.CreateDispatch("Excel.Application");//创建一个Excel服务程序   
    
  m_Books.AttachDispatch(m_Application.GetWorkbooks(),TRUE);//工作薄   
  m_Book.AttachDispatch(m_Books.Open(m_strPath,//Excel文件                         
                                  VOptional,   VOptional,   VOptional,   VOptional,   
                                  VOptional,   VOptional,   VOptional,   VOptional,   
                                  VOptional,   VOptional,   VOptional,   VOptional),TRUE);   
    
  m_Sheets.AttachDispatch(m_Book.GetSheets(),TRUE);   
    
  _Worksheet         sheet;   
  for(int   i=0;i<m_Sheets.GetCount();i++)   
  {   
  sheet=m_Sheets.GetItem(COleVariant((long)(i+1)));   
  m_ListSheet.AddString(sheet.GetName());//取得该Excel文件所有表名   
  }   
  sheet.ReleaseDispatch();   
  }   
  //程序退出时释放   
  void   CRollDlg::OnClose()     
  {   
  m_Sheets.ReleaseDispatch();   
  m_Book.ReleaseDispatch();   
  m_Books.Close();   
  m_Books.ReleaseDispatch();   
  m_Application.ReleaseDispatch();   
  m_Application.Quit();   
  CDialog::OnClose();   
  }   
  //显示某一个表的所有内容   
  void   CRollDlg::Show_Excel(int   nSheet)   
  {   
  _Worksheet     sheet;   
  Range               Range;   
  _variant_t     var;     
  CString           tmpStr;   
    
  sheet=m_Sheets.GetItem(COleVariant(long(nSheet)));   
  Range.AttachDispatch(sheet.GetCells(),TRUE);   
    
  long   nRow=GetExcel_Rows(nSheet);   
  m_ListContext.DeleteAllItems();   
  m_ListContext.SetRedraw(FALSE);   
    
  AfxGetApp()->BeginWaitCursor();   
  for(int   i=4;i<nRow+4;i++)   
  {   
  int   nCur=m_ListContext.GetItemCount();   
  tmpStr.Format("%d",nCur+1);   
  m_ListContext.InsertItem(nCur,tmpStr);   
  for(int   j=2;j<11;j++)   
  {   
  var=Range.GetItem(_variant_t(long(i)),_variant_t((long)j));   
  tmpStr=(BSTR)var.pbstrVal;   
  tmpStr.TrimLeft();   
  tmpStr.TrimRight();   
  m_ListContext.SetItemText(nCur,j-1,(_bstr_t)var);   
  }   
  }   
  m_ListContext.SetRedraw(TRUE);   
  m_ListContext.Invalidate();   
  Range.ReleaseDispatch();   
  sheet.ReleaseDispatch();   
  AfxGetApp()->EndWaitCursor();   
  }   
  //显示某一个表有多行!   
  long   CRollDlg::GetExcel_Rows(int   nSheet)   
  {   
  _Worksheet   sheet;   
  Range             Range;   
  sheet=m_Sheets.GetItem(COleVariant((long)nSheet));//取得当前工作表   
  Range.AttachDispatch(sheet.GetUsedRange(),TRUE);   
  Range.AttachDispatch(Range.GetRows(),TRUE);   
  long     nRows=Range.GetCount();   
  Range.ReleaseDispatch();   
  sheet.ReleaseDispatch();   
  return   nRows;   
  }

http://www.tcfco.cn/tech/2007119/J11914640.shtml

#2


好的,我试试
呵呵,顺便帮我看看我上面的那个帖子,谢谢了!!

#3


for(long sheet_page = 1; sheet_page < Excel_Sheets.GetCount(); sheet_page++)
{
  _Worksheet sheet;
  sheet.AttachDispatch(Excel_sheets.GetItem(_variant_t(sheet_page)));
  CString sname = sheet.GetName();
}

#4


Range range;
range.AttachDispatch(Excel_sheet.GetRange(_variant_t("A1"),_variant_t("A1")));
val = range.GetValue();
switch(val.vt)
{
  case(VT_BSTR)://字符串
  {
    CString str = val.bstrVal;
    break;
  }
  case(VT_R8)://数字
  {
    double dblVal = val.dblVal;
    break;
  }
  case(VT_CY)://货币
  {
    CY cyVal = val.cyVal;
    break;
  }
  case(VT_DATE)://日期
  {
    SYSTEMTIME systime;
    VariantTimeToSystemTime(val.date,&systime);
    break;
  }
  default://空
  {
   break;
  }
}
*/

#5


to:wqvbjhc

_Application     m_Application;   
  Workbooks           m_Books;   
  _Workbook           m_Book;   
  Worksheets         m_Sheets;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
需要哪个头文件呀?好像直接编译不能过啊
to:zgl7903
_Worksheet及Range类也存在这个问题,有什么头文件呀?

#6


zgl7903,你获得SHEET名的方法很好,可是我只知道excel文件的路径,无法打开它呀
我是用http://www.vckbase.com/document/viewdoc/?id=693的方法打开excel的

#7


kankan