所以,我正在尝试使用Microsoft在其自动化示例中提供的Autowrap
函数从C ++和OLE自动化Excel。
我已经知道我可以从电子表格中的单元格中读取字符串值。但是,对于某些值来说,字符串似乎有问题,就像它没有以空值终止一样。这是我的代码:
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文件中显示时,它显示如下:
John Doe
(Excel文档的代码页可能会出现问题吗?它是xlsx
文件。)
答案 0 :(得分:4)
JohnDoeá,11
代码非常错误,需要修复。 结果变量不能是IDispatch,它必须是VARIANT
。您盲目地假设Range.Cell.Value属性返回一个字符串,这不是Excel的工作方式。
VT_BSTR
á
字符是一个简单的文本编码问题。美元到甜甜圈,你从控制台窗口复制了字符串。在西欧和美洲默认使用code page 437。该代码页中á的字符代码为0xA0。其中实际上 U + 00A0,Unicode中的non-breaking space,而不是现代文本中的异常代码点。
让它实际显示为控制台模式应用程序中的空间需要调用SetConsoleOutputCP()将其切换到CP_UTF8
并将控制台的字体从终端更改为类似Consolas的TrueType字体。在本网站的其他Q + A中有很好的涵盖。