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();
}
{
_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;
}
}
*/
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类也存在这个问题,有什么头文件呀?
_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的
我是用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();
}
{
_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;
}
}
*/
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类也存在这个问题,有什么头文件呀?
_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的
我是用http://www.vckbase.com/document/viewdoc/?id=693的方法打开excel的
#7
kankan