2

因此,我正在尝试使用AutowrapMicrosoft 在其自动化示例中提供的功能从 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 文件中,在 Excel 中显示时,它显示如下:

John Doe

(Excel 文档的代码页会以某种方式成为问题吗?它是一个xlsx文件。)

4

1 回答 1

4

11 岁的约翰·多伊

代码有很多错误,需要修复。结果变量不能是 IDispatch,它必须VARIANT. 您盲目地假设 Range.Cell.Value 属性返回一个字符串,这不是 Excel 的工作方式。需要调用 VariantChangeType() 来强制转换VT_BSTR

á否则,该字符是一个简单的文本编码问题。美元到甜甜圈,您从控制台窗口复制了字符串。在西欧和美洲默认使用代码页 437 。该代码页中 á 的字符代码为 0xA0。这实际上是U+00A0,Unicode 中的不间断空格,而不是现代文本中不寻常的代码点。

让它在控制台模式应用程序中实际显示为空间需要调用 SetConsoleOutputCP() 将其切换到CP_UTF8并将控制台的字体从终端更改为像 Consolas 这样的 TrueType 字体。本网站的其他 Q+A 对此进行了很好的介绍。

于 2015-10-06T09:35:34.387 回答