我正在使用本机C ++中的Excel COM自动化。我的目标是设置日期范围的NumberFormat。问题是,Excel期望的格式字符串取决于用户的语言环境。
实施例: 如果语言环境是英语我必须将NumberFormat设置为“dd.mm.yyyy” 如果语言环境是德语,我需要使用“TT.MM.JJJJ”来获得相同的结果。
我找到了很多针对.NET的解决方案,遗憾的是我没有那么奢侈。通常的解决方案是暂时将Excel线程的语言环境设置为英语,但使用本机C ++似乎不可能。
我可以读取默认的系统区域设置,然后硬编码不同的格式字符串,但是如果有人使用的语言环境没有明确包含,这将无法正常工作,所以这是一个糟糕的解决方案。
那么,我如何解决这个问题,以便无论使用哪个语言环境都能正常工作?
答案 0 :(得分:2)
一种可能的解决方案是使用系统时间格式化程序(如:_tcsftime,strftime,wcsftime)将日期/时间结构格式化为正在运行的系统的语言环境。由于你的程序和excel都应该在同一台PC上运行,它应该可以正常工作,甚至不知道本地日期/时间字符串是什么样的。
作为后备解决方案,您可能必须在程序的选项配置部分提供一系列硬编码格式字符串和/或用户手动输入的字符串,以防默认区域设置格式失败。
来自OP的第一个回复评论后的附加信息:--------------
语言环境设置仅影响UI中datetime-binary-object的文本显示表示。这样的datetime-binary-object总是以一种非常一致的方式存储为二进制结构,即使在每个不同的上下文中也是如此,无论是Excel(日期/时间格式单元格),C ++(各种结构取决于api) ,VisualBasic(Variant)。
因此,如果您打算将datetime二进制结构导出为excel而不是strng,则可以使用“variant”类型来存储日期值,因为excel-automation使用IDispatch接口。您完全可以忘记语言环境设置。
添加代码片段以导出datetime变量并按代码格式化单元格:----------------
我正在使用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...");