Excel互操作C ++:工作簿SaveAsexception – 代码0x800A03EC

我正在使用VBE6EXT和MSO从C ++应用程序导入/导出excel文件。 我使用下面的代码:

#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL" \ rename("RGB", "MSORGB") using namespace Office; #import "C:\Program Files (x86)\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" using namespace VBIDE; #import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE" rename( "DialogBox", "ExcelDialogBox" ) \ rename( "RGB", "ExcelRGB" ) \ rename( "CopyFile", "ExcelCopyFile" ) \ rename( "ReplaceText", "ExcelReplaceText" ) \ exclude( "IFont", "IPicture" ) no_dual_interfaces 

我已经安装了Office 2010,激活了最新的function,并且在Windows 10上使用Visual Studio 2015 Community Edition和Update 3。

当我尝试打开一个xlsx文件并读取值时,一切正常,但是当我尝试从头开始创build一个文件并保存它时,我的程序崩溃并抛出一个_com_error ,代码如下:

代码:

 Excel::_ApplicationPtr pApplication; HRESULT hr = CoInitialize(nullptr); if (FAILED(hr)) throw std::runtime_error("Impossible d'initialiser la librairie excel ! Code: " + std::to_string(hr)); if (FAILED(pApplication.CreateInstance("Excel.Application"))) throw std::runtime_error("CreateInstance failed ! (Office est pas installé?)"); pApplication->PutVisible(VARIANT_FALSE, 0); Excel::_WorkbookPtr pBook = pApplication->Workbooks->Add(Excel::xlWorksheet); if (pBook == nullptr) { pApplication->Quit(); throw std::runtime_error("Impossible de créer le workbook !"); } Excel::_WorksheetPtr pSheet = pApplication->ActiveSheet; if (pSheet == nullptr) { pBook->Close(VARIANT_FALSE); pApplication->Quit(); throw std::runtime_error("Impossible de créer le worksheet !"); } pSheet = pApplication->Worksheets->Add(); pSheet->Name = "Results"; pApplication->PutDisplayAlerts(LOCALE_USER_DEFAULT, VARIANT_FALSE); try { //always throws here pBook->SaveAs("C:\\test.xls", vtMissing, vtMissing, vtMissing, false, false, Excel::XlSaveAsAccessMode::xlShared, false, false, vtMissing, vtMissing, vtMissing); } catch (_com_error& comErr) { printComError(comErr); } pBook->Close(); pApplication->PutDisplayAlerts(LOCALE_USER_DEFAULT, VARIANT_TRUE); pApplication->Quit(); CoUninitialize(); 

函数printComError():

 static inline void printComError(const _com_error& e) { _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); AllocConsole(); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); // Print Com errors. std::cerr << "Error" << std::endl; std::cerr << "\tCode = " << e.Error() << std::endl; std::cerr << "\tCode meaning = " << e.ErrorMessage() << std::endl; std::cerr << "\tSource = " << bstrSource << std::endl; std::cerr << "\tDescription = " << bstrDescription << std::endl; } 

我已经添加了一个try / catch块,并且函数printComError(comErr)总是被调用,出现以下错误:

错误代码= -2146827284代码含义= 0975EB58来源= Microsoft Excel说明= Microsoft Excel中的代码错误代码:CB7A7C80á╗。 Plusieurs raisons sontpossiblesá:

òLe nom du fichier ou le chemin d'accÞsnÆexistepas。 ò更好的实施scheme。 Le classeur que vous essayezdÆenregistrerporte lemạmenom quiquun classeur instellement ouvert。

这意味着,在英语中:

错误代码= -2146827284代码含义= 0975EB58来源= Microsoft Excel说明= Microsoft Excel无法访问文件夹:\CB7A7C80á╗。 许多原因是可能的:

²文件名或path不存在。 ò该文件正在被另一个应用程序使用ò要保存的表单与另一个打开的表单名称相同

显然,错误-2146827284就像0x800A03EC这意味着NAME_NOT_FOUND,但它是一个新创build的文件,并不存在。 奇怪的是,错误报告文件名是'½áC:\CB7A7C80á╗',但SaveAs函数的第一个参数是“c:\\ test.xls”。

我已经在Stackoverflow中看到了相关的问题,但我没有find有用的答案。

这个错误与我的string的编码有关吗? 你有一些提示让SaveAs函数工作吗?

这只是一个权限/权限问题。 如果您使用Excel本身作为最终用户,它将显示一个对话框说这个

您无权保存此位置。 请联系pipe理员获取权限。 你想保存在文档文件夹吗?

但是,如果您以pipe理员身份运行Excel,则它可以正常工作,也可以工作,因为至less它对我有用。

但是请注意,在编程上,它确实用一个像CB7A7C80这样有趣的名字(这是它在场景中使用的临时文件)而不是原来的名字(这个错误只在string的开始和结尾处)报告错误。 我也重现那个有趣的名字。