Excel interop C ++:工作簿SaveAs异常 - 代码0x800A03EC

时间:2016-10-31 13:40:49

标签: c++ excel

我正在使用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,我在Windows 10上使用Visual Studio 2015 Community Edition和Update 3。

当我尝试打开xlsx文件并读取值时,一切正常,但是当我尝试从头创建文件并保存它时,我的程序崩溃并抛出_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 nepeutaccüderaufichier½áC:\CB7A7C80á╗。 Plusieurs raisonssontaussás:

     

òLef du fichier ou le chemin d'accÞsnÆexistepas。 ò切蒂奇   estactuellementutilisÚp​​arun autre program。 òLeclasseur que   vousessayezdéenregistrerportelemÛmenomquùunlasseseur   eneellement ouvert。

用英语表示:

  

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

     

ò文件名或路径不存在。 ò此文件正由另一个应用程序使用   ò要保存的工作表与另一个打开的工作表具有相同的名称

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

我在Stackoverflow中看过相关问题,但我没有找到有用的答案。

此错误是否与我的字符串编码有关?你有一些提示让SaveAs功能正常工作吗?

1 个答案:

答案 0 :(得分:1)

这只是权利/许可问题。如果您将Excel本身用作最终用户,它将显示一个说明此

的对话框
  

您无权在此位置保存。联系   管理员获得许可。你想保存吗?   而不是文件夹?

但是,如果您以管理员身份运行Excel,它可以正常工作,或可以工作,因为,至少它适用于我。

但请注意,从编程方面来说,它确实报告错误的名称如CB7A7C80(它是在场景后面使用的临时文件)而不是原始文件(腐败只发生在您的开头和结尾)串)。我也重现了这个有趣的名字。