2016-10-31 7 views
1

Я работаю с 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?

+1

У вас есть некоторые ужасные проблемы с повреждением памяти или кодированием, если он на самом деле говорит «½ C: \ CB7A7C80». Хм, трудно поверить, что это реально, отредактируйте свой вопрос, чтобы он начал иметь смысл. Вы, конечно же, не можете сэкономить на «C: \\ test.xls», корневой каталог диска C: не доступен для записи, если вы не запускаете свою программу повышенной. Никогда не указывайте имена путей в жестком коде, используйте файл конфигурации или попросите пользователя или примите аргумент командной строки. –

+1

Да, это просто проблема с правами, если вы используете Excel, он скажет следующее: «У вас нет разрешения на сохранение в этом месте. Свяжитесь с администратором для получения разрешения. Вы хотите сохранить в папке« Документы »вместо ?». Когда вы запустите Excel в качестве администратора, он будет работать нормально. Однако обратите внимание, что программно он действительно сообщает об ошибке с таким смешным именем, как CB7A7C80 (это временный файл, который он использует за сценой) вместо оригинального (повреждение только в начале и конце строки) –

+0

@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

ответ

1

Это просто проблема прав/разрешений. Если вы используете сам Excel как конечный пользователь, то появится диалоговое окно, в котором говорят, этот

You don’t have permission to save in this location. Contact the administrator to obtain permission. Would you like to save in the Documents folder instead?

Но, если вы запустите Excel в качестве администратора, он будет работать нормально, или это может работу, потому что, в Меньше, это работает для меня.

Обратите внимание, что программно он действительно сообщает об ошибке смешным именем, таким как CB7A7C80 (это временный файл, который он использует за сценой) вместо исходного (повреждение только в начале и конце строки) , Я тоже воспроизвожу это смешное имя.

Смежные вопросы