我正在使用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Úparun 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功能正常工作吗?
答案 0 :(得分:1)
这只是权利/许可问题。如果您将Excel本身用作最终用户,它将显示一个说明此
的对话框您无权在此位置保存。联系 管理员获得许可。你想保存吗? 而不是文件夹?
但是,如果您以管理员身份运行Excel,它可以正常工作,或可以工作,因为,至少它适用于我。
但请注意,从编程方面来说,它确实报告错误的名称如CB7A7C80(它是在场景后面使用的临时文件)而不是原始文件(腐败只发生在您的开头和结尾)串)。我也重现了这个有趣的名字。