为date设置Excel NumberFormat忽略本地C ++中的区域设置

我从本地C ++使用Excel COM自动化。 我的目标是设置date范围的NumberFormat。 问题是,Excel预期的格式string取决于用户的区域设置。

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

我发现很多.NET的解决scheme,不幸的是我没有那么奢侈。 通常的解决scheme是将Excel线程的语言环境临时设置为英文,但对于本地C ++来说似乎不可能。

我可以读取默认的系统语言环境,然后硬编码不同的格式string,但是一旦有人使用我没有明确包含的语言环境,就不会工作,所以这是一个不好的解决scheme。

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

一种可能的解决scheme是使用系统时间格式化程序(如:_tcsftime,strftime,wcsftime)将date/时间结构格式化为正在运行的系统的语言环境。 既然你的程序和excel预计在同一台PC上运行,它应该可以在不知道本地date/时间string是什么样子的情况下正常工作。

作为后退解决scheme,您可能必须在程序的option-configuration部分中提供一系列硬编码的格式string和/或用户手动input的string,以防默认的语言环境格式失败。

在OP的第一个回复评论之后的附加信息:————–

语言环境设置仅影响UI中的date时间二进制对象的文本显示呈现。 这样的date时间二进制对象总是以一种非常一致的方式存储为二进制结构,即使在每个不同的上下文中,无论是区域设置,在Excel(date/时间格式单元格),C ++(各种结构都依赖于api) ,VisualBasic(变体)。

因此,如果您的目的是将date时间二进制结构导出为ex​​cel,而不是strng,则可以使用“variant”types来存储date值,因为excel-automation使用IDispatch接口。 您可以完全忘记区域设置。

添加代码片段以导出date时间变体并通过代码格式化单元格:—————-

我使用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...");