mfc自动化excel的问题,急求解决!!!! vResult = range.GetValue() 改为vResult = range.GetValue2()试试? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 试了没这函数,函数没错,只是比以前多了参数了。你说的是SetValue,现在改叫SetValue2了, 我现在用的是EXCEL2003 + VS2003GetValue2() 或 get_Value2()是确实可用的,下面是代码片断 CApplication app; CWorkbook workBook; CWorkbooks workBooks; CWorksheet workSheet; CWorksheets workSheets; CRange range; CRange rge; CString szXlsFile = m_szAppPath + "\\tape_spec.xls"; if(!app.CreateDispatch("Excel.Application")) { MessageBox("无法启动Excel服务器!"); return; } COleVariant avar((long)DISP_E_PARAMNOTFOUND, VT_ERROR); app.put_Visible(FALSE); app.put_UserControl(FALSE); app.put_DisplayAlerts(FALSE); //不要报警啊 workBooks.AttachDispatch(app.get_Workbooks()); try { workBook.AttachDispatch(workBooks.Open(szXlsFile, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar)); workSheets.AttachDispatch(workBook.get_Worksheets()); long count = workSheets.get_Count(); CDlgSheetSel dlgSheetSel; dlgSheetSel.Create(IDD_SHEET_ITEM); long Index; dlgSheetSel.m_lpID = &Index; for(long i = 0; i < count; i++) { workSheet.AttachDispatch(workSheets.get_Item(COleVariant(i + 1))); dlgSheetSel.m_ListBox.InsertString(i, workSheet.get_Name()); } dlgSheetSel.ShowWindow(SW_SHOW); if(dlgSheetSel.RunModalLoop() == IDOK) {//开始更新尺寸规格了 workSheet.AttachDispatch(workSheets.get_Item(COleVariant(Index + 1))); range.AttachDispatch(workSheet.get_Cells()); rge.AttachDispatch(range.get_Item(COleVariant(TAPE_SPEC_XLS_VER_ROW), COleVariant(TAPE_SPEC_XLS_VER_COL)).pdispVal, true); CString str = rge.get_Value2().bstrVal; if(str.Find(TAPE_SPEC_XLS_VER) == 0xFFFFFFFF) { str.Format("当前sheet版本%s,\n需求版本%s。\n要继续读取吗?", str, TAPE_SPEC_XLS_VER); if(MessageBox(str, "文件版本错误:", MB_YESNO | MB_ICONQUESTION) == IDNO) { rge.ReleaseDispatch(); goto ExitLine; } } rge.AttachDispatch(range.get_Item(COleVariant(SPEC_LSL_ROW), COleVariant(SPEC_LSL_COL)).pdispVal, true); m_W_LSL = (float)rge.get_Value2().dblVal; rge.AttachDispatch(range.get_Item(COleVariant(SPEC_LSL_ROW + 1), COleVariant(SPEC_LSL_COL)).pdispVal, true); m_D_LSL = (float)rge.get_Value2().dblVal; 我是excel2003 + vc6.0, 我现在还给用6.0呀,我希望有6.0的解决办法,不过还是非常感谢你给出具体代码,改成GetValue2() 会有一堆连接错误TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: void __thiscall _Application::Quit(void)" (?Quit@_Application@@QAEXXZ)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: void __thiscall _Workbook::SetSaved(int)" (?SetSaved@_Workbook@@QAEXH@Z)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct tagVARIANT __thiscall Range::GetValue2(void)" (?GetValue2@Range@@QAE?AUtagVARIANT@@XZ)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall _Worksheet::GetRange(struct tagVARIANT const &,struct tagVARIANT const &)" (?GetRange@_Worksheet@@QAEPAUIDispatch@@ABUtagVARIANT@@0@Z)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall Worksheets::GetItem(struct tagVARIANT const &)" (?GetItem@Worksheets@@QAEPAUIDispatch@@ABUtagVARIANT@@@Z)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall _Workbook::GetSheets(void)" (?GetSheets@_Workbook@@QAEPAUIDispatch@@XZ)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall Workbooks::Open(char const *,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &)" (?Open@Workbooks@@QAEPAUIDispatch@@PBDABUtagVARIANT@@1111111111111@Z)TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall _Application::GetWorkbooks(void)" (?GetWorkbooks@_Application@@QAEPAUIDispatch@@XZ)Debug/TestExcel01.exe : fatal error LNK1120: 8 unresolved externals执行 link.exe 时出错.TestExcel01.exe - 1 error(s), 0 warning(s) vResult = range.GetValue() 改为vResult = range.GetValue2()试试? 我用VC6.0也试了下,编译使用都没问题啊。下面是excel.h中的声明部分,类向导生成的哦VC6的IDE很弱智的,向导是不是出了啥错误?另外EXCEL类型库是否为11.0版?你如果手工加入这个函数声明及实现能行不?//excel.h/////////////////////////////////////////////////////////////////////////////// Range wrapper classclass Range : public COleDispatchDriver{public: Range() {} // Calls COleDispatchDriver default constructor Range(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {} Range(const Range& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}// Attributespublic:// Operationspublic: LPDISPATCH GetApplication(); long GetCreator(); LPDISPATCH GetParent(); VARIANT Activate(); VARIANT GetAddIndent(); //......略 VARIANT GetValue(const VARIANT& RangeValueDataType); void SetValue(const VARIANT& RangeValueDataType, const VARIANT& newValue); VARIANT GetValue2(); //这个函数是存在的 void SetValue2(const VARIANT& newValue); //......略//excel.cppVARIANT Range::GetValue2(){ VARIANT result; InvokeHelper(0x56c, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL); return result;} 非常非常谢谢你,重做了一次问题解决了,用GetValue2(), 果然是VC6的IDE很弱智的,向导出了错误 多谢。看到这个贴子,居然解决了另外一个问题::设置setValue2的值。 关于GetNextItem()获取列表行数的问题 IOCP问题,十几二十分钟后为什么会没有反应 未来的程序员会是车间装配工吗? 怎样确定窗口的大小?以及出现位置? 关于程序托盘问题? 我想做一个类似OUTLOOK的软件界面,但不知怎么做?大家说说,给点相关资料/代码! 分数可以再加 花费你不到半分钟时间来回答这个ATL的初级问题。 关于Delete的困惑! 回调函数能否是一个类的成员函数? vc可以处理excel表格么? 为什么我的app类的基类成了CWinAppEx sql2000 存储过程解密不完整。
你说的是SetValue,现在改叫SetValue2了,
GetValue2() 或 get_Value2()是确实可用的,下面是代码片断 CApplication app;
CWorkbook workBook;
CWorkbooks workBooks;
CWorksheet workSheet;
CWorksheets workSheets;
CRange range;
CRange rge;
CString szXlsFile = m_szAppPath + "\\tape_spec.xls";
if(!app.CreateDispatch("Excel.Application"))
{
MessageBox("无法启动Excel服务器!");
return;
}
COleVariant avar((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
app.put_Visible(FALSE);
app.put_UserControl(FALSE);
app.put_DisplayAlerts(FALSE); //不要报警啊
workBooks.AttachDispatch(app.get_Workbooks());
try
{
workBook.AttachDispatch(workBooks.Open(szXlsFile, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar, avar));
workSheets.AttachDispatch(workBook.get_Worksheets());
long count = workSheets.get_Count();
CDlgSheetSel dlgSheetSel;
dlgSheetSel.Create(IDD_SHEET_ITEM);
long Index;
dlgSheetSel.m_lpID = &Index;
for(long i = 0; i < count; i++)
{
workSheet.AttachDispatch(workSheets.get_Item(COleVariant(i + 1)));
dlgSheetSel.m_ListBox.InsertString(i, workSheet.get_Name());
}
dlgSheetSel.ShowWindow(SW_SHOW);
if(dlgSheetSel.RunModalLoop() == IDOK)
{//开始更新尺寸规格了
workSheet.AttachDispatch(workSheets.get_Item(COleVariant(Index + 1)));
range.AttachDispatch(workSheet.get_Cells());
rge.AttachDispatch(range.get_Item(COleVariant(TAPE_SPEC_XLS_VER_ROW), COleVariant(TAPE_SPEC_XLS_VER_COL)).pdispVal, true);
CString str = rge.get_Value2().bstrVal;
if(str.Find(TAPE_SPEC_XLS_VER) == 0xFFFFFFFF)
{
str.Format("当前sheet版本%s,\n需求版本%s。\n要继续读取吗?", str, TAPE_SPEC_XLS_VER);
if(MessageBox(str, "文件版本错误:", MB_YESNO | MB_ICONQUESTION) == IDNO)
{
rge.ReleaseDispatch();
goto ExitLine;
}
}
rge.AttachDispatch(range.get_Item(COleVariant(SPEC_LSL_ROW), COleVariant(SPEC_LSL_COL)).pdispVal, true);
m_W_LSL = (float)rge.get_Value2().dblVal;
rge.AttachDispatch(range.get_Item(COleVariant(SPEC_LSL_ROW + 1), COleVariant(SPEC_LSL_COL)).pdispVal, true);
m_D_LSL = (float)rge.get_Value2().dblVal;
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: void __thiscall _Application::Quit(void)" (?Quit@_Application@@QAEXXZ)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: void __thiscall _Workbook::SetSaved(int)" (?SetSaved@_Workbook@@QAEXH@Z)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct tagVARIANT __thiscall Range::GetValue2(void)" (?GetValue2@Range@@QAE?AUtagVARIANT@@XZ)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall _Worksheet::GetRange(struct tagVARIANT const &,struct tagVARIANT const &)" (?GetRange@_Worksheet@@QAEPAUIDispatch@@ABUtagVARIANT@@0@Z)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall Worksheets::GetItem(struct tagVARIANT const &)" (?GetItem@Worksheets@@QAEPAUIDispatch@@ABUtagVARIANT@@@Z)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall _Workbook::GetSheets(void)" (?GetSheets@_Workbook@@QAEPAUIDispatch@@XZ)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall Workbooks::Open(char const *,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARI
ANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &,struct tagVARIANT const &)" (
?Open@Workbooks@@QAEPAUIDispatch@@PBDABUtagVARIANT@@1111111111111@Z)
TestExcel01Dlg.obj : error LNK2001: unresolved external symbol "public: struct IDispatch * __thiscall _Application::GetWorkbooks(void)" (?GetWorkbooks@_Application@@QAEPAUIDispatch@@XZ)
Debug/TestExcel01.exe : fatal error LNK1120: 8 unresolved externals
执行 link.exe 时出错.TestExcel01.exe - 1 error(s), 0 warning(s)
改为
vResult = range.GetValue2()
试试?
下面是excel.h中的声明部分,类向导生成的哦
VC6的IDE很弱智的,向导是不是出了啥错误?另外EXCEL类型库是否为11.0版?
你如果手工加入这个函数声明及实现能行不?//excel.h
/////////////////////////////////////////////////////////////////////////////
// Range wrapper classclass Range : public COleDispatchDriver
{
public:
Range() {} // Calls COleDispatchDriver default constructor
Range(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
Range(const Range& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}// Attributes
public:// Operations
public:
LPDISPATCH GetApplication();
long GetCreator();
LPDISPATCH GetParent();
VARIANT Activate();
VARIANT GetAddIndent();
//......略
VARIANT GetValue(const VARIANT& RangeValueDataType);
void SetValue(const VARIANT& RangeValueDataType, const VARIANT& newValue);
VARIANT GetValue2(); //这个函数是存在的
void SetValue2(const VARIANT& newValue);
//......略//excel.cpp
VARIANT Range::GetValue2()
{
VARIANT result;
InvokeHelper(0x56c, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}