Итак, я пытаюсь автоматизировать Excel из C ++ и OLE, используя Autowrap
функция, предоставляемая Microsoft в их примерах автоматизации.
Я дошел до того, что могу прочитать строковое значение из ячейки в электронной таблице. Однако, похоже, что для некоторых значений что-то не так со строкой, как будто она не завершена нулем. Вот мой код:
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, range, L"Value", 0);
wprintf(L"%s, len: %d\n", result.bstrVal, SysStringLen(result.bstrVal));
wprintf(L"abc %s\n", SysAllocString(L"def"));
Выход:
John Doe á, 11
abc def
Принимая во внимание, что в файле Excel, когда отображается в Excel, он выглядит так:
John Doe
(Может ли кодовая страница документа Excel каким-то образом стать проблемой? xlsx
файл.)
Джон Доу, 11
Код довольно глючный и должен быть исправлен. результат переменная не может быть IDispatch, она должна быть VARIANT
, Вы слепо предполагаете, что свойство Range.Cell.Value возвращает строку, это не так, как работает Excel. Вызов VariantChangeType () для принудительного преобразования в VT_BSTR
необходимо.
á
символ — простая проблема кодирования текста. Доллары до пончиков, вы скопировали строку из окна консоли. Который использует кодовая страница 437 по умолчанию в Западной Европе и Америке. Код символа для á в этой кодовой странице — 0xA0. Который на самом деле U + 00A0, а неразрывный пробел в Unicode, не необычная кодовая точка в современном тексте.
Чтобы заставить его фактически отображаться как пробел в приложении в режиме консоли, необходимо вызвать SetConsoleOutputCP (), чтобы переключить его на CP_UTF8
и изменив шрифт консоли с терминала на шрифт TrueType, такой как Consolas. Хорошо освещено в других Q + A на этом сайте.
Других решений пока нет …