Я работаю с VBE6EXT и MSO для импорта/экспорта файлов excel из моего приложения на C++. Я использую следующий код:Excel interop C++: исключение из книги WorkAs Save - Code 0x800A03EC
#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
Я установил офис 2010, активизирован, до настоящего времени, и я использую Visual Studio 2015 Community Edition с обновлением 3 на Windows, 10.
Когда я попытке открыть файл 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/и функцию printComError(comErr)
всегда вызывается со следующей ошибкой:
Error Code = -2146827284 Code meaning = 0975EB58 Source = Microsoft Excel Description = Microsoft Excel ne peut accÚder au fichier ½áC:\CB7A7C80á╗. Plusieurs raisons sont possiblesá:
ò Le nom du fichier ou le chemin d'accÞs nÆexiste pas. ò Ce fichier est actuellement utilisÚ par un autre programme. ò Le classeur que vous essayez dÆenregistrer porte le mÛme nom quÆun classeur actuellement ouvert.
Wich средств, на английском языке:
Error Code = -2146827284 Code meaning = 0975EB58 Source = Microsoft Excel Description = Microsoft Excel can't access file ½áC:\CB7A7C80á╗. Many reasons are possibleá:
ò File name or path didn't exist. ò This file is in use by another application ò The sheet that you want to save has the same name that another opened sheet
По-видимому, ошибка -2146827284 похожа на 0x800A03EC, что означает NAME_NOT_FOUND, но ее только что созданный файл и не существует. Странно, что сообщение об ошибке указывает, что имя файла «½C: \ CB7A7C80», но первым параметром функции SaveAs является «c: \\ test.xls».
Я видел связанные вопросы в Stackoverflow, но я не нашел полезных ответов.
Эта ошибка связана с кодировкой моей строки? У вас есть какие-то намеки на то, чтобы получить функцию SaveAs?
У вас есть некоторые ужасные проблемы с повреждением памяти или кодированием, если он на самом деле говорит «½ C: \ CB7A7C80». Хм, трудно поверить, что это реально, отредактируйте свой вопрос, чтобы он начал иметь смысл. Вы, конечно же, не можете сэкономить на «C: \\ test.xls», корневой каталог диска C: не доступен для записи, если вы не запускаете свою программу повышенной. Никогда не указывайте имена путей в жестком коде, используйте файл конфигурации или попросите пользователя или примите аргумент командной строки. –
Да, это просто проблема с правами, если вы используете Excel, он скажет следующее: «У вас нет разрешения на сохранение в этом месте. Свяжитесь с администратором для получения разрешения. Вы хотите сохранить в папке« Документы »вместо ?». Когда вы запустите Excel в качестве администратора, он будет работать нормально. Однако обратите внимание, что программно он действительно сообщает об ошибке с таким смешным именем, как CB7A7C80 (это временный файл, который он использует за сценой) вместо оригинального (повреждение только в начале и конце строки) –
@SimonMourier: Вы правы, если я сохраню свой файл с помощью 'pBook-> SaveAs (" C: \\ Users \\ myuserprofile \\ Desktop \\ test.xls ", vtMissing, vtMissing, vtMissing, false, false, Excel :: XlSaveAsAccessMode :: xlShared, false, false, vtMissing, vtMissing, vtMissing);', он работает. Как предположил @HansPassant, корневой каталог диска C: не записывается, даже если у моего пользователя есть права администратора. Если вы сделаете ответ, я его приму. Для странного символа в имени файла temp я думаю, что это связано с моей функцией printComError() и моей локалью, Французский. – Ayak973