0

我正在使用本机 C++ 中的 Excel COM 自动化。我的目标是设置日期范围的 NumberFormat 。问题是,Excel 期望的格式字符串取决于用户的语言环境。

示例:如果语言环境是英语,我必须将 NumberFormat 设置为“dd.mm.yyyy” 如果语言环境是德语,我需要使用“TT.MM.JJJJ”来获得相同的结果。

我找到了很多.NET 的解决方案,不幸的是我没有那么奢侈。通常的解决方案是将 Excel 线程的语言环境临时设置为英语,但对于本机 C++ 似乎不可能。

我可以读取默认的系统语言环境,然后对不同的格式字符串进行硬编码,但是一旦有人使用我没有明确包含的语言环境,这将不起作用,所以这是一个糟糕的解决方案。

那么,我该如何解决这个问题,以便无论使用哪种语言环境都能正常工作?

4

1 回答 1

2

一种可能的解决方案是使用系统时间格式化程序(如:_tcsftime、strftime、wcsftime)将日期/时间结构格式化为运行系统的区域设置。由于您的程序和 excel 都应该在同一台 PC 上运行,因此它应该可以正常工作,甚至不知道本地日期/时间字符串的样子。

作为一种备用解决方案,您可能必须在程序的选项配置部分提供一系列硬编码格式字符串和/或用户手动输入的字符串,以防默认语言环境格式失败。

OP首次回复评论后的其他信息:--------------

区域设置仅影响 UI 中 datetime-binary-object 的文本显示呈现。这样的日期时间二进制对象总是以非常一致的方式存储为二进制结构,无论区域设置如何,即使在其每个不同的上下文中,无论是在 Excel(日期/时间格式单元格),C++(各种结构取决于 api) ,VisualBasic(变体)。

因此,如果您的意图是将日期时间二进制结构导出到 excel,而不是作为字符串,则始终可以使用“变体”类型来存储日期值,因为 excel-automation 使用 IDispatch 接口。您可以完全忘记语言环境设置。

添加代码片段以导出日期时间变量并按代码格式化单元格:----------------

我使用的是MFC,所以代码很简单,你可能需要自己转换成winapi

_Application app;
if (!app.CreateDispatch("Excel.Application"))
{   AfxMessageBox("Cannot start Excel !");
    return;
}
app.SetVisible(TRUE);   
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Workbooks objbooks = app.GetWorkbooks();
_Workbook objbook = objbooks.Add(VOptional);
Worksheets objsheets = objbook.GetWorksheets();
_Worksheet objsheet = objsheets.GetItem(COleVariant((short)1));

// get current date time
COleDateTime timeCurrent = COleDateTime::GetCurrentTime();

// setting date values
Range range;
range = objsheet.GetRange(COleVariant("A2"), COleVariant("B3"));
range.SetValue(COleVariant(timeCurrent));
//  range.SetNumberFormat(COleVariant("dd/mm/yyyy"));
range.SetNumberFormat(COleVariant("dddd, mmmm dd, yyyy"));

AfxMessageBox("Done...");
于 2013-02-25T18:22:52.623 回答